Excel VBA 質問スレ Part73
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ
ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ
※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured いつものあいつの釣りとあまりに馬鹿過ぎる質問はお断りです
また、Excelの使い方すらわからない人はお帰りください A列の全行のセルの値を配列に突っ込む時、オートフィルターが複数列でかかっていると、
表示されてるやつだけ配列に入ってしまうの、なんとかならない?
配列をA列に縦方向に貼り付ける時も、オートフィルターが既にかかってると、適切に元の行に貼り付け戻せない。
仕様なのかな 2万行あるから、なるべく最初にa列の内容を全部配列に入れてから、それぞれを操作して、
それからまた修正済みの配列の中身をa列に上書き貼り付けしたい。
でも、オートフィルターがかかっているとまずい。
複数列でオートフィルターがかかっているととても難しい 全解除して処理を行う、というのはできたけど、ユーザーのためにフィルタした状態ってのはそのままに戻したい。
フィルタしてる列が単体ならなんとかそれはできた。
だけど、複数列でフィルタした状態を、いったん全解除して、そんであとでまた元のフィルタ選択状態に戻すのが出来なさそうなのよね。 テーブルの見出しはvalueじゃ取り出せないんだな
勉強になったわ フィルタは全解除するのが一番手っ取り早い
横に伸ばすのは異常に難易度高い 列の増加が多いなら最初から大量にフィルタ列を用意シておいたほうが良い >>8
フィルタの条件って色々指定できる(色とか日付とか特定の文字列を含むとか)から、全部に対応しようとするとすごくめんどくさい
https://excel-ubara.com/vba_class/VBA_CLASS_08.html
割り切りとして「このマクロを使ったらフィルタは解除されますが情報は最新化されます」くらいにしとくのが無難かと コマンドボタンを押してユーザーフォームを開くときに、
TopとLeftの位置をセルC5のTopとLeftの位置に合わせるべく、
以下のようにコードを記述したのですがうまく合ってくれません。
※セルC5のLeftやTop位置より大分左や上に表示されてしまう。
何か記述的におかしいのでしょうか?
Sub UserFormOpenSet()
Dim varTop, varLeft
With Sheets("説明シート").Range("C5")
varTop = .Top
varLeft = .Left
End With
With UserForm
.Show
.Top = varTop
.Left = varLeft
.Label1.Caption = "コメント内容"
・
・
・
End With
End Sub >>15
UserForm top left セルの位置 でググったら
完璧なTipsがありました!
検索のヒントをありがとうございました! どーでも良い質問なんだが、VBAからエクセルのセルに値を入れるときの表現について
意見が割れてるので、みんながどー表現してるか知りたい
例えばVBAで A1セルに 123 という値を入れるとき、
A1セルに 123 を出力するという表現を使うか、A1セルに 123 を入力するという表現を使うか、どっち?
仕様書で人によって同じことしてるのに出力となってたり入力となってたりで色々バラバラすぎる >>17
VBAで計算や処理した結果をワークシートに保存するだけ、セルに値を入れて終わりの場合は出力
シートに値をセットしたあと、さらにその値を使って数式やグラフなどで別の処理や加工をする場合は入力 >>17
それは一律で入力じゃないのか
代入って言うぐらいだし
「出力」はエクセルがrangeのvalueを出力してるだけでは? VBAの関数、メソッドとしてそのデータが入力値なのか出力値なのかは明白なのでは? >>17
VBAがセルに出力
ユーザーがセルに入力 お知恵をお貸し下さい
String型の変数に文章を代入しています
その変数が「は」を助詞として使用しているかを検出し、その「は」が何文字目に記載されているかを抽出したいです
判定式はどの様に組むのが良いでしょうか 是非とも
「はははははは、ははのはははははははと笑う」で
挙動確認を行なって欲しい案件だな >>17
> A1セルに 123 を出力するという表現を使うか、A1セルに 123 を入力するという表現を使うか、どっち?
俺なら「A1セルに 123 を書き込む」かな
シートはストレージみたいなものなのと思ってるので出力とか入力って言うのはなんか違和感ある VBA側を主体に書いているなら(シートに)出力
シート側を主体にかいてるなら(VBAから)入力
だな
VBAの仕様書でVBA側を主体にしないのはどうかと思うが
(マクロ付き)エクセルの仕様書だと考えればまあ入力でもいいのかも 985なのですが、
ttps://whois.nic.ad.jp/cgi-bin/whois_gw?key=182.22.16.251
から
b. [ネットワーク名] YAHOO-NET
をVBAで抽出するいい方法はあるでしょうか? >>28
Sub ネットワーク名取得()
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://whois.nic.ad.jp/cgi-bin/whois_gw?key=182.22.16.251", False
.Send
For Each s In Split(.responseText, vbLf)
If InStr(s, "ネットワーク名") Then Debug.Print s
Next
End With
End Sub 一生使うことのなさそうなCreateObjectだな >>28
shift-jis の古いサーバーっぽい。
Ruby で作った
require 'open-uri'
require 'nokogiri'
url = "ここへURL"
doc = Nokogiri::HTML( open( url ) )
elements = doc.css( "pre" )
text = elements.first.content # 1つ目のpreの内容
result = "エラー! 該当なし"
text.each_line( chomp: true ) do | line | # 改行を除去して、各行を処理する
if line.start_with? "b. [ネットワーク名]" # 行頭が何々で始まっていれば
result = line
break
end
end
puts result
出力
b. [ネットワーク名] YAHOO-NET >>17
なるほど仕様書の問題か
ならば現場内で紛らわしくないような記載のルールを作ればいいかな。
例えばユーザーが手打ちで設定する場合は「入力」
VBAで書き込む場合は「出力」または「設定」
コード上では「取得」と「設定」とかに分かれるからあまり問題ないだろうけど、仕様書の記載はまた別のセンスが必要になるからね。
一見して分かりやすく曲解のない仕様書を作るときって日本語の難しさを痛感することあるよね。
そういう時は大まかな流れ図みたいなもの書いて添付して紛らわしさを回避するのも一つの手だよ。 質問への回答ありがとう
>>17の質問者です
個人的には「人が入力」、「VBAから出力」というとらえ方がしっくりきました
紛らわしくない書き方のルールを作るというのは本当にその通りで、
これは実践したい
日本語は改めて考えると主体が曖昧で難しい… >>37
日本語の文章ってのは、主語が存在しなくても成立する性質があるんだよ
おかげでどっち視点かわからなくなる現象が起きやすい
逆に英文法では主語がほぼ省略できない
だから単語を置き換えただけの翻訳は不自然な文章になる 質問させてください。
ウェブサイトから特定の場所の情報を抽出するのはこちらのVBAを使用するということで間違いないでしょうか?
またこれはExcelを購入することによって使用できるもので、WindowsでもMacでも使用できるのでしょうか?
現在Macを使用しておりまして、具体的に申し上げるとyahooファイナンスなどの個別銘柄ページから配当利回りなどの情報をまとめて抽出したいと考えております。
スレ違いでしたら申し訳ございませんが、検索してもよく分からなかったので、書き込み数が多いこちらで質問させていただきました。
よろしくお願い申し上げます。 俺が馬鹿なだけかもしれねぇけど何をしたいのかがさっぱり分からない スクレイピングしたいんだろ
そのデータをどう扱うかによるわな というかMAC版のEXCELってVBA使えるの?
あとスクレイピング用のコンポーネントも 他のツールでデータを集めて
結果をExcelにするのが良いよ
csvでもいいんじゃね? >>41
htmlから簡単なスクレイピングならPower Queryがとっつきやすいかと。
URLのリンク先がcsvやExcelファイル、pdfファイル、
GitHubにあるJSONなんかもこれで結構いける。
CSS構造や、
画面上で検索指定やボタンを押させるような対話型を必要とする
複雑なhtmlなら、Pythonとか。
その先の処理でVBAを組み合わせることはある。
クエリーエラーを避けるため、一つずつシーケンシャルに更新させたいとか、
同時にファイルをDLして保存したいとか。 >>41
chrome 拡張機能 スクレイピング
で検索すると良い
ちなみにyahooなんかはスクレイピング対策として、短時間で大量にアクセスすると一発で垢一時停止になるぞ
一番いいのはyahoo APIなどのAPIを使う事 MacのOfficeソフトとRubyには期待するなって
死んだばあちゃんが言ってた Macには無料で今流行りのPythonがついているそうなので
スクレイピンクはそっちの方が遥かに簡単じゃないかな
ExcelVBA経験がないのなら Rubyist は、たいていMac
スクレイピングは、Ruby, Selenium Webdriver, Nokogiri だけど、
無断で、大量のスクレイピングすると、営業妨害で逮捕される
スクレイピングする際、そのサイトのrobots.txt を遵守しないといけない。
取得したデータは、CSV, JSON、データベースなどに保存する
今は、どの本でも、無断でスクレイピングする事は推奨しないと書いてある。
相手のサイトと契約して、API を使わしてもらうべき!
YouTube API とか、Google Maps API とか、
株式相場などもそう >>41
なんでできもしないことやろうとすんのかね
検索してもわからないんじゃ無理だろ できないことをやらないと
いつまでたっても何もできないのだが、、、 見えないものを見ようとして望遠鏡を覗き込んだら捕まった事例 前の定義で移動できるセルを登録したいのですが、アプリケーションの定義エラーがでます。
範囲は101カ所登録したいのですが、どうやらstr*を3個くらい抜くと動くのですが、名前の定義に制限があるのでしょうか?
str*はどこを抜いても同じです。
Dim stra As String, strb As String, strc As String, strd As String, stre As String, strf As String, strg As String
stra = "=sh1!$H$3:$K$3,sh1!$N$3:$O$3,sh1!$R$3:$S$3," & _
"sh1!$E$6:$N$6,sh1!$O$6:$AC$6,sh1!$AD$6:$BG$6,sh1!$BH$6:$BR$6," & _
"sh1!$BS$6:$CG$6,sh1!$CH$6:$CQ$6,sh1!$CV$6:$DB$6,sh1!$DC$6:DR6," & _
"sh1!$DS$6:$EH$6,sh1!$EI$6:$ER$6,sh1!$ES$6:$FA$6,sh1!$FB$6:$FD$6," & _
"sh1!$FE$6:$FF$6,sh1!$FG$6:$FH$6," 続き
strb = "sh1!$E$7:$N$7,sh1!$O$7:$AC$7,sh1!$AD$7:$BG$7,sh1!$BH$7:$BR$7," & _
"sh1!$BS$7:$CG$7,sh1!$CH$7:$CQ$7,sh1!$CV$7:$DB$7,sh1!$DC$7:DR7," & _
"sh1!$DS$7:$EH$7,sh1!$EI$7:$ER$7,sh1!$ES$7:$FA$7,sh1!$FB$7:$FD$7," & _
"sh1!$FE$7:$FF$7,sh1!$FG$7:$FH$7,"
strc = "sh1!$E$8:$N$8,sh1!$O$8:$AC$8,sh1!$AD$8:$BG$8,sh1!$BH$8:$BR$8," & _
"sh1!$BS$8:$CG$8,sh1!$CH$8:$CQ$8,sh1!$CV$8:$DB$8,sh1!$DC$8:DR8," & _
"sh1!$DS$8:$EH$8,sh1!$EI$8:$ER$8,sh1!$ES$8:$FA$8,sh1!$FB$8:$FD$8," & _
"sh1!$FE$8:$FF$8,sh1!$FG$8:$FH$8,"
strd = "sh1!$E$9:$N$9,sh1!$O$9:$AC$9,sh1!$AD$9:$BG$9,sh1!$BH$9:$BR$9," & _
"sh1!$BS$9:$CG$9,sh1!$CH$9:$CQ$9,sh1!$CV$9:$DB$9,sh1!$DC$9:DR9," & _
"sh1!$DS$9:$EH$9,sh1!$EI$9:$ER$9,sh1!$ES$9:$FA$9,sh1!$FB$9:$FD$9," & _
"sh1!$FE$9:$FF$9,sh1!$FG$9:$FH$9,"
stre = "sh1!$E$10:$N$10,sh1!$O$10:$AC$10,sh1!$AD$10:$BG$10,sh1!$BH$10:$BR$10," & _
"sh1!$BS$10:$CG$10,sh1!$CH$10:$CQ$10,sh1!$CV$10:$DB$10,sh1!$DC$10:DR10," & _
"sh1!$DS$10:$EH$10,sh1!$EI$10:$ER$10,sh1!$ES$10:$FA$10,sh1!$FB$10:$FD$10," & _
"sh1!$FE$10:$FF$10,sh1!$FG$10:$FH$10," 続き
strf = "sh1!$E$11:$N$11,sh1!$O$11:$AC$11,sh1!$AD$11:$BG$11,sh1!$BH$11:$BR$11," & _
"sh1!$BS$11:$CG$11,sh1!$CH$11:$CQ$11,sh1!$CV$11:$DB$11,sh1!$DC$11:DR11," & _
"sh1!$DS$11:$EH$11,sh1!$EI$11:$ER$11,sh1!$ES$11:$FA$11,sh1!$FB$11:$FD$11," & _
"sh1!$FE$11:$FF$11,sh1!$FG$11:$FH$11,"
strg = "sh1!$E$12:$N$12,sh1!$O$12:$AC$12,sh1!$AD$12:$BG$12,sh1!$BH$12:$BR$12," & _
"sh1!$BS$12:$CG$12,sh1!$CH$12:$CQ$12,sh1!$CV$12:$DB$12,sh1!$DC$12:DR12," & _
"sh1!$DS$12:$EH$12,sh1!$EI$12:$ER$12,sh1!$ES$12:$FA$12,sh1!$FB$12:$FD$12," & _
"sh1!$FE$12:$FF$12,sh1!$FG$12:$FH$12"
ActiveWorkbook.Names.Add Name:="Nyuryoku2", RefersToLocal:=stra & strb & strc & strd & stre & strf & strg >>57
1274文字まで
質問のために加工したんでなければ、その範囲はもっとシンプルにまとめられるぞ
"=$H$3:$K$3,$N$3:$O$3,$R$3:$S$3,$E$6:$CQ$12,$CV$6:$FH$12" >>61
ありがとうございます。シート名を削除したら動きました >>62
横から失礼
RangeはUnionにすると実質文字制限がなくなる >>63
引数はRangeじゃなくてStringなんよ 名前定義ってRangeオブジェクトからでもできるのか 知らなかった
Range("B1:G10").Name = "Nyuuryoku2" 便利だけどExcelの名前の定義ウインドウは使いにくすぎる 名前の管理を簡単にする便利なアドインって誰か作ってないの?
(とおねだり) >>69
俺が思った通りに名前を定義してくれて、不要な名前は勝手に知らない間に削除してくれるとかかな
当然 >>57-59 ⇒ >>61 程度の変換は自動でやる ちょっとぐぐったけど
NamesコレクションをForEachで回してユーザーフォームにでも表示させれば作れそうだな Internet Explorer_Serverのハンドルから取得したIHTMLDocumentオブジェクトではそのページ内での操作はできましたが
Navigate実行時にメソッドをサポートしていないというエラーになります
別のURLへ移動する方法ありますか? >>75
たぶんメソッドの使い方が間違ってる
デバッグしてやるからコード晒してみ >>76
検証中のためハンドルも直接入力してますし
コードも他のサイトの転用したものだったりかなり端折ってますが
何か解りましたらよろしくお願いします
Private Declare PtrSafe Function CLSIDFromString Lib "ole32" (ByVal pString As LongPtr, ByRef pCLSID As Currency) As Long
Private Declare PtrSafe Function RegisterWindowMessageW Lib "user32" (ByVal lpString As LongPtr) As Long
Private Declare PtrSafe Function SendMessageTimeoutW Lib "user32" (ByVal hWnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByRef lParam As LongPtr, ByVal fuFlags As Long, ByVal uTimeout As Long, ByRef lpdwResult As Long) As LongPtr
Private Declare PtrSafe Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, ByRef riid As Currency, ByVal wParam As LongPtr, ppvObject As Any) As Long
Private Enum SMTO
NORMAL = 0
BLOCK = 1
ABORTIFHUNG = 2
NOTIMEOUTIFNOTHUNG = 8
End Enum
Sub test()
Dim hWnd As Long
hWnd = 136698
Set objDoc = GetHtmlDocument(hWnd)
'objDoc.Navigate ("https://www.google.co.jp/")
'Googleの検索窓に入力
objDoc.getElementsByName("q")(0).Value = "test"
End Sub 続き
Public Function GetHtmlDocument(ByVal hWnd_InternetExplorer_Server As LongPtr, Optional ByVal uTimeout As Long = 1000, Optional ByVal documentVersion As Integer = 1) As Object ' As MSHTML.IHTMLDocument
Set GetHtmlDocument = Nothing
If documentVersion <= 0 Then
documentVersion = 1
ElseIf documentVersion >= 8 Then
documentVersion = 8
End If
Dim IID_IHTMLDocumentX As String
IID_IHTMLDocumentX = Split(",{626FC520-A41E-11cf-A731-00A0C9082637},{332c4425-26cb-11d0-b483-00c04fd90119},{3050f485-98b5-11cf-bb82-00aa00bdce0b},{3050f69a-98b5-11cf-bb82-00aa00bdce0b},{3050f80c-98b5-11cf-bb82-00aa00bdce0b},{30510417-98b5-11cf-bb82-00aa00bdce0b},{305104b8-98b5-11cf-bb82-00aa00bdce0b},{305107d0-98b5-11cf-bb82-00aa00bdce0b}", ",")(documentVersion - 1)
Dim InterfaceId(1) As Currency
Call CLSIDFromString(StrPtr(IID_IHTMLDocumentX), InterfaceId(0))
Dim lngMsg As Long
lngMsg = RegisterWindowMessageW(StrPtr("WM_HTML_GETOBJECT"))
If lngMsg <> 0 Then
Dim lpdwResult As Long
If SendMessageTimeoutW(hWnd_InternetExplorer_Server, lngMsg, 0, 0, SMTO.ABORTIFHUNG, uTimeout, lpdwResult) <> 0 Then
Dim hResult As Long
hResult = ObjectFromLresult(lpdwResult, InterfaceId(0), 0, GetHtmlDocument)
If hResult <> 0 Then
Err.Raise hResult
End If
End If
End If
End Function gethtmldocumentにnavigateあるのか? navigateじゃなくてcreateDocumentFromUrlじゃないの?
知らんけど A1からA10000にデータが有って検索したい文字列があったとする。
この場合,範囲をdictionaryで調べるのと配列で調べるのは速度は同じぐらい?? >>82
データがセルに入ってるならワークシート関数使った方が速い 試しましたが、
コードはdictionaryのほうがすっきりした。
体感速度はあまり変わりませんでした。 かまってちゃんかよ
天気いいから散歩でもしてこいよ xxとyyどっちが早い、というのは本当に試した方が早い
バージョンアップで最適化されて、すげー早くなってる事がある >>87
別にかまってちゃんじゃなくて、回答に信頼性がないから自分で試したんだろう。誰かが信頼できそうな回答をくれたんだったら試さないと思うぞ。 ちゃんと結果まで書き込んでるんだから
質問だけしていなくなるやつもいる中で、優秀だと思うよ >>86
まずはありがとうございました、だろ
うぜー帰れ >>93
お前何代表者みたいな顔して怒ってんだよ、とチャチャを入れてみる(笑) >>98
スルー力、言うのは易し、行うのは難し、を指摘しているだけ。
もう一ついいか?
人の振りして我が振り直せ(笑) モジュールとボタンを別のブックにコピーしたくてできたと思ったんだけど
ボタンに登録されるマクロがコピー元のマクロになっちゃってとうすりゃええのか分からん
.OnAction=Thisbook&”マクロ名”とかじゃ動かないのね ボタンをインポート?
これも楽な方法があったらいいのにね シート上のフォームコントロールを消す時って
・右クリックで選択
・コンテキストメニューをESCで消す
・切り取り、もしくは「deleteキー」
で合ってますか?
選択する時はF5キーのオブジェクトでもいいんですけど、
どちらにしろ右クリックで選択というのが何か気持ち悪い >>101
sheetモジュールのマクロ?
それとも標準モジュールのマクロ?
どちらによるかでやり方が変わる Ctrl+クリック
Delete
でいいんじゃない >>107
短縮できました、ありがとうございました private subのどのプロシージャーからでも、グローバル変数に入った値を取り出す方法として、
たとえばenvという標準モジュールを作り、そのなかで
public dim grobal_a as string
sub hoge
global_a = "aaaa"
end sub
とやっておき、
エクセルのブック起動と同時にこの初期値を入れておきたいので
thisWorkbookにcall hoge
ってやるの、普通? >>110
シートに標準モジュールのやつを呼び出すSubを書いて、それをボタンから呼び出せばいい >>109
普通は grobal_a と global_a の二つを一つにまとめると思う >>109
vbaってグローバル変数の初期化できないのか・・・
見たことはない。変な気はする
とりあえずはシートに書くほうが楽だと思う
constでいいなら初期化が出来る。社名みたいにほぼ絶対変わらない物ならこれでもいいかも
Public Const 定数 = 1
sub foo
debug.print 定数
end sub
>>113
わらった >>109
普通か普通ではないか、と言われれば普通ではないかなぁ。
ではどこが、と言われるとまずモジュール変数をグローバル指定しているところはPrivateにして外部から呼び出す用のプロパティに組み込む。これでどこかで値が変更されてもブレイクポイント仕掛けてどこで呼び出されて値が変更されたかを確認出来るようになる。
あと、初期化用の関数はPublic指定にしておかないと別のモジュールから呼び出せないよ。ThisWorkbookから呼び出すんでしょ? 普通じゃなかったのか…俺もそうしてた
>>116
勉強になります 書籍「イヤンもう!最初からそう教えてくれればいいのに!ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本」の評判はどうですか?買うか検討中なのですが。 >>120
ゼッタイにわかる本系の口語調文章に抵抗がないラノベ好きには良いんじゃない? >>120
ゼッタイにわかる本系の口語調文章に抵抗がない人には良いんじゃない? >>120
人それぞれ印象が違うから、参考書は最初の2、3ページ立ち読みして自分で決めるのがいいよ イヤンもう
って言うから検索したら特にそんな単語ついてないじゃないですか 若い子が水着姿で教えるVBAの本なら簡単に死ぬほど売れるのでは?と思った VBAとか作業記録してそれループするなり可変したりするなりちょっと直せば誰でも作れるからな 「はたらくプログラミング 」
「高校生からはじめる プログラミング」
「メイクロックマン 史上最大のプログラミング」
「独学プログラマー Python言語の基本から仕事のやり方まで」
のようなアニメやゲームキャラやイケメンを
採用して若い子にアピールするとか
「乙女チック4Gamer」第267回:
「推しと学べるプログラミング」
初心者も学べるプログラミング学習ゲーム
とか
美少女×プログラミング学習×ソーシャルゲーム『コードガールこれくしょん』
とかゲームで呼び込み
恋のプログラミング~ダメ男の見分け方~ DVD-BOX2
のようなDVDを付録に付けてみたりとか
とかとにかくVBAもなんとか頑張って欲しい オレも1冊3000円くらいのVBAの本買ったわ
その本をキーボードの下奥に置くと角度が良い感じになるんだわ
手首が疲れないし、職場でもなんか「やってる」感がかもし出せるし、本当に買って良かったと思える1冊だったな >>132
ん。
昔、EXCELVBAゲーム大作戦とかいう本が出てたよ。まぁVBAも昔からあるからゲーム作るのも先駆者がいたんだね。
けど、結局難しいというか、お仕事で覚えることとベクトルが違うんだよ。1/60秒単位で押されているキーの値読み取って、キャラクターや地形描いてその当たり判定行なったりね。
まぁ暇でそういうの作ってみたいというのにはいいかもだけど、お仕事でVBA使うのの興味を持つために、というのにはちょっと重いかもね。 >>133
分かりすぎる
分厚い本って意外と重宝するよなw vbaでゲームは基本的にかなりめんどくさい
メインのループ処理がキツイ
定期的に処理をエクセルに返してあげないと色々と不具合が起きる
曲芸でなければvbaで作るのは絶対に避けたほうが良い 2つあるフレームの位置を調整していたら、
フレームAをフレームBの中にドラッグしてしまったらしく、
2つのフレームが一緒になってしまいました。
プロパティウィンドウを見ると、フレームAはまだ存在するのですが、
画面上にはフレームBしか表示されていないため、Aを選択することができず、
AをBから分離することができません。
AのLeftやTopを変更してみましたが、画面上に変化はありませんでした。
何かいい解決法があれば教えてください。 自己解決しました。
@プロパティウィンドウでプルダウンからフレームAを選択する。
ACtrl+[A]で全選択した後、Ctrl+[X]で切り取り状態にする。
BフレームBのエリア外にマウスカーソルを持っていき、Ctrl+[V]で貼り付ける。 せっかく解決策書いてくれてるのにイチャモンつけるバカって何を考えてるんだろ… 配列からグラフを書いたときってデータ数の上限はありますか?
その場合どのように対処すれば良いですか? >>145
上限を気にするようなデータ数だったら
excelでは重くて動かないと思う
別の言語で書いた方がいい >>145
その場合はデータをコンパクトにまとめるしかなくね >>145
数千個程度は描けたような記憶がある
そもそもそのレベルだと個々の値は見えないから複数個まとめて平均取るとかしてデータ量を減らせばいいかと >>145
セルに適当なデータいれてグラフ作ったら 9万9千9百+α までしか表示されなかった
メモリの問題かもしれん ごめんなさい
セルからではなく配列から直接グラフを読み込むときの話です。
自分の場合配列から散布図書いてて
データ数が15000?あたりから表示されなくなったので VBAで、リボンを常に表示させるてことできるんですか?
ググると
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
ていうのが出てくるんですが、
”タブとコマンドの表示”ていう状態にしたい。 If Application.CommandBars.GetPressedMso("MinimizeRibbon") = True Then
Application.CommandBars.ExecuteMso "MinimizeRibbon"
End If >>155
おおサンクスww
できた。
なんでリボンの表示・非表示の記事書いてるやつはここまで書かないのかね。 しっかりと自分で考える事が大事!向上心をもって勉強しよう! ひろゆきのクラスモジュールの説明は的確で分かりやすかった このスレにはクラスとかオブジェクト指向とかいうと、ファビョって「マウント取りに来たー!!」とか騒ぐじじいがいるから気をつけた方がいいぞ 5chはじじいの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。 エクセル詳しい方にご質問。
保護シートの「オートフィルター使用」にチェックつけてる状態で、
Range(Cells(1,1),Cells(1,5)).AutoFilterを実行すると保護解除しろと言われるのですが、原因わかりますか?
Rangeで指定しているセル範囲の保護を外しても言われる始末。
オートフィルターの使用を許可すりゃ通るもんだと思ってました。
見えない仕組みとか、基本的な仕様を見逃してるんかなぁ… とあるフォルダへのショートカットを作成する方法を調べたところ、
コーディング前に、
>参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
>これでWshShellクラスとWshShortcutクラスを利用できるようになります。
という記述がありました。
それで作れそうですが、
作った.xlsmファイルを他人に渡した場合、
その相手が上記の参照設定をしていない環境だったとしても、ショートカットの作成は行えますか? >>165
ご回答頂きありがとうございます。
こういう基本的な説明くらい最初から見とけって話でしたね。
しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。 >>167
オートフィルターON/OFFと同時にシートの保護/解除も書いてしまえばいいんでないの? >>166
自己解決しました。
参照設定を変更しなくてもショートカットの作成は可能でした。
そちらの方法にします。
https://excel-ubara.com/excelvba4/EXCEL293.html ちなみに、
@参照設定で「Windows Script Host Object Model」をONにする。
AWshShellクラスとWshShortcutクラスを利用してコーディングする。
Bプログラムを実行する。
Cショートカットの作成に成功する。
D参照設定で「Windows Script Host Object Model」をOFFにする。
Eプログラムを実行する。
Fショートカットの作成に失敗する。(Aの中の定義について「ユーザ定義型は定義されていません」のエラー)
となったので、
>>166については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。 >>168
確かに、仰る通りですね。
保護は事前に設定しておくものと勝手に思い込んでいました。
一番良い形で解決できそうです。ありがとうございます。 >>170
参照設定した内容はそのエクセルファイルに保存されてる
エクセルファイルを渡した先でその参照設定がちゃんと動くなら動く 二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます?
連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも? できるかどうかではなく、そういう処理を作りたいんじゃないの? そういう方法で重複チェックをしたことはあるけど
それがまともかと聞かれるとわからんなぁ 配列は要素数が増減するものには向いてない
が、まあいろいろ頑張ればできる
連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ >配列は要素数が増減するものには向いてない
「vbaの」配列な
他の言語にはpushとか色々便利なものがあるんやで Excelにはセルっていう使いやすい2次元配列があるからな
速度はご愛嬌 >>179
> 他の言語にはpushとか色々便利なものがあるんやで
スクリプト言語とかだろそれ
言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ
そもそもVBAはその多くない言語に含まれるし 無いものねだりしてもしょうがない
そもそも他言語やっててVBAやった場合
ない機能をどうやって実装するか考えるのが
醍醐味なんだから >>182
実はVBAは「配列」のサイズを変えれる数少ない言語
まあ多分全コピー発生してるんだろうけど
コレクション系が弱いからそれぐらいできんとかなりツラい
今なら.NETの使うとか出来るけど >>184
> コレクション系が弱いからそれぐらいできんとかなりツラい
どこが弱いの? 今の時代、メモリなんてたくさん確保しておけばよくね 「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では? VBA(Excel)にそんなメモリ使わせたらヒヤヒヤしちゃう long配列の下位16ビットにデータ格納されている
long[0],[1]の下位16ビットを結合するとsingleの値となる
(要はsingleが16ビット分割されてlong型に格納されている)
こんなデータが大量に格納されるんですが、上手く結合して型変換する方法がわかりません。。
val("&H" & hex(long(1)) & hex(long(0)))
で32ビット結合はできましたが、その後の暗黙的な変換なしでsingleに変更するにはどうするのが良いでしょうか? リアルタイムにやる必要が無いならバイナリでファイルに書いて
Singleで読むとか出来そうな気がする。
同じ考え方でADODB.stremも使えそう。 >>191
禁じ手だけどユーザー定義型とLSetで変数の中身を型変換せずに直接コピーできる
LongをSingleにコピーする例
Type TypeLong
varLong As Long
End Type
Type TypeSingle
varSingle As Single
End Type
Sub Long2Single()
Dim myLong As TypeLong
Dim mySingle As TypeSingle
LSet mySingle = myLong
End Sub >>191
ん?
今一つよく分からんけど、CSng使って明示的に変換すればいいんじゃないの?
Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single
originalValue(0) = 1
originalValue(1) = 3
convertSingle = CSng(CDbl(originalValue(0) And 65535)) * 65536 + (originalValue(1) And 65535)
Debug.Print convertSingle
End Sub
こんな感じに。
オーバーフローして表示しきれなくなった分は知らんけど。 おっと、すまんこ
括弧の位置間違えてた
Option Explicit
Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single
originalValue(0) = 7
originalValue(1) = 15
convertSingle = CSng(CDbl(originalValue(0) And 65535) * 65536 + (originalValue(1) And 65535))
Debug.Print convertSingle
End Sub
こうかな。
因みにビット扱っているなら説明すると失礼に当たるかもだけど、
65535は16進で&HFFFF、65536は16進で&H10000ね。
ANDは論理演算子ではなくてビット演算子。 >>191
SingleもLongも32ビット長なんだが、Singleの内部形式が分割されて二つのLongに16ビットずつ格納されているのか?
なんでそんなことになってるんだよ。Integer二つでいいじゃないか
考え方としては>>193さんの言う通りLSetでできる
二つのLongから有効な32ビット抜き出すのが手間だけど
Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど とりあえず作ってみた
エンディアンの呪いがかかってても知らんw
Type TypeQByte
varByte1 As Byte
varByte2 As Byte
varByte3 As Byte
varByte4 As Byte
End Type
Type TypeLong
varLong As Long
End Type
Type TypeSingle
varSingle As Single
End Type
Function WLong2Single(ByVal long1 As Long, ByVal long2 As Long) As Single
Dim myLong1 As TypeLong
Dim myLong2 As TypeLong
Dim myQByte As TypeQByte
Dim tmpQByte As TypeQByte
Dim mySingle As TypeSingle
myLong1.varLong = long1
myLong2.varLong = long2
LSet tmpQByte = myLong1
myQByte.varByte1 = tmpQByte.varByte3
myQByte.varByte2 = tmpQByte.varByte4
LSet tmpQByte = myLong2
myQByte.varByte3 = tmpQByte.varByte3
myQByte.varByte4 = tmpQByte.varByte4
LSet mySingle = myQByte
WLong2Single = mySingle.varSingle
End Function VBAには共用体もポインタもないから、
LSetでメモリの内容をコピー
バイナリファイル経由
IEEEの内部フォーマットに合わせてゴリゴリ計算
ぐらいしか思い付かん
この中ではLsetが一番シンプルだし高速
上位、下位の順番が分からんから適当に書くけど、基本的にはこんな感じ
MyLong = Long0 * &h10000 + Long1
Lset MySingle = MyLong
C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない >>198
それ符号ビットの問題があるぞ
VBAには論理シフトとかないからな
バイナリファイルにするにしても、Longの不要な16ビット捨てる方法考えんといかん 符号ビット対策
64bit限定ならLongLong型を経由すればもっと簡単になるのか?どう書けばいいのかわからんけど
Dim MSB As Long
MSB = (Long0 And &H8000) And &H80000000
MyLong = MSB Or ((Long0 And &H7FFF) * &H10000 + Long1) 訂正
MSB = ((Long0 And &H8000) <> 0) And &H80000000 >>201
いや、Longの中に入っている時点でマイナスなら* -1してやればいいだけだけど、だったらもっと範囲の広い型で後ろ2バイト以外クリアする方が分岐もなくスッキリするだろう >>202
元データの上位2バイトが00で埋まってた場合、論理シフトで符号が変わる場合があるでしょ
VBAには論理シフトがないから、何か別の方法で再現する必要があると思うんだけど
具体的に、動くコード書いてみて Byte型からLSetが単純で一番速いと思う
定義(追加部分のみ)
Type tyByte
Byte0 As Byte
Byte1 As Byte
Byte2 As Byte
Byte3 As Byte
End Type
代入処理はこんな感じ
データの格納順序は知らんから適当
myByte.Byte0 = long0 And &HFF&
myByte.Byte1 = (long0 And &HFF00&) \ &H100&
myByte.Byte2 = long1 And &HFF&
myByte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = myByte >>204
それなら最初にLongをByteにLsetすれば、マスクやシフトしなくても途中のバイトがそのまま取り出せる
コードの行数は増えるけど演算量はもっと減らせる >>203
ちょっと何を言ってるか分かりませんね。
まずシフトの話はどこから出てきたの?
Long型ならマイナスであれば常にトップビットは
立っているよね?
だからプラスに変換するってことだけど?
トップビットが立っていなければプラスなんで変換する必要はない。
もちろん、最初の設定値のLong型の下位2バイトでマイナスを表現するならそれぞれ*-1してやらなきゃいけないけど>>191を見た限りではそのような扱いでもないしね。
途中でマイナスをもつような型の変数に入れるなら
その後始末をしないといけないというだけ。
そもそもトップビットがなぜ符号なのかというところから理解しないとね。
トップビットを単純に0にすればプラスの値に置き換わるというものでもないし。
例えば、1バイトの変数で言えば、-1はFFhだよね。
これのトップビットを倒すと、7Fhになる。
つまり、1にはならずに127になるよね。 VBAのウインドウの固定で行を選択するとA列に移動してしまうのはどうにかならない?
手動だとそのまま列でウインドウの固定になるから違いがよくわからん >>206
元の質問と、そこに付いてるレスをよく読んで >>206
ゴタクはいいから
> 具体的に、動くコード書いてみて
って言われてるぞ >>209
具体的なコードは昨日既に>>195で書いているな。 >>211
うん。それであってるよ。
ただ、.Netみたいにアンサインな型の変数が無いから
それをどうしようか、という話。
Longで普通に計算すると上位2バイトに65535(&HFFFF)辺りが入れば
例えば&HFFFF00000が入ったとして、4294901760が欲しいのに
普通にLong型だと-65536が取れちゃったりするよね。 あ、でも*-1する方法じゃダメか。
これはあくまでマイナスをプラスにする方法であって、トップビットが立っていてもプラスとみなす方法じゃないからね。
そう考えるとやっぱりもう少し幅の広い変数持っといて計算する方法が楽かな。
だからみんなByte型とか使ってたのかー。
なんか勉強になったわ。 一つの例として、
Long[0]=&h00000000
Long[1]=&h00003E20
の時、得られるSingle値は0.15625になる
正しく計算できてるかどうか試してみればいい
>>191
Hexの戻り値は4桁とは限らないから、それでは正しく結合できないよ あまんり綺麗なコードじゃないけど、一応動くと思う
Option Explicit
Type tySingle
varSingle As Single
End Type
Type ty4Byte
Byte0 As Byte
Byte1 As Byte
Byte2 As Byte
Byte3 As Byte
End Type
Sub Long2Single()
Dim mySingle As tySingle
Dim my4byte As ty4Byte
Dim long0 As Long, long1 As Long
long0 = &H0&
long1 = &H3E20&
my4byte.Byte0 = long0 And &HFF&
my4byte.Byte1 = (long0 And &HFF00&) \ &H100&
my4byte.Byte2 = long1 And &HFF&
my4byte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = my4byte
Debug.Print mySingle.varSingle
End Sub Option Explicit
Private Type TPLong
long0 As Long: long1 As Long
End Type
Private Type TPByte
byte0 As Byte: byte1 As Byte: byte2 As Byte: byte3 As Byte
byte4 As Byte: byte5 As Byte: byte6 As Byte: byte7 As Byte
End Type
Private Type TPSingle
single0 As Single: single1 As Single
End Type
Private Sub test()
Dim L As TPLong
Dim B As TPByte
Dim S As TPSingle
L.long0 = &H0
L.long1 = &H3E20&
LSet B = L
B.byte2 = B.byte4
B.byte3 = B.byte5
LSet S = B
Debug.Print S.single0
End Sub
動いた。改行多すぎって言われたので詰めて書いてる。 >>214
それ、Longの上位下位どっち側にデータ入れるかによって
00 00 3E 20 で、数値表現としては &h3E200000 かもしれん
>>197はその前提で作ってるし>>211の図もそうだな
と思ったけど、HEX表現でそのまま連結してOKとか思ってるのか
3E 20 00 00 って格納してるのが正解なのか
エンディアンの呪いやっかいだなぁ >>210
それツッコミないのはあまりにもレベル低いからだぞ… >>217
質問者が単純にHex関数の連結だけでOKだったと書いてるから、それぞれ下位16bitを使ってて、Long[0]が下位、Long[1]が上位側と読み取れる
まあ逆だったとしても簡単に修正できるし VBAで標準モジュールを削除するコードを書いてるんだけど、消えない場合がなくね?
removeしてもそれがすぐに反映されない。
commitするようなコマンドてある? 「場合がなくね?」を「場合がない」と読むのは流石に揚げ足取りが過ぎる なくね?
→なくない?
ないよね?
言語仕様による違いかな 文脈から言い間違いだと気づけないのはアスペだそうですよ > commitするようなコマンドてある?
→commitが欲しい
→なくね?は間違い
脳仕様による違いかな 調べるとこういうことが起こってるみたいだな。
https://try2explore.com/questions/jp/11366816
VBComponents.Remove呼び出しは、VBAの実行が停止した場合にのみ実際に有効になる場合があります。
つまり、すべてのステートメントが終了するまで、またはコードがブレークポイントに達してデバッグを停止するまで、
削除操作は有効になりません。
これは、新しいモジュールをインポートするか、既存のモジュールのコードを新しいモジュールに置き換えるための次のコードが原因で問題になります。 >>220
多分ビット演算を知らないんだと思う
いずれにしてもバイナリごにょごにょはVBAには適さないとレス見てて改めて思った for i=0 to 10
if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑こんな感じのfor文を書いたら普通に動いていたんだけど、
for i=0 to 10
debug.print i, AAA(i)
if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑for文の中にdebug.printを入れたら、iが10になっても止まらず、
イミディエイトウィンドウ上に、「i, AAA(i)」の部分がずっとループして止まらなくなった。
こんなことってありえますか? >232
i=i-1
や
i=3
みたいにiが永久に10を超えない動作が入るとそうなる 普通に動いていると思っていただけで元々普通に動いてなかったとかはある
こんな感じのって言ってるから、そのソースそのまま受け取るわけには
いかんのだろうなって思った 初心者の頃は手動でセル入力してた方が早く終わってしまうのが、もどかしくもあるけど
それでもvbaは覚えるべきだと思っていろいろ頑張ってます >>232 >>234
Function AAA(ByRef i As Variant) As Boolean
i = 3
AAA=True
End Function
こんな感じのじゃない? AAAはリストボックスです。
わかりにくかったので、listAとします。
中身はTRUEかFALSEです。
listA.list(0)がTRUEなら、A1セルにOKを入力
listA.list(1)がFALSEなら何もしない。
listA.list(2)がTRUEなら、A3セルにOKを入力
…
という処理でした。
debug.printを入れる前に動かした時は、画面が固まることもなく正常に終了しました。
debug.printを入れた後に動かしたらループが止まらなくなりました。
debug.printで出力されたiは、0→1→…→9→10→0→1→…というループではなくて、
0→1→…→9→10→6→7→8→9→10→6→…→10→6→…というループでした。
「debug.print i」がiの値に影響を与える、ということはないですもんね。
他の部分を明日あらためて確認してみます。
ありがとうございました。 >>239
メソッドとプロパティが一箇所に集まって可視化しやすくなる
でもvbaのクラスは貧弱過ぎるので、モジュールで分けるのと大差ないという >>239
色々あるが、VBAのクラス機能はゴミなのでマジで自己満が多いと思う
解説サイトで玄人の技・隠し機能みたいなノリで紹介されてるので、使えるとプロっぽく見える。
@イベントやデフォルトメンバーみたいなオブジェクトモジュール専用の機能が使える
イベントをまとめたいとかで、仕方なしに、これ目的で使ってる人が多いと思う
A変数に値を入れて、その変数を色んな関数の引数にするっていう事が多々あるけど、
そういう「変数と関数」が常にペアになっているなら纏めた方が分かりやすい
B標準モジュールではモジュールレベルで宣言した変数は実行中保存される。
なので、ある関数でモジュールレベルの変数に値を保存して、別の関数で再利用みたいな使い方が出来る。
でも標準モジュールだと当然その変数に保存できる値は一つなので使い勝手が悪い。
クラスモジュールならインスタンスごとに別の値を保存できる この手の話題には「お前らは使いこなしてないからメリットを把握できてないが、俺は使いこなせてる」おじさんが来る 処理高速化するクラスくらいは単純だし使いまわせるし使ってもいいんじゃない ただ単にすっきりして可読性がよい
クラスにしてると他人のコード化したときに何をしてるかもう一度把握するのが容易
自分でメソッドやプロパティを作るとファイルシステムオブジェクトやコレクションを扱い易くなる JSとかと違ってモジュール内に構文で記述できない(単体のモジュールファイルとしてしか書けない)から、
クラスモジュールを書くこと自体が億劫に感じて余り印象よくないわ
プロジェクト内だとどこからでも呼び出せるから、どこでどう使われてるのかサッパリだし
イベント機能とか状態保存を有効に使いたい、コレクションを自作したい、
みたいな特別な理由がない限り使わない方がいいんじゃないかなぁと思ってる 継承までは望まないとしてもせめてInitializeに引数を持てるようにして欲しかった >>248
Initializeはコンストラクタじゃなくてイベントだから、
仮に引数があってもオブジェクトモジュール内じゃないと使えない上に、
インスタンスごとにイベントハンドラ用のモジュールレベル変数が必要になって面倒だと思う イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w >>250
どう読んだらそういうレスになるの?
読解力のないバカはこれだから困る >>251
はいはい、説明できないバカ乙
そもそもコンストラクタにすればいいだけの話だし >>252
何をどう解釈したのか言ってくれれば対応できるけど、最早返答が意味不明過ぎるんだわ
何に対して「イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w」と疑問が沸いたのか説明して? >>252
あと、VBAのクラスに「引数が付いたコンストラクタが欲しいな」っていう希望から
「Initializeに引数を持てるようにして欲しかった」っていう要望が出たのは明白だろう
で、イベントに引数を渡すのは面倒だよねって話をしたら「コンストラクタにすればいい」ってのもよくわからん。
だったらイベント関係なしに、初めから使いやすいコンストラクタ相当の言語機能が定義されてた方がいいだろう 一般のObject指向言語で言うところの継承が使えないとか色々あるから普通にデザインパターンを考慮して作ろうとするとそこそこ制限受けるよね。
例えば継承が使えないからテンプレートメソッドパターンが使えないとか、
VB.Netで言うSharedが使えないからキチンとシングルトンパターン使おうとすると結構厄介だったりとか。
インターフェースが使えるから継承の代わりにストラテジーパターンでも使って組もうとか考えても限界あるし。
あ?コンストラクタに引数?
そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。
まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
他のObject指向言語やってる人って結構インターフェースの概念を疎かにしたりするしね。 イベントに引数渡す(というか受け取る)のは別に面倒でもなんでないから
コンストラクタの引数をInitializeイベントに渡せたらまあそれもいいんだが
VBAだとInitializeイベントがオーバーロードできないからなぁ
まあもともとのVBがオブジェクト指向でもなんでもなかったとこからスタートしてるからな
俺はVBAのクラスは自作イベント使いたいときに使うものと思ってる >>254-255
イベントだから何?って話
VBAでも引数を持つイベントはあるし、できない理由を必死に探してるだけにしか見えない
そもそもイベントとコンストラクタなんてある意味呼び方の問題だし >>256
> あ?コンストラクタに引数?
> そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。
> まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
そういうのは頭使うとは言わない
単に面倒(かつバグの元)なだけ
無い物ねだりすんなと言うならわかるけど >>259
言ってる意味が分からない。
生成した後初期化用のメソッド呼ぶだけだろ?
なんでそんなのが面倒でバグの元になるんだ?
お前はそんな程度でバグを生むソースを書くのか? それにポリモーフィズムを理解している奴ならむしろバグやUTケースを減らせるコードが書ける。
でなければObject指向なんてここまで浸透しなかっただろうよ。 >>265
学生なのか?
社会人であるなら上司から
質問を質問で返すようなマネはするなと
教わらなかったのか?
まぁいい
答えてくれれば答えよう
それが順序というものだ >>266
バカなの?
別人だし>>263は質問じゃねーし
まあまともな答えは期待してないから答えなくてもいいぞw >>267
お前はまた勉強する機会を損失した
ただそれだけのこと 勉強?
からかわれてることぐらいは理解した方がいいぞw まあまあ、通りがかりの者だけど、お前ら仲良くやれや まったく最近のじじいは
マウントどうのとかほざくくせに
負けず嫌いで困る 5chはじじいの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。 >>264
クラスにコンストラクタがない
→newの後にメソッドなりで中身かえればいい「だけ」
それを言い出すとクラスそのものもなくてもどうにでもできるだろって話になる
そうじゃなくて、そんなめんどくさいことを「今更」したくないって話なんだ
それが苦にならないor自分で既にそれらを自動化するライブラリがある!ってなら問題ないと思うよ
君の言ってる事は間違いではない。単に感覚の違いだ
ただ、俺はやだなぁ
ついでに言うとarrayにpushはマジで欲しい >>273
したくないのは自由だが、いまさらVBAが更新されることはないから、諦めて他の言語に行ってくれ >>263
ちゃんとしたオブジェクト指向言語使えば減らせるってならともかく
VBAでオブジェクト指向でやってUTケース減らせると思えんが
ちょっとVBA関係ない話になるが
お前の思うポリモーフィズムと引数付きコンストラクタの使いどころ教えてくれ >>274
> いまさらVBAが更新されることはないから
みんなそんなことはわかってるけどいきなりどうしたw >>276
無駄な議論する意味なしでしょ
VBAの質問スレだし >>275
そうだな、ちょっとその前に
例えば一つの例としてゲームを作ったとしよう。
それは簡単なシューティングゲームだったとして、
キャラクターの中に自機、弾、敵、ヒットマークがあったとする。
キャラクター数の上限は考えないものとし、敵は幾つか種類がいるものとして、ひとつは地形判定を行う、一つは弾を打つ、等の違いがあった場合、
君ならどう作るか聞いてもいいかな?
質問を質問で返すようなことするなと言っておいて悪いが最初に認識を合わせるために聞いておきたい。 >>273
そもそも論として、クラスを使わなければ何か出来ないことがあるかと言われれば、それはあまり思い付かない。
ただ、VBAでクラスのコンストラクタに引数を持ってないという程度であればそれで代用が効くだろうという話。
それも面倒だというのであれば、クラスを生成して初期化するメソッドを作ってそれに引数を持たせるようにして呼び出せばいくつそういう場所があっても一回書いておけばいいということになる。 >>279
認識あわせの例がシューティングゲームとかその時点でお前とは合わんわ
シューティングゲームとか作らんし、その想定でどう作るとか言われてもな
まあ一から全部作ることはないし、何らかのフレームワークに従って作るんじゃね
そんな細かい実装的な話を聞きたいんじゃないんだよ >>281
話が合わないというのには同意だ
新しい何かを作る際にその構成が考えられない人に説明しろと言われてもな。
VBAスレでフレームワークとかも持ち出す意味ないしな。 excel+vbaでマインスイーパーは造れますか?
どこかにソースありますか? >>285
考えただけでも簡単そう
ソースはしらんけど vba minesweeper code でググれ 教えて下さい
ガンチャート形式の日程表で
日付の色塗りだけじゃなくて
タスク表示(その日の予定)もさせたいんだけど
どう関数組んだらいい? >>288
ガントチャート形式の日程表とやらの構成はどうなっている?
日付の色塗りとは、何を指している?
タスク表示とは、タスク名?をどこに表示させることを言っている?
このへん予め提示しないと解決が長引くよ >>288
セルサイズを大きくしてタスクを入力すればいい 質問失礼します
タイマーで二つのマクロを順番に実行したいのですが
ひとつめのマクロ実行が長引いてしまい
マクロ実行中にApplication.OnTimeのcallで次のマクロが動くとエラーになってしまいます
Application.OnTimeの時間になっても前のマクロが終わるまで待つやぶつからなくする方法はあるでしょうか? >>292
へ?
ひとつ目の実行開始時に処理中フラグ立てて
実行終了時に倒すようにして
それ見て二つ目のマクロの処理を飛ばすか
待たせてまた実行するかすればいいんじゃないの?
聞いてる意味違う? >>293
はいあっています
処理中のフラグでぐぐると色々出てきました
困っていたので助かりました
ありがとうございます 関数に引数が七つも八つもあるとわかりにくくなるから、それならクラスにしておけば、可読性が良くなるのかな >>296
そうね。
ただVBAのクラスは1クラス1モジュール使ってしまうのと、クラスが格納されているフォルダが一階層しか使えないからネーミングに気を付けて後でそれがそういう意味を持つクラスだって分かるようにしておかないとね。
後、あれやこれやと引数のクラス作らなくても、引数として格納する変数が一意でいい場合は標準モジュールでも同じように作れば使えるよ。
ただしこの場合は引数として渡すんじゃなくてその標準モジュール側に作ったプロパティを直接読みに行くことになるけどね。まぁ使い分けだね。 マクロを実行させると、Excelが落ちてしまい、
ステップ実行させるとマクロが正常終了orExcelが落ちない
ていう事になってるんだが、
どこで異常終了してるか調べる方法ある? >>298
ブレイクポイント貼りまくりで
徐々に外して落ちてる範囲を狭めて
最終的ににどこで落ちてるか確定させる 上記のやり方が大変だというのであれば
Logをどこかのtxtファイルにはく、という手もある。 >>299,300
ブレイクポイントを貼ると落ちない。
なんとなくやばい場所は分かってるんだけど、on errorでもcatchできないんだよな。
やってることは、 uiautomationを使ってコンボボックス叩く(Expand)てことやってるんだが、
おそらくその行で落ちるんだが、
落ちずに成功する場合もあるんだよな。 >>301
WinAPIで似たような事があった
本来待ち時間が必要な処理を待たずに次へ行くからブレイクポイント無しだと落ちるってケースね
怪しい所にSleep関数使って500ミリ秒待たせたら落ちなくなった事があるよ 298です。
いろいろ試してみると、マクロを実行じゃなくてステップインボタン押してF5で実行させると落ちない事がわかった。
ならば、待ち時間の問題かと思って、sleepとかDoEventsを入れてみても、落ちる。
今の所唯一の回避策がステップイン+F5だな。
ググるとステップインだとうまくいくていう記事は散見されるが、合理的な説明はない。 コンボボックスって表示したときにはテータは入ってなくて
クリックされたときにデータを読みに行くとかじゃなかったかな ワークブック開きすぎ(それも容量やシートが多すぎ)や、複数アプリケーション開きながらマクロ動かすと遅くなるからそういうところからも気をつけるといいかもしれない事例 >>303
当たりをつけるというフィジカルな部分ももちろん大事だけれど、本当に自分が当たりをつけたところが原因なのか切り分けを行った方がいいね。
その為にもどこで落ちているかを確定するのが一番先にやることだよね。やっぱりLogをtxtファイルか何かに出力するのが遠回りになるようで一番近道かもしれないよ。
箇所箇所で吐き出すロジック組み込んで、毎回書き込んでセーブしておけばどこで途切れたかで分かると思うからそれで絞り込んでどの命令で落ちたかを確定出来れば儲けもの。
もっとも、都度落ちる箇所が違う場合もあるかもだろうけど、そうなったらそうなったでそれから当たりをつけて調べればいいのであって、まず落ちている箇所が特定出来れば原因もある程度絞れるよね。 For i = 1 to 10
Call Sleep(200)
DoEvents
Next i >>296
お前の知能が足りなくてアウアウしてるだけだろ ちょっと教えてください
コントロール上にマルチページ「Multipage1」があるとき、下を実行するとエラーが出るんですが、何故か分からんのです
Private Sub UserForm_Initialize()
Dim buf As String
buf = "D3"
Set MP = MultiPage1
MP.Pages.Add
MP.Pages("Page3").Name = buf
MP.Pages(buf).Name = "X3" ←ここ。「13:型が一致しません」
End Sub 補足ながら>>311はMPもマルチページとして宣言するか該当箇所をMP.Pages("D3").Name = "X3"に書き換えれば期待通り動くんですよね
どういう仕組みなのか worksheetfunctionの引数に配列入れるときって数に上限があるな
警告も出さないしほんまクソ worksheetfunctionの引数に配列入れるときって数に上限があるな
警告も出さないしほんまクソ あ、でもこっちはOption Explicit 付けてたから
MPはキチンと型宣言してたな。
でもそこはあまり関係ないよね? >>316
や、たぶん関係するっぽいですかね?
こちらオプション無し、宣言は無しまたはas objectだとダメでas multipageだと通った >>317
ふーん
不思議だねぇ
ちなみに宣言しないで走らせたときの
MPの内部型ってどうなってる?
ごめん、もう走ったからこっちは
EXCELのブック消しちゃったんだ。 variant/object/multipageでした >>319
やっぱり不思議だねぇ
その辺の内情は分からないな
一応片付いたことになるのかも知れないけど
誰かその辺知ってたらレスが付くんじゃないかな そうですね、とりあえず急ぎとか困りではないので一旦これで…
ご回答ありがとうございました Pagesの引数に変数渡すと数字として解釈しようとしてるっぽいな
buf = "2" とかにするとIndex=2のページを参照してるようだ
文字列リテラルならちゃんと名称として解釈してるっぽい
ちな365の64ビット
これ以上はサポートにでも問い合わせるしかねぇんじゃね マクロの記録機能使ってマクロの作成したいんだがピボットテーブルのプルダウンから任意の値だけを抜き出すのってどうやってやればいいの?
毎回モジュール見直すとvisible farceになってて要するに抜き出したいもの以外を表示しないようにしてる構文て事だよね?
こうなると仮に次回このマクロを使う時にvisible farceになってない値が新しく出てくるとそれも表示されちゃうって事だよね?
じゃなくていくら値が増えても決められた値だけを抜き出すように作りたいんだ
どなたか教えて下さい >>324
記録してみてどうなってるか見てみれば分かるじゃん >>324
Falseね
ピボット周りのフィルタはFor EachでTrueFalseを一つ一つやっていかないと無理な仕様
遅いしわかりにくいけど割り切って ActiveSheet.PivotTables("ぴぼっとてーぶる").PivotFields("ふぃーるど").ClearAllFilters
ActiveSheet.PivotTables("ぴぼっとてーぶる").PivotFields("ふぃーるど").PivotFilters.Add Type:=xlCaptionEquals, Value1:="表示したいもの" VBAで最適化したら仕事増やされた話ってよく聞くけど
そいつが辞めたらそいつに回されてた膨大な仕事はどうなるん うちの職場は適当にvbaでつくったやつをちゃんとしたアプリに置き換えてるよ アプリだろうがvbaだろうが作った人間がやめたらメンテできなくて終わるんじゃないの
開発者が大勢いるようなレアな職場ならともかく
vba使ってるところなんてたいてい事務で
エクセル職人が少数いるだけだろ 実際にはそういうときには業務そのものが消滅するケースも多いよ
そもそもVBAで簡単に自動化できるような業務はもともと無意味であるものが多いからな 人がやめた後に職場がどうなるかはその職場の責任者が決めるんじゃね
下っ端が気にすることじゃない 市販アプリでも、天才的な開発者が辞めて、会社もろともアプリもダメになって終わったパターンをいくつも見てきた >>326
>>327
丁寧にありがとう
色々試してみます CPU使用率が大きかったのでダメもとで開いて修復を実行したら
かなり軽くなるのな、知らんかった
これ定期的にやったほうがいいのか?
VBAのコードを一旦退避させるのが面倒だが... 属人的にならない仕組みで効率化できればいいんだが、頭の中が古き良きな方々が幅を利かせる日本ではなかなか難しい 自分が初めてVBAを使って解決した時点で、他にVBAを使う人がいないんだから属人化しないわけがないと思うけどな
しかもVBAってプログラミング言語の中では非常に初心者向けなわけで、
誰もVBAで組めない=プログラミングに全員疎いのはほぼ決定なんだから尚更さ
VBAを共通知識にしたいっていうのは、
最初にプログラミングっていう一般的には取っ付き難い物に興味を持たせるっていう途轍もなく大きなハードルを超える必要があって、
それは「興味がある生徒に教える」プログラミング講師以上に難しいと思う
相当な根気が必要だと思うよ そもそも人に仕事が割り振られた段階で属人化されてるわけで
たんに次の人が困って終わりだよ 確かに。
レス漁ってみたが、
ここでいう「属人化で困る」は「他の人にはできないVBAというテクニックを持つオレスゲー」を単にオブラートに包んだだけっぽい感じがするな マクロの効率化ガン無視で社員の手が開いた分だけ仕事を割り振る上司がいるらしいけど
その時点である意味属人化してるよね
その仕事引き継ぐやつ
まずさばき切れないだろ うちの職場ではほとんどの人がマクロできるけど、新人に自信持たせるためにわざわざ気を使って
「君マクロできるなんて凄いね〜」っておだててるのに同調するのが正直めんどくさい 新人の育成は面倒だけど将来的に必要なことだからなあ
褒めた方が上達が早いってのも科学的に証明されつつあるし、そういうもんだからあきらめろ 全員VBAできるとか絶対給料高いとこだろ
うちのところなんて一人しかいないよ
しかも残りは関数すらまともにあつない おかげで効率がすげー悪い
基本は専用ソフト扱うからエクセルは必須ではないとはいえ
それでもエクセルやVBAやれるのとやれないのとでは効率が雲泥の差 研修とか外部の自宅学習プログラムでもやったら?
費用は会社持ち、報奨金も少しは付けて そんな金あったら給料上げてレベルの高い人材雇うか
もうちょっとマシな専用ソフト使ってる
金をケチったせいでオンボロ専用ソフト使わせれて
専用ソフトじゃフォローしきれないのでエクセル活用しないと行けない羽目になってる 会社は社員に楽させたいと思ってるわけじゃない、という大前提
人材なんて時間いっぱい、めいっぱい働かせてナンボ
安いアプリを買って、あとは社員にやらせて、それで回ってるなら何も問題ないんだよ 高い金出して高価な専用ソフト使うくらいなら
多少残業代だしてもいいからボロソフト使ったほうが安上がりだからな エクセルはマス目状に文章を入力できるソフトぐらいにしか思ってない人もいるしなあ >>354
ウチの会社の事務方ほとんどそれだわ
セルの結合しまくって数値手入力とか当たり前 セル結合とvlookupをディスってようやくエクセル使いとして一人前 べつにvlookupは悪くないだろ俺は使いたくないけど >俺は使いたくないけど
さりげなさを装ったアピール VLOOKUPディスってるのは情弱だろ
2016からめっちゃ高速化されてるから数万行ぐらいなら普通に使える 高速化とかどうでも良い
左端しかデータが使えないのが不便
無駄な検索用データが全部左端に固まる 個人的に使いたい使いたくないは仕方がない
適材適所で最適解を出す手段に自ら縛りを掛けているだけだから
それで他の人に迷惑掛けている訳でなければとやかく言う筋合いでも無いしな >>362
XLOOKUP使え
うちの環境だとまだ使えないけど... orz MATCHはいちいちIFERROR組み込まなきゃいけないから式が冗長になりがちであんまり好きくない そもそもスピードは求めてない
元データを1日に何回もアップデートするわけじゃないし >>368
あんまり関数でデータベース検索かけたくないけどかけなきゃいけないならXLOOKUP、自分以外が使う可能性があるならVLOOKUPかHLOOKUPかなぁ
状況に合わないならMATCHも使うけど使用優先度は低め
VBAにやらせる時も中に確実に存在する場合でなければRange型にFind使って放り込む事が多いかも
Is Nothingで見つからない場合でも処理が止まらずに弾けるし あごめん>>364かと思ってた
処理が止まらずにってのすごい大事だよなぁ >>370
364だけどVLOOKUP使えるならVLOOKUP
そうでなきゃINDEX+MATCH
大抵そうじゃないの? ある行を内容の変更は自由にできるけど削除できないようにすることはできますか? >>372
削除を感知して、
https://kirinote.com/excelvba-row-event/
削除されていれば
appliction.undo
ってのはどうだろうか 「削除できないように」というのが:
・「セルや行の削除をできないようにしたい」→シートの保護で対処
・「値の変更はできるが消去(空欄に)できないようにしたい」→入力規則で対処 対処の方法がわからないのかと思ったら、対処する方法があるのかどうかの質問だったのかw >>377
シートの保護で削除不可を選んでも全ての行が削除不可になること,またセルの内容変更もできなくなるので希望に合いません.
374さんのやり方をVBA画面をで書くしか無いですかね >>379
保護する前に行選択しておけばいいやん
任意の場所だけ編集不可にできるよ >>380
> 任意の場所だけ編集不可にできるよ
編集不可ではなくって、編集可で削除不可にしたいんです。 空白に編集する場合とかどう取り扱うつもりなんだろう メーカー開発設計だけど実験データ処理とかで
なれないながら頑張ってvba使ってるけど
試行錯誤で調べながらだからあんまりシート使ってるときと比べて効率化できてる気がしない…
でもシートでチマチマするよりは知的労働してる気がするし
いつかのペイオフを期待するわ あるレベルを超えると突然やりたいことはこうやりゃいいじゃんってなってバリバリ書けるようになる set覚えてオブジェクトの概念覚えてイベントを理解してしばらくするとほぼ全ての場面で対応できるようになる 色々覚えて余計な知識が付いてきて、
これはもっと綺麗に書けるんじゃないか?っていう欲が出て進まなくなる事が増えたんだけどどうすりゃいいのか
今までは明らかに冗長で読みづらいコードが多かったけど、生産性で見れば高かったように思う
特にプログラミング自体に興味が出てきて他の言語の記事も見るようになって、
そこで得た知識をVBAで無理に再現しようとしてドツボに嵌る事態も多いように感じる >>390
まず単一責任原則に沿って作るといいよ。
つらつらとコードを一直線に書くんじゃなくて、
役割に合わせてメソッドや関数を作って
それを部品として組み立てて行くイメージ。
後、他言語をやっていてクラスや
インターフェースの概念を理解しているなら
行き当たりばったりで最初からコードを
書くんじゃなくてどういう構成で組むかを
一度図に書いてイメージしてから作るといいよ。
そのためにもUMLとかもかじっておくと
いいんじゃないかな。
後は暇なときにデザインパターンの本でも
読んでおいて使えそうなのだけ
使えばいいんじゃないかな。
ただ、VBAでは自分一人で使うんであれば
それでいいけど、後々人が見たり手を入れたり
することを考えると、やり過ぎると
そもそもその辺の概念を理解していない
人が多いからね。自分以外誰も触れない
オナニーコードの完成だよ。
その辺は気を付けないとね。 >>390
字の練習と同じ
納得できるまで、何度も綺麗に書き直せば良い
その内、早く綺麗に掛けるようになる
「もう少し綺麗に書けそうだけど時間かかるから諦めよう」の判断も出来るようになる
>>391とは逆だけど、vbaの場合は関数やモジュールはあまり分けなくても大丈夫だよ
他の言語だと10行超えたら別モジュール、なんて言われる事もあるけど
vbaだと単一モジュール・単一関数で終わる方が見やすい事も メソッドが3つ以上にできそうなときはクラスを検討する 美しさより速さだよ
最初の頃は両立するが(無駄なSelectなど)
次第によ醜くなっていく もう3年くらいExcel使ってないけど全然困らないωωω >>391,392
ありがとう
分けた方がスッキリするんだけど、
分けすぎると逆に関数があっちこっちに分散してどれが何に使われているのか分かり辛くなる
そういう時に「どこまで分けるか」っていう塩梅はどういう基準で決めてる? >>398
役割。
モジュールもメソッドも全てに役割分担を持たせてキチンと仕舞うべき場所に仕舞っておく。
だからその役割を行う為なら100行になろうが1000行になろうがそのメソッドに記載する。
何を持ってしてひとつの役割とするかは作る人のセンスに掛かってくるから場数をこなして慣れるしかないかな。 >>398
変数や関数名や引数である程度分かるようにする
それでも迷うようならコメント付ける >>398
> 分けすぎると逆に関数があっちこっちに分散してどれが何に使われているのか分かり辛くなる
関数にカーソル合わせて「Shift+F2」で定義箇所に飛べるよ
https://www.wordvbalab.com/code/2925/
まあ言語自体も開発環境も貧弱すぎるからまとめたくなっちゃう感覚はわかるけど 調べてもわからないのでお聞きしたいです
下の処理でtest3まで処理は正常に行われるんですが
mainに戻ったときに型の不一致でエラーが出て止まってしまいます。
Dim WS As Worksheet
Sub main()
Call test3(TEMP_SHEET)
End Sub
Function TEMP_SHEET() As Worksheet
Set TEMP_SHEET = ThisWorkbook.Worksheets("temp")
Set WS = TEMP_SHEET
End Function
Function test3() As Variant
With WS
.Select
.Cells(1, 1) = "test"
End With
End Function VariantにはArrayとかも入るから ()付けても書式エラーにはならないのかな >>402
test3()は引数がないのに引数をわたそうとしている。
test3()は関数なのにy=test3(x)という構文ではなくてcallでtest3()を呼び出しいる。 test3の実行後にエラーになるのがこの質問のミソだと思うよ >>402
そもそも「test3までは正常」というのが間違い
これではまったく動かない
とりあえず動くようにするなら、たとえばこう書けばいい
ほかにも色々なパターンが考えられるけど、何がやりたいのかよくわからないので
Dim WS As Worksheet
Sub main()
Call TEMP_SHEET
Call test3
End Sub
Sub TEMP_SHEET()
Set WS = ThisWorkbook.Worksheets("temp")
End Sub
Sub test3()
With WS
.Select
.Cells(1, 1) = "test"
End With
End Sub >>402
test3まで処理が正常に行われたなら気にしなくていいんじゃね ステップ実行させたら確かにtest3実行するな
こんなのコンパイルエラーで良いと思うんだが、なかなか興味深い ありがとうございます!
test3はsubでよかったんですね。
参考にしながらいろいろ試したらできました。
すごく助かりました。 いや、問題はSubかFunctionかじゃないんだが
FunctionをCallしても、戻り値が捨てられるだけで別に問題はないぞ
名前の付け方がまあアレだが
Dim WS As Worksheet の行消して
Function TEMP_SHEET() As Worksheet
Set TEMP_SHEET = ThisWorkbook.Worksheets("temp")
End Function
Function test3(WS As Worksheet) As Variant
With WS
.Select
.Cells(1, 1) = "test"
End With
End Function
とかで動くだろ >>412
ありがとうございます。すごく勉強になりました。 最終の答え得るためにいくつの関数に分けるか、というのはどうやったら身につくんでしょうか 分けたくなったら分ければいい
・朝起きる
・トイレ
・歯磨き
・食事
・デンタルフロス
・着替え
・家出る
寝起きのルーチンとしてトイレ歯磨きをセットとするとか
無い時もある食事デンタルフロスをセットとするとか
歯磨きが先なのは寝起きで飲み食いが嫌で個人的な事だから異論はあると思う >>414
欲しい答えじゃないかもしれないけど
同じような処理を何度か書くような場面ができたときに、一つの関数にまとめるべきか検討するといいよ
むやみに何でも関数にすればいいというものではない >>415
>>416
ありがとうございます。
手続き型しか書けなくて、ダラダラ長くなってしまうのが少し気になり始めてしまって、見やすいシンプルなコード見ると、どうしたらこういう考え方できるのかなと。
実験的にもいろいろやってみます。 別スレから来ました
A1 会社名 B1仕事の項目 C1整理番号
B1の項目に従って規定のExcelファイルを開いてA1の会社名とC1の整理番号を合体して名前をつけて保存っていう操作をしたいんだけど、これはVBAで出来ますか?
別件ですがVBAでオススメの書籍があれば教えてください >>418
大分質問が上手くなったじゃないか。
ただ規定のファイルにはただ名前つけて保存するだけでいいのか? >>418
どこのスレから来たの?
Rubyスレかそうでないかで対応変わるんだけど なんでExcelファイル操作するのにRubyスレから来るんだよ 別スレから来ました
A1 会社名 B1仕事の項目 C1整理番号
B1の項目に従って規定のExcelファイルを開いてA1の会社名とC1の整理番号を合体して名前をつけて保存っていう操作をしたいんだけど、これはVBAで出来ますか?
別件ですがVBAでオススメの書籍があれば教えてください ブラウザバックしたら投稿した
すまない
Excel質問スレから来た
>>420
名前をつけて保存の前にいろいろやろうとは思ってるけど、VBA素人だからとりあえず名前をつけて保存までにしようと
VBAで出来ることはわかったのでダイマでもステマでもいいのでオススメの書籍を教えてください だってルビースレから来た時点で質問が目的じゃなくて
最終的にルビーコード貼り付けてどやーするのが目的の人だし ルビースレってそもそもなんなのかって状態なんだが…
この板はブラウザバックで二重投稿した程度で中傷くらったりするのか?
エクセルのVBAについて質問してるのに全然違う答え返ってくるし >>425
自分で本屋に行って内容を確認しようとは思わないのか? >>425
B1の項目に従ってというのが謎なので気を利かせて絶対パスで指定のファイルを開くようにしたよ。
ちなみに5ちゃんに書くとファイルパスの¥マーク書けないから半角に直してね。
思ってた動きと違うと言うなら自分の質問200回音読してから書いてね。
動作が不足してるならちゃんと質問のここが出来てないって書いてね。
使い方
・データを打ち込んでるブックで、処理させたいデータの行のどの列でもいいから選択しておく
・マクロ実行
・指定したファイルに選択した行のA列+C列のデータの名前で名前をつけて保存される
─────────────────────
Sub test()
Gyo = Selection.Row
Data0 = Cells(Gyo, 1).Value
Data1 = Format(Cells(Gyo, 3), "000")
Namae0 = ThisWorkbook.Path & "¥" & Data0 & Data1 & ".xlsx"
Namae1 = Data0 & Data1 & ".xlsx"
Workbooks.Open "C:\Users\*****.xlsx"
Workbooks("*****.xlsx").SaveAs Filename:=Namae0
Workbooks(Namae1).Close
End Sub >>430
> Workbooks.Open "C:\Users\*****.xlsx"
> Workbooks("*****.xlsx").SaveAs Filename:=Namae0
> Workbooks(Namae1).Close
こんなふうに書く人いるけどなんで
Dim Book As Workbook
Set Book = Workbooks.Open("C:\Users\*****.xlsx")
Book.SaveAs Filename:=Namae0
Book.Close
って書かないのか不思議だ >>433
単に返り値がopenしたbookであることを知らないだけだと思う
俺も昔は前者みたいな書き方してたな なるほど、結構基本的なことだと思ってたけどそうでもないんかな
シートでも Worksheets("sheet1").~ って書いてる人をよく見る >>433
わたすもまだ今年から始めたド素人なもので…。参考になります。
>434の言うとおり戻り値がそんなだなんて知らなかったんだよう。 後続の処理でworkbookオブジェクトを使わないならWithで纏めちゃうな
With Workbooks.Open("C:\Users\*****.xlsx")
.SaveAs Filename:=Namae0
.Close
End With
こんな感じで >>437
一行ごとに処理書いてる感なくてスマートでええな。 Withは便利だけど積極的には使わない派
後で見返す時にわけわからなくなるから 俺は>>437と同じ
オブジェクトを変数に入れずにWithに直接ぶっこむ派
DimとSetの行がなくなるから入力の手間も減るし狭い画面でソースが見やすくなる 扱うオブジェクトが1つならいいけど複数あったりサブルーチンに渡したりする時もあるから withはネストするとトタンに見にくくなるよね
>>437ぐらいなら見やすいと思うけど、>>439と完全に同意見だわ 以前VB6スレでもWith Newを使ってる人がいて論議になったことがあったね。
俺はこの方法は有りだと思う。
ひとつしか使えないけど関数やメソッドの中で唯一ひと階層下のスコープを設定出来る方法だからそれを意識した使い方なら。
ただこの方法であまり長いロジックを組むのは確かに可読性に宜しくないのも同意。
だから使いどころに気をつけながら使う方法だと思うよ。 オブジェクトを抱えるWithはSubやFunctionとセットで使うんだよ
1つのSubには一つのWith
それ以上になる時は機能を詰め込みすぎだから分割すべき 複数のファイルじゃなくて複数のフォルダを選択する方法はありますか? パワポもvbaで操作している人はいますか?
また手っ取り早く時短できる部分はありますか? >>450
Excel のデータを50枚ぐらいにスライドに整形して表示するって言うのをVBAでやったよ >>448
リンクにあるのはフォルダじゃなくてファイルについてですね。。。
どうやらファイルは複数選択できるけどフォルダはできないっぽいですね。。。 >>452
横槍だけどリンク先ちゃんと下まで読んだ? 全くの初心者です
元エクセルファイルを、そのファイル内の特定のシートの特定のセルないの文字(名前)でフォルダを作成し(作成階層は元エクセルファイルがある場所)、そのフォルダ内にフォルダと同じ名前で元エクセルファイルを出力したいです
検索してみてそれっぽいコードを実行してみましたが上手く行かないか1004のエラーが出てしまうので、できれば教えていただきたいです >>454
まずは自分で作ったプログラムをここに貼って >>454
流石にエスパーじゃないからそれだけの情報じゃなんとも言えんが、
ファイルの指定が間違ってる可能性がありそう
エラーが出たときにデバッグってボタン押したらどんな命令文の背景が変わってる?
省略しないでその文を一字一句違わず書いてみ? >>457
元のファイルがあるフォルダーのサブフォルダーに格納されるんで同じ名前でも大丈夫だよ。 わたしは、エスパー
今、質問者の脳内に、直接、回答を送っています
わたしは、エスパー 残念です
夜中なので、質問者は、寝てました
残念です なぜプログラム板でExcelVBAのスレが活発なのよ?
日本終わってんな 労働者の多くがExcel使ってんだから需要からしたら普通だろ プログラマーじゃない人もたくさん使ってるから
人が増えるのは必然 >>456
https://lilia-study.com/excel/vba-sample/cellvalue-save/
Sub hozon()
Dim wb As Workbook
Dim ws As Worksheet
Dim hozonPath As String
Dim FolName As String
Dim FilName As String
Set wb = ThisWorkbook
Set ws = ActiveSheet
hozonPath = “K:\”
FolName = ws.Range(“A1”).Value
FilName = ws.Range(“A2”).Value
wb.SaveAs Filename:=hozonPath & FolName & “\” & FilName
End Sub
このvbaで
A1=A2にして、hozonPathをThisWorkbook.Pathにしたりすればできるかな?と思ったのですが上手く行かずです… ThisWorkbook.Pathにはケツの¥が付いてないから
ThisWorkbook.Path & ”¥” & FolName & “\” & FilName
に書き換えてみ >>467
お前のPCにK:ドライブは存在するのか?
とりあえず
wb.SaveAs のまえに、
MsgBox hozonPath & FolName & “\” & FilName
いれて、表示された内容をかけ
個人名とか入ってたら適当に隠せよ 超初心者です
以下の対応をさせたいです
@シートを支店分だけ増やす
Aシート名をそれぞれ「支店一覧」A2〜A18の支店名にする
B作成したシートのB5に支店名を入れる
C作成したシートの表のA列が"0"になっている行を削除する
D作成したシートのオートフィルタを解除する
以下のものではエラーになりますが、どこが悪いのでしょうか
Sub シート作成
Dim 支店名 As Range
For Each 名前 In Worksheets("支店一覧").Range("A2:A18")
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
With ActiveSheet
.Name = 支店名.Value
.Range("B5") = 支店名.Value
End With
Range("B3").AutoFilter 1, "0"
With Range("B3").CurrentRegion.Offset(1, 0)
.Resize(.Rows.Count - 1).EntireRow.Delete
Range("B3").AutoFilter
End With
Next 支店名
End Sub Cは「B列が"0"になっている行を削除する」の誤りでした とりあえずここだと思う
下の方はサンプル作ってくれれば試すけど、手元にないからよくわkらん
Sub シート作成()
For Each 支店名 In Worksheets("支店一覧").Range("A2:A18") >>473
大変失礼いたしました
あるページからコードをコピーしてきたときに修正し忘れました
実際は名前→支店名にしていましたが、エラーとなっていました
エラーの内容の詳細が必要でしたら、明日投稿します
(現在手元にExcelファイルがなく、すみません) 安心して
手元にエクセルファイルが無いのに記憶だけでそこまで書ければ超初心者じゃないよ >>474
> エラーの内容の詳細が必要でしたら、明日投稿します
なぜ最初から書かないの? >>471
あと、
・どこで
・どんな
エラーになるのか書いて Select Caseにbreakがないのは何故なんでしょうか
beakがないから最初に一致した条件以降のCaseも
実行されると勘違いしやすい
仕事で大きなトラブルを起こしてしまった… Select Caseって上から順に見て真っ先に当てはまったCaseのみ実行じゃなかった?違うんだっけ? >>478
> Select Caseにbreakがないのは何故なんでしょうか
そういう仕様だから
Pascal とかと同じ
> beakがないから最初に一致した条件以降のCaseも実行されると勘違いしやすい
むしろCとかでbreak忘れてトラブる奴の方が多いだろ
なのでC# はコンパイルエラーにするぐらいだし
> 仕事で大きなトラブルを起こしてしまった…
仕事で使うならちゃんとテストしろよ… >>479
違うよ
Select Case の後にTrueとか書いて
Case の後にTrueとかFalseとか書くと
簡単に確認出来るよ >>478
これはVBAとかCase文に限らず今自分がやってる言語→ 他言語に切り替える際には何か違う挙動するなー、て言うのはあるあるなことだからまぁいい勉強になったって思うべきだね。
>>480の人が言う通り仕事で使用するならキチンとテストするべきだったね。
UTとして証跡残すのがセオリーだけど、せめて一度走らせて挙動確認しておけば今回の件は防げたはず。
その言語仕様を嘆くよりそういったこともあるって次回に生かした方が幸せになれると思うよ。 select case 普通に動作するんだが、どうやったらトラブル起こせるんだ? >>470
https://d.kuku.lu/8dd3704ad
すみませんimgurが使えないのでよくわからんあぷろだですが…
やはりエラーが出ます、 だからhozonPathとFoINameの間に¥を入れろって >>484
お前みたいな馬鹿にはVBAは無理だと思うよ コピペ間違えた
>>484
wb.SaveAs Filename:=hozonPath & "\" & FolName & “\” & FilName
で
あと
FolderName
を無理に
FolName
と変に略すと、あとで何書いてるかわからなくなるぞ。 パス区切りに、/ は使えないの?
例えば、Ruby なら、
glob_pattern = "C:/Users/Owner/Documents/*.txt"
p Dir.glob( glob_pattern )
出力
[ "C:/Users/Owner/Documents/a.txt",
"C:/Users/Owner/Documents/b.txt" ] あまりに馬鹿過ぎると思ったらやっぱりruby馬鹿か >>484
何をやりたいのかよくわからんけど、連続して2回以上実行すると、実行回数分のネストしたフォルダが必要になるのでエラー吐く。
あと、コピー先のフォルダ/ファイル名はActiveSheetを参照しているので、複数ブック開いていたりするとおかしなことになる。 >>484
保存先のフォルダがないとそのエラーになるから、wb.SaveAsの直前にその確認を入れる
↓で動いたの確認した
'※hozonPathはあるのか
Dim ExistHozonPath As Boolean
ExistHozonPath = Len(Dir(hozonPath, vbDirectory))
If Not ExistHozonPath Then MsgBox hozonPath & "ドライブは存在しません。"
'※FolNameはあるのか
Dim FolFullName As String, ExistFol As Boolean
FolFullName = hozonPath & FolName
ExistFol = Len(Dir(FolFullName, vbDirectory))
If Not ExistFol Then
Dim Question As String
Question = "「" & FolFullName & "」フォルダが存在しません。作成しますか?"
Select Case MsgBox(Question, vbYesNo)
Case vbYes 'はい→作る
MkDir FolFullName
Case vbNo 'いいえ→終了
Exit Sub
End Select
End If
wb.SaveAs Filename:=hozonPath & FolName & "\" & FilName ユーザーフォーム自体(コードではなくてボタンとかが表示されている方)を印刷する時、
デフォルトで用紙が縦になるんですが、横に出力する方法はないでしょうか? >>495
Windowsの設定(コンパネ)のプリンタで用紙設定しておく あー、あの縦か横かをオプションボタンで選ぶ画面ですね。
VBA以前の問題でした。失礼しました。
帰宅したら試します。 横1列に並んだセルを
A B C D E F
1 あああ いいい ううう 阿嗚呼 伊井伊 雨右鵜
2 かかか ききき くくく 可化歌 機器機 久々九
3
↓
A B C
1 あああ いいい ううう
2 阿嗚呼 伊井伊 雨右鵜
3 かかか ききき くくく
4 可化歌 機器機 久々九
のように1行飛びに成形するにはどうしたら良いですか? >>498
一組が1行✕6列からなるセル範囲を別シートの
2行✕3列に出力するマクロでいいのでは? こういうの自力でできないようじゃ教わってもしょうがないんじゃね >>493
ありがとうございます。満足いく挙動になりました! >>499
現状頑張ってコピってます
>>500
ありがとうございます
もちろんDBから引っ張って来たシートとは
別の印刷用シートのセルに=で参照させるんですが・・
マクロの記録を頼りにしてみます
>>501
自力で・・ 関数でできる
Sheet1のデータをSheet2に出力するとして、Sheet2のA1に次の式を入力してコピペ
「Sheet1!$A$1:$F$999」は範囲なので適当に直して
=INDEX(Sheet1!$A$1:$F$999,ROUNDUP(ROW()/2,0),IF(MOD(ROW(),2)=1,COLUMN(),COLUMN()+3)) >>498
'標準モジュール側
Sub hoge()
Dim list As New Collection
Dim entity As Class1
Dim i As Integer
Dim j As Integer
For i = 1 To 3
For j = 1 To 4 Step 3
Set entity = New Class1
entity.value1 = Cells(i, j)
entity.value2 = Cells(i, j + 1)
entity.value3 = Cells(i, j + 1)
Call list.Add(entity)
Next
Next
Range("A1:F3").ClearContents
For i = 1 To 6
Cells(i, 1) = list(i).value1
Cells(i, 2) = list(i).value2
Cells(i, 3) = list(i).value3
Next
End Sub
'クラスモジュール側(Class1)
Public value1 As String
Public value2 As String
Public value3 As String >>503
というか、普通に手作業でやってる手順をVBAで書き下せばいいだけだよ
コピペ元の範囲の場所を示す
dim srcRow as long
dim srcCol as long
と、
コピペ先の範囲を示す
dim dstRow as long
dim dstCol as long
を作って、
1〜3列目は同じ列、4〜6列目は次の行にコピペ
っていう作業を繰り返せばいい。
ペアになる変数はユーザー定義型を使うと見易くなる
type MatrixIndex
Row as long
Col as long
end type
dim src as MatrixIndex,dst as MatrixIndex >>504
偶数奇数の数列ですね!ありがたやー
>>505
んー データシートの消し込みって一般常識なんですかね?
まっコメントアウトするだけだし
iとjが逆かな? でもなんとかなりそう!
ありがとうございましたア! >>507
プログラムは作業の手順書とはいえ
>>505さんのクラスモジュールを使うだとか
ユーザー定義型変数を使うという発想に至りませんで・・・
皆様ありがとうございました。 >>498
G列に上から1,2と入れて、さらに下方のデータの無いG列に1,2とコピペする
表全体を選択してフィルターを適用。G列でソートする
以上で一行ごとに空行が挿入される
つづいてD1:F2を選択、コピー
A2に形式を選択して貼り付け(空白を無視する)
出来上がり >>511
別解ありがとうございます
テンプレートファイルがあればそれで良いかもしれませんね VBAで作ったプロシジャーにショートカットキーを割当てたのですがうまくいきません。
議論用に下のような簡単なプロシジャーをつくり(実際はもっと複雑です)
testShortCutKeyにはCtr+Shift+I
testShortCutKey02にはCtr+Shift+F
を割り当てました。
エクセルのウインドウをアクティブにした状態で
Ctr+Shift+Fを押すと別のアプリのEverNoteがアクティブになり
Ctr+Shift+Iを押すと別のアプリがアクティブになります。
ワードのVBAでも同じくショートカットキーを正しく設定しているのに使えません。
少なくとも今年前半はこんなことはなかったのですが…。
対策はあるでしょうか?
Sub testShortCutKey()
Stop
End Sub
Sub testShortCutKey02()
Stop
End Sub
https://imgur.com/S9WxsoT >>513
自己レスです。
スクリンショットのリンク先を間違えました。
https://imgur.com/qJeXnl9
が正しいです。 普段よく使う色んな独自マクロ機能を右クリックメニューに登録して、
どんな時にも使えるようアドインファイル(.xlam)化して
XLSTARTフォルダにおいて使っています。
ThisWorkbookに下記コードで、登録と終了時の処理を書いているのですが、
Excelを起動終了するたびに、Excel15.xlbのファイルサイズが肥大化していく
現象で困っています。
Sub Workbook_Open()
Call AddRightClickMenu '右クリックメニュー追加
End Sub
Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CommandBars("Cell").Controls("xxxxx").Delete
End Sub
BeforeCloseの中にExcel15.xlbの強制削除を入れても、勝手にサイズUPした
ファイルが作成されてしまいます。
これを解決する方法があれば、教えてください。 ひとつのシートボタンだけ
まとめたほうが楽じゃないの? >>513
他ソフトのショートカットと干渉してる可能性がある
例えばalt+F11はGeforceとかぶって使えなかったりする。めんどい >>513
問題の切り分けとして、
Ctr+Shift+F
をCtr+Shift+KなりCtr+Shift+Uなり、色々試してみて >>517,518
有難うございました。
Ctr+Shift+Uは干渉しませんでした。
Ctr+Shift+FとCtr+Shift+Iが他のアプリに割り振られているようです。
Ctr+Shift+Fはそのアプリの設定を外すことができました。
Ctr+Shift+Iは外す方法が見つかりませんので別の組み合わせに変更します。 >>471,472,474です。
間があいてしまい、申し訳ございません。
マクロを実施すると、「支店一覧」A2:A18のA2,A3,A4のシートまでは対応が完了するのですが、
その後A5名のシートが作成されず、「原本(2)」というシートが作成されたあと、以下エラーとなります。
「実行時エラー'1004':
この名前は既に使用されています。別の名前を入力してください。」
.Name = 支店名.Value
の部分が黄色くなっています。
こちらで「支店一覧」をみるかぎりではおかしなところはみあたりません
(もちろんA2:A18に重複もありません) 「この名前は既に使用されています。」って言ってんだからそのシートが存在するんでしょ。見当たらないなら非表示になってるか 以下の処理について質問です
「条件→A列に1行目から文字列が多数行入力されていて、文字列にはa、b、cのアルファベットのどれか一つのみが必ず含まれている。(例 ”15あうa” 例"7c8-of")
やりたいこと→B列に連番を振りたい。aを含む文字列だけで1,2,3,4... bを含む文字列だけで1,2,3,4...のような感じで振りたい。」
一応自分で次のようにやってみたら出来ました
セルC1 C2 C3に a b cと入力して、for eachでC1~C3を括る?
さらにfor eachでA列を括る。
そしてA列にて上のセルから順番にaを含むかif文で判断して連番を入力させる。
b,cについても同様に行うと
for とか ifしか使えないためこのようなやり方をしたのですが、もっと適切な方法があれば教えて頂きたいです。 >>522
非表示でもないです
そもそも「原本(2)」という名前のシートがなぜ作成されるかも謎なんです
(「原本」があるので、「原本(2)」が作成されるときに記載のエラーになるのでは
と推測しています) >>520
ショートカット以外だとリボンにカスタム登録するしかないけどいちいちマウスを使うと
キーボード操作の流れが途切れる。 そりゃ原本ってシートをコピーしたんだから原本(2)って名前のシートができるだろ >>523
連番をカウントする変数を3つ作ればいい ほんとバカですみません、、、
自分が嫌になります
それなのにみなさま返信有難うございます
追加ですみません
支店名シートのA2:A18の中で、★が支店名に含まれているものは
シートを作成しなくてよいという条件を組み込むことはできますか?
あと、各シートを作成したあとに、シートの数式をすべて値にしたいですが
できますか?
Sub シート作成
Dim 支店名 As Range
For Each 名前 In Worksheets("支店名").Range("A2:A18")
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
With ActiveSheet
.Name = 支店名.Value
.Range("B5") = 支店名.Value
End With
Range("B3").AutoFilter 1, "0"
With Range("B3").CurrentRegion.Offset(1, 0)
.Resize(.Rows.Count - 1).EntireRow.Delete
Range("B3").AutoFilter
End With
Next 支店名
End Sub >>527
分かりませんでした!もう少し詳しく教えていただけないでしょうか! a=1:b=1:c=1
for i=1 to 最後の行
if instr(cells(i,1),"a")>0 then
cells(i,2)=a
a=a+1
elseif instr(cells(i,1),"b")>0 then
cells(i,2)=b
b=b+1
:
end if
next i
みたいな >>523
ここまでせんでもって思うけど
https://i.imgur.com/RQpkaWZ.png
Sub foo()
'準備
myarray = Array("aa", "bb", "cc")
'初期化
Set myDic = CreateObject("Scripting.Dictionary")
For Each x In myarray
myDic.Add x, 0
Next
'本体
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 最終行
For Each x In myarray
If InStr(Cells(i, 1), x) <> 0 Then
myDic(x) = myDic(x) + 1
Cells(i, 2).Value = myDic(x)
End If
Next
Next
End Sub 暇だから書いたけど、実際やるなら>>530みたいなので済ます戸思う D列のセルに文字を入力するとJ列のセルが塗りつぶされる処理をしたいのだがどうしたら良いものか
Sub Macro1()
If InStr(Range("D1").Value, "") > 0 Then
Range("D1").Offset(0,6).Interior.ColorIndex = 16
Else
Range("D1").Offset(0, 6).ClearFormats
End If
End Sub 条件付き書式でいいが、どうせVBAでやるなら入力のたびに書式をクリアしてから再設定する方がいいよね >>533
If Range("D1").Value <> "" Then
あとはChangeイベントにする >>538
上記サイトに記載されているとおり、
アドインフォルダに.xlamファイルをコピーし、アドイン登録を済ませて、
[Visual Basic プロジェクトへのアクセスを信頼する]のチェックボックスをオンにした状態でも、
[開発]タブに[エクスポート][選択エクスポート]が表示されなかったので、
最新のExcelでは使えないと勘違いしていたが、下記の手順で使えるようになった。
@エクスポート対象のxlsmファイルを開く。
A[開発]-[Excelアドイン]をクリックする。
B有効なアドイン一覧に、既に登録済みのExcelvbaexport2007がある。
C既にチェックボックスはオンになっているが、そのまま[参照]ボタンを押す。
Dアドインフォルダ(〜Roaming\Microsoft\AddIns)が開く。その中のExcelVBAExport2007.xlamを選択する。
E「この場所に'〜Roaming\Microsoft\AddIns\ExcelVBAExport2007.xlam'という名前のファイルが既にあります。置き換えますか?」と聞かれる。
F[はい]を選択する。
G[OK]ボタンを押してアドインウィンドウを閉じる。
[開発]タブ内の右端に[エクスポート][選択エクスポート]が現れる。 Excel 2019
「オプション」−「詳細設定」の「グラフィックアクセラレータを無効にする」のチェックを
VBAで設定するにはどうすればいいでしょうか?
AccessだとApplicationのSetOptionやGetOptionでできるんだけど、
Excelには見当たらないのでよろしくお願いします。 https://ja.play-and-more.com/4226-turn-off-hardware-graphics-acceleration-office-2013
ハードウェア アクセラレータ―の設定については、
Excel と Word の設定が連動しているので、
Excel のオプションから設定を変更することで
Word 側にも設定を反映することはできます。 >>530
>>531
ありがとうございます!
別のケースに応用できるのでありがたいです! 同じpersonal..xlsbを複数の端末で使いたいので xlstart フォルダーから同期フォルダーに移動し
xlstart フォルダーではかわりに同期フォルダー内のpersonal.xlsb へのショートカットを置きました。
期待通り起動時にpersonal.xlsbを読み込みますが毎回マクロの実行許可を求めるので面倒です。
マクロ有効ファイル一般の仕様であることは理解しておりますが、特定のマクロファイルのみ確認を省略するか、
またはxlstart内にpersonal..xlsbにおいたまま同期する方法はないでしょうか。
xlstartフォルダー自身を同期フォルダーに設定することも検討しましたが、
googlドライブの場合は同期フォルダーは全てGドライブに移動するので
xlstartフォルダ自体が自動実行できなくこと、またpersonal.xlsb起動時にマクロを有効にするか確認
がはいり解決になりません。 >544
信頼できる場所に追加するとか、デジタル署名付けるとかしたら行けるんじゃ?
しらんけど >>545
personal.xlsbを信頼できるドキュメンに設定したらできました.
無礼な物言いごめんなさい. for i = 1 to 100 step 1
'最終行は処理中に変動するため栗けしの都度最終行を取得する
Worksheets(OutputSheetName).Cells(1000, 1).Select
Selection.End(xlUp).Select
iRastrow = Selection.Row
for j =2 to iLastrow step 1
何らかの処理
next j
next i
上記のようなプログラムがあったとして j=2、iLastrow=1のように最初から子ループの終了条件を満たしているようなケースで
子ループの j が 2でクリアされず親ループの繰り返しの都度 3,4...と加算されていくケースがあるんだけどさ
最初からループの終了条件を満たしている場合は、for j=2 … の部分の変数値のクリアはされないものなの?
終了条件を満たしているか満たしていないかに限らず、この行にきたら j=2 でクリアしてくれると思ってたんだが… ごめん、そこは単なる書き間違い
実際のコードはLで統一されとります >>557
色々行ったけど一つとしてものにならなかった…? エクセルでチェック表作った
職員に入力してもらって月一で提出してもらってrpaツールに流し込んで専用ソフトに入力してるけど
バージョンアップしたファイル渡したのに
無視して古いファイル使ってきたり
様式ぶち壊してめちゃくちゃなファイルを提出してきて
まともなデータに成形するのに死ぬほど苦労した
ゴミ職員にたいしてブチ切れそうなんだけど
どうしたらいいですか なるほどありがとう
このゴミ職員エクセルを魔法か何かと勘違いしてるわ
あまりに適当な仕事に腸煮えくり返る >>553
jの値はどこでどうやって確認したんだ? >>561
お前みたいな馬鹿が作っているからそうなる どういう状況のファイルかもわからんで煽るバカに言われてもな >>564
壊されるような造りになってるのが馬鹿の証だぞ >>561
妥協点として下位互換は残しておいて
それでも成形の必要があるやつはお断りかな
成形はあなたの仕事では無いよ
ただ提出者が楽なようにしてるだけだと思う
それは提出者が仕事してないって事だな 仕方ないね。元は別の人が勝手に作った表で
おれのはその表をコピーして○がつけられるようにしたものだから
人のファイルを保護かけてガチガチに固めて私物化するわけにも行かないし
お前みたいな後先考えられないバカは
他所のファイルをガチガチに固めて属人化して批判されるんだろうけど もう反論終わって罵倒で誤魔化すタイムか
知能指数低すぎるわ >>553
そもそも
>> 子ループの j が 2でクリアされず親ループの繰り返しの都度 3,4...と加算されていくケースがある
が起きてるとどうやって判断したのかが分からない。
例えば実行できるコードにdebug.printを挿入しておいて、
「これを実行するとこんな出力されます、実際にはこうなって欲しいです」
みたいな具体的な質問してくれた方がいいと思う。
そういう分かりやすい質問文書くと、その過程で自己解決できたりするし。 >>567
とは言え上でも言われている通り
違うフォーマットのものは受け付けないようにするか
触られたくないところは保護掛けるくらいしか現実的な解決策はないだろうね
形式の違うもの送られて来たからこちらで手で直す、というのは基本的に違う気がする。
フォーマットチェックを行うツールを作ってそのゴミ職員とやらに「これでOKとならないものは受け付けません」とやる手もあるけど、そのツール作るのにも工数は掛かるからね。 >>559
>無視して古いファイル使ってきたり
1,共有サーバーに置いてショートカットから起動させる
2,実際の処理はサーバーにやらせる。
3,VBA諦めてWebアプリにする
>様式ぶち壊してめちゃくちゃなファイルを提出してきて
そういうのは警告メッセージだして拒否するもの。
これまで未対応の様式のファイルも修正するおせっかいをしておきながら、
「めんどくさい」と突然キレるのは最悪。
やるならやりきる、やらないなら最初からやらない。中途半端は一番ダメだからね。
もしくはVBA諦めてテキスト関連のライブラリ豊富な使いやすい言語にする。 >>559
こういう風にやれよっていう説明資料が足りてないんだろ。
自責部分は改善してして、それでも従わない奴には突き返して再提出してもらうのが良い 話を聞かない、説明を読まない、世の中の大多数はアホばかり
まあこのことに気付かないで文句ばっか言ってるのもたいがい間抜けなんだけど
現実を受け入れて、バカにも使える仕様を考えるのが仕事ってもんだ それはまあそうなんだけど資料を揃えておけば
ひとまず相手側のせいにできるからそれを根拠に文句は言いやすいわ 現場で変更するのはもとファイルが使いにくいからじゃないのか 確かにチェックつけるだけなのになぜ改変されるのか謎 よく見たら提出って言ってるな。
フォーマットに整形させたファイルをマクロつかって登録させる仕組みじゃないのか。
もしかしてVBAの話ですらない? >>553
step 1 が気持ち悪い
てか、まずこういうの作って実験してみればいいじゃん
挙動がわからなければ、めんどくさがらず小さなプログラム書いてどう動くか実験
そういうことやる癖つけないと厳しいよ
Option Explicit
Sub TestSub()
Dim i As Integer
Dim j As Integer
Dim lastRow As Integer
lastRow = 1
For i = 1 To 10
For j = 2 To lastRow
Debug.Print "aa"
Next j
Next i
End Sub
まぁ、普通に考えれば、どう見てもiRastrowが1ではなく別のもっと大きな値をとっている可能性が果てしなくでかいわ 確認した結果、言語に致命的な問題があったという研究報告だろ
異論があるなら論文で提出しろや >>576
毎回一人ずつ文句を言うのもかなり面倒な作業だと思うがな
俺なら同じ時間と手間を掛けるならパソコンに向かってコーディングしてた方がいいわ 作業ルールの変更は職場長の許可もらってやれよ
勝手に変なシート作ってフォーマット変えるなとか言われてもね 年末調整面倒くさい
何故に毎回フォーマットを変えるのか
いや、分かるよ、控除や税金計算が変わってるんだから仕方ないけどさ、
国には毎年キチンと高い税金納めているんだからEXCELで自動計算してくれて、それ印刷して提出すればいいくらいのもの作ってくれないのかなぁ >>587
いや、むしろ自治体から「年末調整やっておいたから内容確認して」
と連絡メールが来るくらいのことをしてくれていいと思う >>587
うちの会社はイントラで内容確認して問題なければ「申請する」ボタンをクリックするだけだよ
俺は嫁がパートに出てるからその年収入力が必要だけど昔に比べたらめっちゃ楽になった ちょっと思いて調べたらユーザー定義関数でもスピルできるんだな
今度実験してみるか >>587
高額納税者なら会計士にたのめばええ
控除とか支給金とか、毎年新しい制度まできちんとチェックして、うちで使えるやつを教えてくれる
家族構成まで考慮して節税のアドバイスもくれるし、確実に手数料以上のメリットがある >>589
扶養に入っていていてもメルカリ等で得た利益を合計すると扶養から外れることがあるからな 税理士のことを会計士って呼ぶやつはかなりの高齢だって聴いたことがあるわ VBAの構造体で
Type Book
title As String
author As String
price As Long
End Type
桁数を予め指定しておくことてできないんですか?
こんなような感じで
Type Book
title As String (10)
author As String (10)
price As Long (5)
End Type StringならString * 10 とかでできる。
Longは大きさ決まってるから指定できないはず。 >>587
前半は分かるけど、なんでそこでエクセルが出てくるんだよ >>599
クラスつくってプロパティの代入時にチェックいれればいいんじゃね >>601
数式だけでちゃちゃっと出来そうじゃん
そんなんで本格的なWebサイト作ってアクティブレポートとかではくより
このEXCELファイルダウンロードして必要なところに入力してねで終わらせた方が安上がりだし
むしろここ、EXCELVBAのスレだからEXCELにすらかすってないこと書くのってなんか気が引けるじゃん というか、最悪Webフォームやらにして、番号言えば参照してもらえるって感じでいいとおもうけどね
印刷とかしてもってくのめんどいし
本人確認で行くのはしゃあないとして
ま、スレ違い >>600
TypeてVBAでできるけど、VBScriptだとできないんだな。
やりたいことは全銀フォーマットをCSVにしたかったんだけど、別のやり方でやったわ。 >>605
正規表現で一括置換すればいいだけだな。 問題を解決するやり方が複数ある場合は作る人のセンスがでる
速度重視なのか汎用性やメンテナンス、あるいはただ動けばいいとか VBAっていうかエクセルの話題かもしれないけど、
ユーザーに入力させたテーブルがあってそれを校正するとき、
「間違っている部分」と「そこの入力形式の説明と記入例」をどうやって表示したら分かりやすいと思う?
イメージとしては「入力形式を確認する」ボタンをクリックすると
間違い場所が何らかの方法で説明されて、
ユーザーがそれを見ながら修正する感じです。 >>610
普通に入力規則使えば?
変なオレオレ方式作られるより慣れてて分かりやすいでしょ >>611
複雑な形式(5〜10文字の英数+アンダースコア+5文字の英数の繰り返し用のような)も多数あるのですが、可能でしょうか。
GoogleスプレッドシートならSplit関数があるので捏ね繰り回せばパース出来なくはないですが・・・
ユーザー定義関数で入力規則が設定できるのかとも思ったのですが、
「指定した範囲の名前は見つかりません」と出てしまい、
そもそも関数として認識されませんでした。 以下のようなマクロが組みたいです。
ファイル(以下A)が保存されているフォルダ内を検索して、特定の名前が含まれる別のエクセルファイル(以下B)を開いて、Bの各シートをシート名を指定した名前に書き換えつつAの指定の位置にシートを追加する。開いたBは閉じる。 >>613
そうか頑張れ
ここはお前の日記帳ではない >>610
> 「間違っている部分」
そこにフォーカス当てるとか色を付けるとか
> 「そこの入力形式の説明と記入例」
メッセージ表示ればいいけど修整箇所がたくさんあるとウザくなるからそういうことが予想されるケースでは俺ならエラーセルに色付けしてそこが選択されたらステータスバーに表示するとかするかな 正規表現って言うと卑猥なことを言ってるような気がして口では説明しにくい 可愛い女子後輩が「せいきひょうげん教えて下さい!」なんて言ってきたらそれだけで射精してしまうよな ここでぬいたでーたをこのせいきひょうげんでちゅうしゅつしてそこへそうにゅうしといて… >>616
ステータスバーに書かれていると気づいてもらえるかどうか・・・
>>617
正規表現で入力規則に設定可能か、
自分ググってみたのですが見つかりませんでした・・・
やり方を教えてください。 >>610
色んなやり方があると思うけど
例えば小さなテーブルならOK、NGやなにがどう間違っているかの列を数式で出る欄を設けておいて
全ての行がOKならOK、そうで無ければNGと表示するセルをひとつ作って
それがNGであればなんかのボタン押したときに「入力値に誤りが有ります」的なメッセージを出す方法を使ってるところのが分かりやすかったかな。
ただこの方式だとユーザー定義関数使うとマクロ無効にされてる状態では正しく反応しないのが難点だけど。 >>622
> ステータスバーに書かれていると気づいてもらえるかどうか・・・
セルのどこかに表示するとかいいと思うよ
そこら辺は好みでどうぞ どこに書いてあっても絶対に読まない民が43%いるから(当社調べ)
覚悟しとけよ >>612
ExcelVBAのスレなので
VBA(WorkSheet_Changeイベントで起動)でチェックしたら? >>613
クエリでフォルダ指定すると、ファイル名一覧を取得出来るから
キーワードで絞込む。
で、インデックス列と希望する書き換えファイル名の列作ってリストにしといて、
あとはVBAで、IF FOR構文とSaveAsあたり使えば
出来るんでね? >>627
ただの決意表明に何でコメントしてるの?
Ruby基地外の自演コメントですか? >>629
ソーシャルワーカーだらけで単価激減
vbaで稼ぐのは諦めろ 将来の希望としての発言なら
まず稼げる力をつけてからそういう会社に就職したらいいんじゃね
あとYoutuberとかなら勝手にやればいい 裸エプロンで胸を机に乗せた状態でプログラムする様子をYouTubeに上げれば稼げるかもしれんぞ >>613
例えば、Ruby で、glob を使って、
拡張子がcsv で、ファイル名に13 を含む、ファイルのフルパスを求めると
# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/*.csv"
filename_substr = "13"
p Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみを取り出す
.select { |full_path|
# ファイル名だけを取り出して、指定の語句を含む、ファイル名を含むものだけを抽出する
File.basename( full_path ).include?( filename_substr )
}
出力
[ "C:/Users/Owner/Documents/input113_2.csv",
"C:/Users/Owner/Documents/input13-3.csv" ] 標準モジュールで、シートAから文字列拾ってシートBに転記しようとしたら、
望まぬ形でBのWorksheet_Changeを踏んだのでCaseで分けて素通りさせたんですが、
どうにもBのValueが1004エラーで書き換わっていないのにWorksheet_Changeが発動しているらしく、
なんの変哲もない「Worksheets("B").Range("XX").Value = str」が実行されません。
F8で(Changeしてないのに)Worksheet_Changeの中身だけ進む事ができますが、それが終わると元の位置に戻って再びエラーになります。
どうしたらValueを拾って貰えるんでしょうか。 >>639
たったの2行で万事解決
ありがとうございます
Public文字列をスイッチに四方八方から切替えまくってからのこのオチは恥し過ぎる >>638
何が起こってて何がしたいのかまるで意味不明なんだが、>>639が回答できた事に驚き そういうのって必要になった時に調べるもんだし
今まで一度も使わなかった機能なんて色々あるだろ しかしだな
15年もいじってりゃエナブルイベントのせいで無限ループになることくらいあるんじゃないの 2013でSharePointに接続する方法ない?
2019ならADOで出来るんだけど 作る前に様式はこれでいいよねって事前に確認したのに、作ったあとに
やっぱりああでもないこうでもないと注文つける
簡単なコードすらまともに書けないゴミの後出し地獄にムカついてくる
じゃあてめえが作れと たかがVBAを少し書けるだけで他人をゴミ呼ばわりする馬鹿
こいつみたいな勘違いの思い上がり馬鹿はよく見かける わざわざ作業やり直したくないから様式を事前に確認したのに後出しで人の作業増やすやつをゴミ呼ばわりして何が悪いのかな
お前も後出しで人の作業量増やしそう
自分でやるなら好きなだけ後出ししていいけどな。できないでしょ 相手の要求を理解して指摘される前に用意しとくものだろ
馬鹿は言われたことしかできないから馬鹿だっての 提示した仕様に対してOKが出てるのに
勝手に仕様追加しとけって?キチガイですかね 相手のレベルに合わせて打ち合わせできないから馬鹿だっての 様式見せてるのに相手のレベルもクソもないんだがねキチガイくん 馬鹿は相手が理解しているかどうかすらわからないから馬鹿だっての 相手は様式を理解した上で後出しの思いつきで仕様変更要求してきたんだよ
馬鹿なお前にはこんな簡単な日本語すら理解できないんだろうけど 議事録なり議事メモなりで決定会議や打ち合わせの記録を残しておかないと後で後悔する 議事録だろうが録音だろうが無駄
レベルの低いやつってのは、簡単に前言を撤回して主張を変えてくる つまり契約概念を理解しない客なわけだ。そんな客は契約は契約ですかと突っぱねて二度と相手にしないことだ。 VBAでなくてもクライアントからの急な仕様変更なんて日常茶飯事だから諦めろん
ある程度の仕様変更なら少ない手間で対応できる作りにするのも腕の見せ所だぞ
まぁ言うてその仕様にすんなら全部1から作り直しやんけって仕様変更もなくはないのがツラいところ だからメンテナンス性とかモジュール化とかクラスが大切になってくるんだよ
経験を積んで仕様書に書かれてない部分も適切に作り込んでおいて、仕様変更のコストを下げるのも腕の見せ所
もちろん、表向きは大変だと言って渋って見せたり高額なメンテ費用を請求する駆け引きも必要 仕様変更っていっも動作確認あわせて1時間もかからんだろ
ここで愚痴る前にさっさと直せよ 馬鹿だから修正に手間が掛かるようなプログラムしか作れないのだろ 仕様確認を反故にする ユーザーに怒っている人をディスってる奴らが数人いるけど、こいつらは他人をディスってストレスを発散する病んだ人たちなんだろうな。 プログラム的なものをやってると後出し仕様変更おしさんにはほぼ100%遭遇するからな >>665
テストやリリースまでのドキュメント作成で実際はその何倍もかかるよね 列挙型使ってればデータ収集くらいなら大体は対応できる 後出して仕様変更されても、その分の納期と金額を保証してくれるならまあ許せる
そういうやつらは大概は、元の金額のままで同じ納期でやれっていうからな >>671
個人契約で請け負っているならそういう交渉もあるだろうね
自社開発とかだと上司にそれ言うか? エンドユーザーに仕様なんて伝えても理解できないことも織り込めない素人に毛が生えただけのVBAプログラマーがこぼしているだけだからな >>674
こいつはきっと趣味のプログラマーだな。 悔しかったか?
どんな仕事でも言われたこと(それも自分が理解できる範囲だけ)しかできない無能に限って、少しプログラムできると天狗になって自分が偉いと思い込む >>676
俺は100%通りすがりのモンだけど。
お前思いっきり読解力ないな(笑) 人を下に見られる程精通してる人って正直羨ましいわ
知れば知るほどまだまだ知らない事が沢山あるなぁと勉強不足を実感してしまう 顔が見えない相手にしか愚痴れないんだろ
我慢してやろうぜ >>663
クラス作ってインターフェース作って多態性持たせてというのは確かに大事だけど
それを使いこなすレベルであればもう能力的にはVBA卒業だよ。 生徒が先生に対して自分は下に見られているとかいうのは違うんだけどね 古い話になるがエクセル2003くらいのことにはブック固有のツールバーとそのツールバーにマクロボタンを登録できた.
そのブックをオープンすると固有のツールバーが表示されてブック固有のマクロを簡単に実行できた.
エクセル2013を使っているけどこういう機能はなくなったのかな.
VBAでもツールバーを作れるけど,commandbarオブジェクトにaddしてボタンをaddしてなど面倒すぎるし,なにより全てのブックで表示されるとか,特定のブックだけで表示させたかったらそれ用のマクロをイベントと関連付けて切り替えるなど面倒.
昔のような機能を復活させる方法はないでしょうか? >>688
クイックアクセスツールバーに表示できる
そのブックだけに適用とかの設定もあったはず 職場にVBAバカにする人が多くて辛いです。
どうしたら見返せますか? >>693
VBA と言わなきゃいいんじゃない。どうせ VBA と C の違いもそいつはわかんないだろう。 マジレスすると、VBAだから馬鹿にされているんじゃなくて内容がチープだからじゃね
とりあえずセンスのあるグラフとか作ればそれなりに見えると思う 高度な処理をするより見た目派手なことするほうが関心されるってのはあるわな そら見た目の印象で判断してるからな
実際どんな事やってるのか踏み込む人には効果無し 動いてる感じを演出して見た目を楽しませるの結構大事だよ
書き込んだところをselectするようにしたら、嬉しそうにセルに書き込まれてる様子眺めてた リアルタイムの進捗状況見れるしな
そういうの好きな人は懐かしのデフラグも好きそう >>684
VBAがインターフェースだのクラスイニシャライザだのポリモーフィズムだの
実装してくれればいいだけじゃないのかな。
「卒業しなきゃいけない」ものでもないだろ、今の普及度見てると。 >>706
いらんいらん
vbaはあくまで今ぐらいの不便さでちょうどいい
下手にそんなもん実装されたら読みづらくなってかなわん >>708
あったっけ。俺の記憶違いならごめん。
あと、致命傷なのが実質グローバル変数化するエクセルのセルだと思う。
あれ、とてもやっかい。 >>691
ありがとうございました。
できました。 Open/Nameで開く/リネームするファイルの名前に
全角括弧や中黒、半角ピリオドが入っていると
実行時に「エラー53 ファイルが見つかりません」
が出ます。
ファイル名が長すぎるのかと思い短くしたが変わらず、
実行前に上記のような文字を削除しておくとと無事処理が終了します。
しかし手作業で削除するのが面倒なのでそれ以外の対処を知りたいです。
先生方ご教示ください。 うろ覚えだから動かなかったらごめんね
こんな感じにやるといけたかもしれない
Replace(対象のファイル名, "・", Chr(Code("・"))) 質問です
所定の形式のシートAからデータを取り出し、数値の操作を行ったあと別の形式のシートBに記入すると言うマクロと逆にシートBからシートAに記入するマクロを作りたい場合に楽をする方法はないでしょうか?
今まではA→BとB→Aで2つマクロを作ってたのですが見るところが同じなのでまとめれるように感じたのです
プログラムについて詳しくないので無茶なことを言っているかもしれませんがよろしくおねがいします >>713
自分で考えないで他人に作らせるのが一番楽じゃないかな >>713
その気づきが大事だよな
プロシージャを分けてCallで呼び出して引数はシートにする もうRubyは飽きたから
VBAで書かないならせめて
今流行りのPythonとか
新たに注目されてるRustとか
いずれWebのExcelで必要になるJavascriptとか
VBAやってる人が次に進みやすい
VB.NetとかC#とかその辺で書けばいいのに
Rubyとかで書いて来るセンスないバカは
死ねばいいと思う >719
一応マジレスする
rubyにはとんでもないキチガイがいて、そいつが嵐回っている
そのおかげでrubyは総スカン、言語に影響するレベルで貶めされるようになった
キチガイ一人で言語一個潰せたのは割とマジですごいと思う あわしろ氏が言ってたけど、ベンダーロックインされるから、特定企業の言語は使わないほうが良いよ。 >>713
値を取得したいセルの範囲をどっかのセルに書いといてその位置を引数で渡せばいいじゃん
複数範囲があるならその複数セルの位置を書いた範囲を引数で渡せばいい。 あのあわしろ氏とかいうのはアホだから
今はLinuxでさえExcelと似たようなソフトがあってそれでもVBAが動くことか考慮していないのだろう
Cなんか組込系はハードによってすらコードが左右されるのに、必要なときに必要な勉強をすればいいだけなのに変な固定概念を持っててそれを人に押し付けてる >>713
取り出すシートと書き込むシートを引数で渡せばいいだけかと
Sub Hoge(取り出すシート As Worksheet, 書き込むシート As Worksheet)
Dim 値 As Variant
値 = 取り出すシート.Range(取り出す場所).Value
' なんかの処理
書き込むシート.Range(書き込む場所).Value = 値
End Sub
Dim SheetA As Worksheet, SheetB As Worksheet
Set SheetA = ActiveWorkbook.Worksheets("A")
Set SheetB = ActiveWorkbook.Worksheets("B")
' A ⇒ B
Hoge SheetA, SheetB
' B ⇒ A
Hoge SheetB, SheetA 範囲を別のところに書いたり引数指定でやればいいんですね
遅くなってしまいましたが色々なご意見ありがとうございます ああ。CallByNameとかを使えば擬似的にできるんだ。へえ。
しかし、クラスイニシャライザと継承を普通に実装してくれれば
…くれないんだろうな、もう。 すいません質問させてください。
特定のエラーウィンドウが出たら実行するマクロを作りたいのですが
実行条件の指定の仕方がわかりません。
具体的には「データの入力規制」のエラーメッセージタブで指定した
ウィンドウの「はい(Y)」を自動で押したのちにマクロを実行させたいです。
ご教授お願いいたします。 730です。
vba内?で出たエラーを条件にした処理は探せたんですが、エクセルが出したエラーをトリガーにしたものが探せなくて質問させていただきました。もしあるならば知りたいなと思った次第です。 なるほど、確かにそうかもしれません。
ありがとうございました。 Excelスレに書き込んだ後にVBAスレがあることに気付きました。
VBAでA1セルに入っている文字列を使ってA2セルに文字列を入れたいと考えています。
↓のように作ったときA1が数字だけかアルファベットだけならうまく入るんですが数字とアルファベットを組み合わせた文字列(例えば4A02とか)だと1004エラーとしてアプリケーション定義かオブジェクト定義のエラーがあると怒られてしまいます。
解決方法あるものでしょうか?
Range("A2").value = "=(1,2,3," & Range ("A1").value & ",5,6,7,8,9,""abc"",0)" >>737
数式を変えるか、セルの書式を文字列にする
Range("A2").Value = "'=(1,2,3," & Range ("A1").Value & ",5,6,7,8,9,""abc"",0)" >>729
クラスのコンストラクタ自体はあるよ。引数が使えないだけで。
VBAの場合は一般的に言う継承は使えないけども移譲が使えるのでクラスで多態性を持たせる場合は
テンプレートメソッドパターンを使うのではなくストラテジーパターンを使う。 ユーザーフォーム上でのハイパーリンクに関して教えて欲しいです。
エクセルで下記のようなデータがあり、各レコードをユーザーフォームで
表示できるようにしています。
レコード 氏名 駅 地図(URL)
1 山田 新宿 https://map.yahoo.co.jp/search?q=新宿
2 鈴木 渋谷 https://map.yahoo.co.jp/search?q=渋谷
3 木村 池袋 https://map.yahoo.co.jp/search?q=池袋
・
・
その際、「地図(URL)」のテキストボックスを使ってハイパーリンクの設定を、あるいは
「地図(URL)」のラベルを使ってリンクを開くをお教えていただけないでしょうか。 まぁその前にExcelのユーザーフォームは
スプレッドシートやグリッドビューや
HTMLでいうTableタグのようなものが無いので
擬似的に一覧を作る方法を考える方が
先だと思うけど。 Private Sub ラベル地図_Click()
Dim a
a = 地図.Text
ユーザーフォーム.FollowHyperlinks Address:="a"
End Sub
なんとなくこんな感じなかとやってみたのですが、エラーでした。
宜しくお願いいたします。 VBAって初学者はどうやって勉強すればいいんですか? >>745
変数の定義、ループ文の書き方、条件分岐の書き方が分かれば大体の言語はなんとかなる
あとは自分が何をやりたいかによってこんな動作はできるか?あんな動作は可能か?って一つ一つ調べていけばいい
処理速度が遅いと感じ始めたら最適化とかに手を出したり、シークバーを表示することで体感速度を早めたりっていう事を覚えていけば最低限はなんとかなるんじゃない?知らんけど >>745
「〜をやりたい」という目標を決めたら
後はGoogle先生とマクロ先生に聞けばいいんじゃないかな >>744
そうだね、
まずは3行目の変数に代入している文字列を
ダブルコーテーションで囲めばいいんじゃないかな。
後、地図.txtってどこのフォルダに格納されているのかな?フルパスで書かないとダメだよね。
最後に>>746の人が言ってるとおり、それだとaという変数の中にある頭を見て飛んでるんじゃなくて、
aというリンク先に飛ぼうとしているよね。 >>739
ありがとうございます
無事にできました! Range ってテキストボックス内の文字列(アドレス)指定できたでしょうか??
テキストボックスのオブジェクト名を間違ってた・・・
Private Sub ラベル地図_Click()
Dim a
a = "txt地図" ’テキストボックス(txt地図)内表示の文字列
ユーザーフォーム.FollowHyperlinks Address:=”a"
End Sub
・・・またエラーだ・・・。
「a」「”a”」ともに・・・。
.FollowHyperlinks がダメなのかなぁ。
安易に質問してすみませんでした。
勉強しなおします。
他いろいろ試してまた分からなかったら来ます。 >>745
上の>>744初心者です。
マクロの記録使って、そのコード見てイジってます。
この方法って間違ってる気もしますが・・・。 フォームオブジェクトには.FollowHyperlinksというメソッドは無いね
WorkbookかApplicationのを使うとよろし Sub マクロ保存したまま拡張子変換()
Dim bk As Workbook
Dim f As Variant
Dim gf , hf
Dim fro As Object
MsgBox (“変換するフォルダを選択して下さい”)
Set fso = CreateObject(“Scripting.FilesystemObject”)
With Application.FileDialog(msoFileDialogFolderPicker)
.show
gf = .SelectedItems(1)
MsgBox (“保存するフォルダを選択してください。”)
FileDialog(msoFileDialogFolderPicker)
. Show
hf = . SelectedItems(1)
End with
Set = fso.GetFolder(gf).Files
For Each f in fso.GetFolder(gf).Files
If LCase(fso. GetExtensionName(f.name)) =“xlsm” Then
Application.DisplayAlerts = False
Set bk = Workbooks.Open(gf & “\” & f.Name)
bk.SaveAs gf & “\”fso.GetBasename(f.Name) & “.xlsx” , 51
bk.Close
set bk = Nothing
End if
Next
fso.MoveFile “gf & \ *.xlsm,_ “hf”
set gf = Nothing
set hf = Nothing
set fso = Nothing
MsgBox “ finished”
End sub
元のマクロデータ結果が消えるのと、フォルダ移管がうまくいきません。誰かたーすーけーてー。 拡張子なんてずっと前から非表示がデフォルト設定だもんな
表示してるのはIT技術者とマニアぐらい >>745
解説本読んだら、やりたい事 vbaでググる >>755
さっきの人もそうだけど、とりあえず変数を""で囲うのやーめーてー >>755
せめてコード載せる時は
全角ダブルクォーテーションやーめーてー ExcelスレにはPCからアクセス出来ないからと
全部手打ちのお客さんが稀に良く来るんだよ
いつものひとって呼ばれているけど個体ではなく群体かもしれないね >>745
今やってる手作業を全部マクロで書いてみる
とにかくひたすら、
「入力を最低限に」
「出力を正確に」
を考えると、実用十分な面で腕が上がる
あとはオブジェクト、setなどを覚えると更に快適になるけど
まぁそこまで覚えなくてもいいことがほとんど excel vnaでパス区切りが入りません。
\マークの前に、変な文字が入ってしまいます。
a=“c:\tmp\”
が
a=“c: \tmp \”
みたいになります。
解決策をご存知の方いませんか? >>773
パスを連結する所です。
次のようなコードです。
file = wsh.specialfolder(“Desktop”) & “\test.csv” >>775
実行時なのか書いてるときなのかってこと >>776
実行時です。
lenで長さを調べると、不明な文字分、長くなっています。 Ruby の文字列には、こういうメソッドがある
chomp は、文字列の末尾に改行コードがあった場合に、文字列の末尾の改行コードを削除します。
strip は、文字列の前後のホワイトスペース(空白類?)をすべて削除します とりあえず、半角スペース?をRelaceしてその場は乗り切ればいいんじゃない
根本的な解決じゃないだろうけどVBAなんだからその場しのぎで十分 >>780
半角スペースでは無い文字だったので、置き換え出来ませんでした。
結局、動的にパスを連結するのは諦めて、一つの文字列にして対応しました。
お騒がせしてすみませんでした。 絶対別のどこかにバグがあるパターンやな
ステップ実行しながら変数の中身をチェックしてみ 全角空白、CR、LF、ESC文字、TABコード、00H、のどれかに10ガバチョ
不明文字の文字コード調べればすぐわかるのになぜしないのか? >>747
> 変数の定義、ループ文の書き方、条件分岐の書き方が分かれば大体の言語はなんとかなる
OOPからのパラダイムシフトすら起きつつある今、それだけでは
ソース見て、?????にならないか。 基本を押さえれば何が出来るかとかどう調べればいいか分かるって言う話なのになんでそれオンリーで戦おうとするん >>775
csvがユニコードだったのではなかろうかもう解決したみたいなのでどっちでもいいけど
自分の場合は、ウェブからコピペしたセル上の文字列がユニコードなのにそれをvbaで扱おうとしたらちょっと嵌まったまあなんとかうまく処理できたけど
vbaのエディタはユニコードに対応してないそうだから困っちゃうね >>792
これ全く再現できないんだよな
っていうか質問者自身が
「\の前に文字が混入するバグ」であるとか、
原因が「a=“c:\tmp\”」や「file = wsh.specialfolder(“Desktop”) & “\test.csv”」にあると勝手に判断してて、
それがミスリードになってる気がする。
余計な文字が入った個所が偶々\マークの近くだっただけだったり、
実は後々変数を弄っていてそこで混入している可能性もある。
質問者は素直にコードを一部始終書いて、
「ここでこうなるようにしたい」とそれだけ書けばいいのにと常々思う。 >「ここでこうなるようにしたい」とそれだけ書けばいいのにと常々思う。
禿げ上がるほど同意 IE操作をしてとあるページまで辿り着いて、そこのBASIC認証のポップアップにユーザー名とパスワードを入力した後、OKをクリックする、ということをやりたいです
詳しくないのですが、普通にリンクを辿っていく感じではなく、div要素にJavaScriptが埋め込まれていて、VBAでIdやClassを指定してクリックしてもページ遷移しません
BASIC認証を求められるページの先にあるデータが目的なのですが、そこへ直接行くURLは分かっていても、当然ながら先にログインしてないとデータが閲覧できないようになっています
直接URL先へ飛んでもBASIC認証のポップアップが出ないため、初めから順にページ遷移していって、BASIC認証を求められる特定の場所まで辿り着きたいのです
そのBASIC認証を求められるページのURLが分からないので、遠回りでもそういう方法しか自分には思い浮かびません
URLにユーザー名とパスワードを埋め込む方法はもうできないそうなので、どうにかJavaScriptによるページ遷移をVBAによるIE操作でやりたいです
必要な情報がなにかも分からないのですが、具体的にどうすればdiv要素に埋め込まれたJavaScriptを動かせますか? >>796
認証している画面(ログイン画面)は分かりますか?
そもそもですが、一度ログインした情報をクライアントサイドで持ち回っているとは限りませんよ。
Webにはサーバー側でセッションというものがあり、セキュリティ上の関係で、ログイン画面で打ち込んだ、あるいはログイン出来た、という情報をそれで持ち回る手段も一般的に使われます。
クッキーやクエリストリングで持ち回る場合も有りますが、一般公開されているサイトであれば望み薄でしょう。
直接入るようにするのであれば、そのサイトも社内環境のような場所にあるのであれば、そういう口を作って貰うのが一番手っ取り早いでしょう。
そんなに簡単に入れるのなら内部の情報抜きたい放題ですよね?
だから認証というものがある訳です。 >>796
鯖によって使えるかどうか変わるけど、URLにIDとパスワードを埋め込んで認証させてしまうという方法がある
あとJavascriptでのページ遷移もURLにスクリプトを埋め込む方法で飛べてしまうケースがけっこうある
これ以上は具体的にそこのサイトを教えてもらわないと、何が使えるとかアドバイスは難しい >>796
URLなんてパケットキャプチャすればすぐわかる
ただしURLにワンタイムキーが含まれてる場合はURLがわかってても直接飛ぶのは不可能
ポップアップウィンドウに文字列を入力する最終手段としてSendKeysというのもあるけど、安定動作させるのが難しすぎるのであまりおすすめしない >>796
他のアプリ操作してネットワークにアクセスするのをVBAで作るのはやめなされ >>797
詳細は分からないのですが、一度ログインした後ならば、その先のURLへ直接飛んでも閲覧できるんです
なので、とりあえず一度でもどうにかログインさえすれば、なんとかなるかなと思っています
>>798
外部サイトではないので直接見ていただくことはできないのです
URLに埋め込む方法を試しては見たのですが上手くいきませんでした
欲しいデータのある場所は、URLにパラメータを渡してなんとか飛べることはできたので、BASIC認証が求められるページもそうやって行けるのが一番なんですが、ソースを見ても分からなくてお手上げ状態です
BASIC認証を呼び出してるであろうそれっぽい場所は見つけたんですが、そこからどうも上手くいかなくて・・・
>>799
なるほど
パケットキャプチャ調べてみます
とにかくポップアップさえ表示できれば、最悪SendKeysでEnterしてやろうと思ってました
>>800
あまり良くないであろうことは分かってるんですが、できればすでにあるVBAコードの中に組み込みたいんです・・・ Authorizationヘッダを追加する方法は試したの? >>802
BASE64でエンコードしてやる方法でしょうか?
一番最初にそれを試しましたんですが上手くいきませんでした >>801
>>>797
>詳細は分からないのですが、一度ログインした後ならば、その先のURLへ直接飛んでも閲覧できるんです
>なので、とりあえず一度でもどうにかログインさえすれば、なんとかなるかなと思っています
ならばgetElementByIdで目的のテキストボックス拾って値設定して、
同様にボタン拾ってClickさせるコードを書いて、その後目的のページに飛べば行けるような気がしますが、それでは駄目なのでしょうか? >>804
IdやClassNameでは.Clickでも駄目でした
ページ遷移という書き方をしてしまいましたが、正確にはdiv要素がstyleで画像になっていて、それをマウスクリックするとそのページ内でメニューがポップアップします
そのメニューにも同様にボタン画像があって、いくつかクリックして潜っていった先の一つをクリックすると、今度はBASIC認証のウィンドウが出てきます >>805
で書いてある通りに、やっていけば?
Ruby on Rails の統合テストのCapybara は、そういう感じでやっていく
漏れは、Ruby, Selenium Webdriver でブラウザの自動操作して、
yahoo にログインしている
Seleniumでは、要素が出現するまで待ってくれるので、操作しやすい。
この機能がない場合は、適度にsleep して待てば良い >>807
うわぁ・・・rubyってこんなのしかいないのか
rubyの勉強しようと思ってたけどもうやめる >>796
Basic認証の情報はホスト名毎に自動的に送信されるはずだから、
事前に認証後に遷移するURLへAuthorizationヘッダに認証情報を追加した状態でNavigateメソッドを実行しておけばどうかな。
そのあと通常通り辿ってBasic認証が求められるページに行ったらどうなる? 根本的な質問で恐縮ですが。EOMonth関数でシリアル値が取れるのはわかっていますが、そこからMonthのみ取り出したらその「月数」のデータ型も日付シリアル値の一部のままと考えていいでしょうか。
それともただのint型やstr型などになってしまうのでしょうか。 >>813
月を取り出したらDateserialで好きな日付のシリアル値を作ればいいアル >>814 >>815でした。
すみません。
改めてありがとうございます 1.A列にシートごとに不特定多数(X)のセルがある
2.セルの個数にしたがってを4等分する(小数点以下切り上げ)
3.等分したデータをBCDへ移動する
これをやりたいんだけ2をどう表現すればいいのかわからない
X / 4ってどうやったら表現できますか?
データの最終行の取得方法はわかったけど使い方がわからない… >>818
セルの個数が小数点になるのが理解不能
なんか文がおかしい >>818
ごめん4等分か。
セル個数数えて4で割れば数は出ると思うから、
その数をcellsでn、n+1から2*n、2n+1から3nで範囲選択してコピーとかすればいいんじゃね >>819
レスありがとう
4等分って書き方が悪かったかな
A列セルが1234こあったら1234 / 4 =308.5
ABCD列に309 309 309 307こずつ配置したい >>818
> 2.セルの個数にしたがってを4等分する(小数点以下切り上げ)
[1] A, B, C 列の個数 = WorksheetFunction.RoundUp(A列の個数, 0)
[2] D列の個数 = 元のA列の個数 - 3 * ([1]で求めた個数) >>793
mac版で編集、保存したファイルでなった事あるよ。
winで作ったxlsmをmacで編集、保存する。
後phpexcelなどのライブラリーを使ってwebからダウンロードさせたファイルでも同様の現象になることがあったなぁ。 MacのExcel VBAは使い物にならないからやめとけとあれほど >>822
Sub Macro1()
A列 = 1234 '全体の個数
分割 = WorksheetFunction.RoundUp(A列 / 4, 0) '分割後の個数
Cells(分割 * 1 + 1, "A").Resize(分割, 1).Cut Destination:=Cells(1, "B") 'コピペ2列目
Cells(分割 * 2 + 1, "A").Resize(分割, 1).Cut Destination:=Cells(1, "C") '3列目
Cells(分割 * 3 + 1, "A").Resize(分割, 1).Cut Destination:=Cells(1, "D") '4列目
End Sub 数値をバーコード化するマクロ使うと、かなりの確率でWorksheet クラスの Paste メソッドが失敗しました。が起きるのはなぜでしょうか
貼り付けコマンド直後にDoEventやると少し緩和されます >>828
そのマクロの作者に聞いてください
うちで使ってるバーコードマクロだとそんな症状は出ないので >>828
バーコードフォントってのがあるから、そっち使ったほうがいいと思う |
| 彡⌒ミ
\ (´・ω・`)また髪の話してる
(| |)::::
(γ /:::::::
し \:::
\ バーコードフォント使う方法ってダウンロードしないとダメじゃね
現場でこそこそやってる俺はOLEオブジェクトだったか使う王道でやるしかなかったわ
ぐぐるとこの方法がトップに出てくるわけなんだけど
もし>>828がこの方法を使っているとして
何の目的でpasteメソッドを使ってるんだろうね
普通にバーコード作成するだけだと、たぶんだけどpasteメソッドは出てこない 質問つか愚痴だけども…
閑散期にやってるアピールで始めたVBA、
入れ過ぎた塩を中和するのに砂糖を入れ、
入れ過ぎた砂糖を中和するのに塩を入れるのを繰り返した
ヘタクソ料理みたいなコーディングの果てに繁忙期に食い込んで上司の視線が痛い…
依然としてどっか直したらどっかが狂う…
業務改善を謳いながら結果的に仕事と混乱をもたらしただけだった… >>834
典型的な初心者で草
俺も最初は随分と苦労したけど、
そうなったら最初から書き直したほうが絶対に早いし、腕も上がる
糞みたいなコードを読み直す時間は無駄
せっかく書いたのに・・・って思う気持ちは窓から投げ捨てろ いやいや
失敗は成功の母
一度始めたことは苦しくても頑張れよ
出来の悪いコードを苦労して改良して動くようにしたとき、
人はレベルが一段上がる 一般的にデバッグはコーディングの10倍ぐらい経験や知識が必要な作業だから初心者には荷が重い
まずは最初から書き直してちゃんと動く物を作り上げた方がいいと思うよ 書き直しって一からベタ打ちするんじゃなくてコピペがほとんどですよね? >>838
その辺は慣れ。今からほしいコードが、「書く」「コピペ」、どっちが早いかによる。
ほとんどは自分でベタ書きだけど、個人的にこの辺はマクロの記録を修正するか、ネットからのコピペで済ます
・背景色や罫線を変更する時
・グラフをvbaで制御したい時 引数の意味がうろ覚えの時、ヘルプを読むより動くコードをコピペした方が早いことも 早さじゃなく内容を優先しないから
つぎはぎだらけになるんじゃね 行き当たりばったりで建築開始しました
バランスが悪くなって一部倒壊しました
もう更地にして立て直した方がいい事もあるよね 今は早さが最優先される時代だからね
民生アプリやゲームなんてバグだらけでもとにかくリリースして、オンラインでどんどんパッチを当ててく方式が主流になってる 職場なんかで作ってたらろくなもんできないわ
VBAなんか普通はビール飲みながら自宅でつくるもんだ
そうしないと集中できないだろ よっぽどじゃないと他人向けのマクロは作らない方がいいよなあ
独学だから、頼まれた機能を実現するために仕方なく作った時は気を使った >>848
いや、VBAで作って混乱引き起こすような人はどの言語使っても混乱引き起こすよ。
理路整然と書く人はアセンブラでも綺麗なコードを書く。 ジャンプ命令の後の命令が実行されてからジャンプするような意味不明な設計でそんなこと無理だ PS2のデバッグで出会ったわそれ
Mipsだったかで 数年前までVBAで結構組んでたんだけどちょっと必要があって使ってみたらセーブに10分くらいかかる
調べてみると ごめんなさい途中でかきこんでしまいました
VBAのコードが長いとセーブに時間がかかるとあったのでモジュールを削除してみましたが変化なし
そこで新規にbookを作ってコピペでVBAのコード他すべての要素をコピペしたら普通にセーブできたのですが
これはどういった原因が考えられるでしょうか?
ちなみに別のPCで使ってみたら普通にセーブできました マクロ付きブックの保存なんて普通は1秒で終わる
10分なんてあきらかに異常だし、たとえ10秒でもおかしい
HDDの故障やウィルスをまず疑うレベル そんなことは分かってるから質問してるんですが日本語読めてますか?w >>850
それな
で、職場で仕事がなくなる。なんだかよくわからん状態になる
>>859
ブックの中にゴミデータが溜まってる
・条件付き書式
・名前の定義
特に条件付き書式はコピペで増えるので要注意。vbaでコピペを繰り返すマクロを繰り返すうちに、恐ろしく重くなる事がたまによくある >>862
なるほどそれで新規BOOKにコピペするとごみが消えるから軽くなるってことですね
ありがとうすっきりしました >>837
> 一般的にデバッグはコーディングの10倍ぐらい経験や知識が必要な作業だから初心者には荷が重い
ものすごい納得がいく。プログラムの力のかなりな部分を
設計力とデバッグ力が占めてる気がする。 >>865
あ。禁断のセリフが。
昔の2ちゃんで「氏ね」とか「市ね」とかわざわざ誤字にしてた
理由知らない世代なんだろうなあ…。 >>865
日本語まともに理解できないからしょうがないんだよなw 超初心者です。
10個のブックで、それぞれのブックに同じ名前の4種類のシートがあり、
各シートのE10〜D12に入力されている値を抽出したいんですが、
1つのセルを指定するやり方しかわからず…
できれば10個のブックから一括で抜き取りたいんですけど、どう書けばいいでしょうか。
現時点でできたのはダイアログでファイルを選択して、指定のシートから1つだけ抜き出してくる方法です。
これを複数のセルを抜き出したい(可能なら複数のブック指定して抜き出したい)です。 >>868
別のPCなら普通にセーブできるって言うから、PCの故障を疑ったんでしょう
862の回答だと、別のPCでうまくいく説明になってない
お前のほうが日本語理解できてないんじゃね? >>869
こんな感じで二重ループにする
ブック名やシート名は必要に応じて配列に入れておく
For Bok = 1 To 10
For Sht = 1 To 4
Range(" ") = Workbooks("ブック" & Bok).Worksheets("シート" & Sht).Range("D10:E12").Value
Next
Next もう解決したかもしれんが
保存にやたら時間がかかるエクセルファイルとは自分の経験だと
非表示にされたシートに画像が貼られまくってたって事があったなvba開いてみたらシートが異常に多くて気づいた
パソコンリテラシーない人はこういうファイルを平気でメールで送ろうとするよねw 知らんけどxlsm形式だと社内メールは送れんわうちじゃ ボタンのあるシートを
ボタン削除しないままシート削除して
新たにシートを作るっていうコードにしてたら
無茶苦茶ゴミが溜まってファイルが肥大化した挙げ句、
最終的にボタンを貼り付けられなくなった >>873
リテラシー以前の問題で、何がどうなってるかさっぱりわからない
ただ、開くのに1分ぐらいかかるけどとりあえずは使えるのでつかて下さい、lという感じ >>873
その画像が沢山貼ってあるシートコピーして
VeryHiddenで隠して送りつけてやればいい。
やられたらやり返す
倍返しだ!! ひとつに見えていても2つのボタンが重なっていることもあるぞ VBAのchengeイベントで
セルB1に12、セルC1に3、と入力されたら
D1に12/3と日付が自動で出力され
かつ
C1が空白ならD1も空白
C1が文字ならD1も文字になるようにできるでしょうか?
初心者じみた質問で申し訳ありません >>882
できればVBAでお願いします
わがままですいません >>883
そうか
>D1に12/3と日付が自動で出力され
この場合の、年がわからない
・常に1980年(デフォルト)
・常に「chengeイベント」のあった年
・今が12月なら来年
など >>883
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finalty
'無限ループ回避
Application.EnableEvents = False
'C1セルが空白は終了処理へ
If Cells(1, 3) = "" Then GoTo finalty
'C1セルが文字列の場合は、そのまま放り込む。それ意外は日付
If WorksheetFunction.IsText(Cells(1, 3)) Then
Cells(1, 4).Value = Cells(1, 3).Value
Else
Cells(1, 4).Value = DateSerial(Year(Now()), Cells(1, 2), Cells(1, 3))
End If
'終了処理
finalty:
Application.EnableEvents = True
End Sub
とりあえず作ったけど、B1が文字列、c1が数字の時にエラーになるな
B1とC1で日付判定したほうがよかったのだろうか >>886
「できるでしょうか?」と聞かれているだけなのに引っ掛かる馬鹿 全く内容が同じ投稿を何度も目にしている気がする
その度に丁寧な回答を貰ってるけど
その処理流行ってるの? >>887
大丈夫?
>>889
同じ内容を貼る人:
相手にしてもらえるので、同じ質問を貼り続ける
承認欲求が満たされない人間の末路
回答者:
腕が上がるので気にせずに回答すればオッケー そっか
>>886 だけど空白なら終了よりも空白の時は出力先も空白って条件があるから出力先にClearContentsかけた方が良さそう
その後にB1とC1をそれぞれIsNumericでTrueならB1 & "/" & C1をDatevalueで日付データにして出力先へ
あとはElseで文字列として結合して出力とかどうだろう? >>886
・「C1が空白ならD1も空白」にしないといけないのにやってない
・B1, C1 以外のセルが変更された場合でも無駄な処理が走る
・Cells( ) と Cells( ).Value とバラバラ
・finalty という単語はない >>892
まあ多少エラーがあっても大まかな流れがわかればいいんでねえの?
後は自力だろ
特にエラー処理関連は条件がわからないとやっても無駄だし
>・finalty という単語はない
まずこっから突っ込まないと
>>880
>VBAのchengeイベントで >>883
早速のご返答ありがとうございます
とりあえずB1には文字型は入力されないので、教えて頂いた構文で試してみたいと思いますよ
スレの雰囲気悪くしてすいません
先生たちには
感謝します VB.Netでもgotoとかgosubとかremとか残ってるんだよなぁ
いつになったらこんな負の遺産使えなくするのやら
variantとか早々に消したくせに
先にVB.Netの方が消えてしまいそうだ >>900
DOS時代の古いアプリを移植して使ってるとこが意外とあるらしい
だから昔ながらの行番号なんかも使えるようになってる https://sugoikaizen.com/excel_list/vba-macro-01/
超初心者です。上のサイトを参考に非表示のシートを全表示にするようにしたいのですが、実際に使ってみるとアクティブシート?が切り替わって切り替わってチカチカしてしまいます。
その切り替わりのチカチカ、アクティブを切り替えないでシートを表示させることってできますか application.screenupdating=false
処理
application.screenupdating=true >>892
・「C1が空白ならD1も空白」にしないといけないのにやってない
すまん
・B1, C1 以外のセルが変更された場合でも無駄な処理が走る
ifで分岐させてinsideかInspectorでexitsubだ
・Cells( ) と Cells( ).Value とバラバラ
すまん
・finalty という単語はない
たいぽ
>>897
>Go Toとか草
vbaはエラー処理がエグいので、gotoを使う方が簡潔になる
今回のように、分岐処理が型に依存するような時はあえてエラーを発生させて、gotoでまとめる方が楽
総論としては「trycatch欲しい」だろうな >>901
VBできたのはWindowsになってからだな
DOSのときはMS-Cじゃね 行番号はDOS自体が登場する以前のROM BASIC全盛の頃の話
Microsoft BASICの独自拡張版を各メーカーが移植して搭載してた
FDD普及後も暫くはN88 BASICなどは生き残っていたけどDOS登場後は急速に廃れていった >>906
信長の野望はBASICで作ってあったな シートのデータを
文字コードutf-8、改行コードLFでファイルに書き出す方法教えてください >>909
Excel単体では無理
アドインか、マクロか、外部ツールで変換か UTF-8 でも、BOM の有無で2種類ある。
先頭3バイトが「0xEF 0xBB 0xBF」なら、BOM有り
BOM有りUTF-8
BOM無しUTF-8(UTF-8N)
Windows だけはBOM有りだけど、
一般的に、Linux などのウェブではBOM無し
最近のWindowsでは、BOM無しも使えるかも知れない >>904
先日教えていただいた構文は間違いですか?
今、試したら自分のイメージに近い動作はするような感じです
後は自分で試行錯誤してみたいです
また質問してしまうかもしれませんが
自力でやってみます 空白でないセルの末尾に「様」という文字列を一括追加するマクロを教えてください
置換処理も組み込んで一括で処理したいのでマクロでやりたいです
出来ればコピペで使えるとありがたいです
環境はWin10でExcel2016です
よろしくお願いします 置換も末尾に様を付けるのも関数式で行けるがオートフィルでぶわぁーっとやるんじゃアカンのか?
マクロでやっても処理内容的にはあまり変わらんぞ? この先をずっと繰り返す作業なので、複数の置換と文字列付加を1つのマクロにまとめたいのです いつものあいつの釣りとあまりに馬鹿過ぎる質問はお断りです
また、Excelの使い方すらわからない人はお帰りください >>914
俺も>>915と同意見で、関数かオートフィルでいいと思う。常時必要なら、関数の作業列を作ってそれを参照するとか
それでもいいなら
A列が名前の場合。
Sub Macro3()
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
For i = 最終行 To 1 Step -1
If Cells(i, 1).Value <> "" Then Cells(i, 1).Value = Cells(i, 1).Value & "様"
Next
End Sub 何回もマクロ動かして 山田様様 ってなってわけわからんようになる >>919
まぁこれは直接書き換える案件じゃないんだよな
名前列 & (”様”|"御中")が良い
このやり方だと、最後が「様」で終わる名字があるとバグるんだよな。昔、「羽様」って顧客からクレームがあって「いいんですけどね・・・」って感じだった
まぁ、珍しい名前だしいいと思う >>913
致命傷は一点
・「C1が空白ならD1も空白」にしないといけないのにやってない
以下のコードで直した
・B1, C1 以外のセルが変更された場合でも無駄な処理が走る
重い処理じゃない。どうせ入力箇所増える
重いなら>>904の内容で修正するか再度聞けば良い
・Cells( ) と Cells( ).Value とバラバラ
どうでもいい
Cells( )はCells( ).Valueに解釈される
暇なら統一すれば良い。特に意味はない
・finalty という単語はない
どうでもいい
もちろんfinalityの打ち間違えは認める
変数名なんてなんでもいい
自己弁護でもないが、そのためにも関数やクラスは影響が最小限に済むように、短くまとめる必要がある >>920
> 昔、「羽様」って顧客から
岡山県赤磐市か奈良県生駒市かな? >>922
東京か埼玉、もしくは神奈川。そもそも「羽様」様、以外にも最後が「様」になる名字はそれなりにいるぞ >>921
のコード書き忘れてたわ
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finalty
'無限ループ回避
Application.EnableEvents = False
'C1セルが空白は終了処理へ
If Cells(1, 3) = "" Then
Cells(1, 4) = ""
GoTo finalty
End If
'C1セルが文字列の場合は、そのまま放り込む。それ意外は日付
If WorksheetFunction.IsText(Cells(1, 3)) Then
Cells(1, 4).Value = Cells(1, 3).Value
Else
Cells(1, 4).Value = DateSerial(Year(Now()), Cells(1, 2), Cells(1, 3))
End If
'終了処理
finalty:
Application.EnableEvents = True
End Sub >>914
Sub hoge()
Dim targetRange As Range
Dim targetCell As Range
Set targetRange = ThisWorkbook.Sheets(Sheet1.Name).Range("A1:J10")
For Each targetCell In targetRange.Cells
If targetCell.Value <> vbNullString Then
If Right(targetCell.Value, 1) <> "様" Then
targetCell.Value = targetCell.Value & "様"
End If
End If
Next
End Sub
対象シートを変えるならSheets(Sheet1.Name)のSheet1の部分を変えてくれ
シート名じゃなくてシートのオブジェクト名であることに注意な。
今はA1から下10セル、右10セルの範囲に絞っているが、変えたければ
Range("A1:J10")の部分を変えてくれ。 >>914
文字列追加じゃなくて表示形式で対応したらどうだろ
セルの元データを書き換えるのはなんか嫌らしい感じがする
Selection.NumberFormatLocal = "@ ""様""" >>930
マイナス、0、プラス、文字列で分岐できる
どこかにそのフラグを持たせれば分岐できるが・・・それなら最初から様と御中書いたほうが早い >>931
基本は様でフラグ立てたところだけ御中とか つーか普通敬称つけるのは印刷するときだけじゃね
エクセルのデータに組み込む必要ないような >>935
イカに様付けるとイカサマだな
楽しいのか? 銀行の「行」を消して「御中」に直してた画像あったな だいえーだいえーいえぃいえぃいえぃいえぃ。
だいえーとってもいえぃいえぃいえぃいえぃ。
↓続き。 >空白でないセルの末尾に「様」という文字列を一括追加
これ、今「様」がついてたらつけるなっていう要件じゃないんじゃね
そうじゃないなら、羽様が、羽さん様なのか羽様さんなのか区別できるデータじゃないと不可能だぜ
普通に考えて名称と敬称と分けてもつだろ 5chはおじいさんの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。 もう25年前に近くのダイエーなくなってダイクマになった(もうそれもなくなってマンションになってるけど)
一駅先にグルメシティの形で残ってるけどほとんど行かない ここまでの情報で、神奈川県秦野市ではないか?と自作AIがはじき出しましたが。
あってる? >>949
合ってる
ダイクマ発祥の地なのでAIなら楽勝かとw 神奈川県秦野市の東海大学前のグルメシティは、元は忠実屋というスーパーだった
ダイエーに買収された後グルメシティに変わった
ステッカーの下には今でも忠実屋のロゴマークが残ってる
店の床に小さい段差があるのは増築した痕跡 ジジイしかいないスレ
VBAなんていまだにやってるのは、ジジイくらいしかいないか ダイクマって
あの「ダイナミックダイクマ〜!!」の
ダイクマ? A1に月、B1に最初の日、B2に最後の日を入力したら
C列に最初の日から最後の日まで書き出され
D列には月/日が書き出されるようにしたいのですが
例えば
A B C D
12 19 19 12/19
22 20 12/20
21 12/21
22 12/22
上記のように各セルがチェンジイベントで動作してくれればと
それと文字などがB2に入力された場合は文字をC2、D2に反映したいです
A B C D
12 19 19 12/19
h h h
ここで色々お教えいただきそれらの構文を自分なりに組み合わせてみたのですが
初心者の私にはレベルが高すぎるようで・・・
今までご親切にお教えいただいた構文を生かしてなく申し訳ありません。 >>958
> A1に月、B1に最初の日、B2に最後の日を入力したら
> C列に最初の日から最後の日まで書き出され
> D列には月/日が書き出されるようにしたいのですが
>
> 例えば
> A B C D
> 12 19 19 12/19
> 22 20 12/20
> 21 12/21
> 22 12/22
>
>
> 上記のように各セルがチェンジイベントで動作してくれればと
>
> それと文字などがB2に入力された場合は文字をC2、D2に反映したいです
>
>
> A B C D
> 12 19 19 12/19
> h h h
>
> ここで色々お教えいただきそれらの構文を自分なりに組み合わせてみたのですが
> 初心者の私にはレベルが高すぎるようで・・・
>
> 今までご親切にお教えいただいた構文を生かしてなく申し訳ありません。 間違えがありましたので連続投稿になってしまいましたが
ご教授ください >>959
> >>958
> > A1に月、B1に最初の日、B2に最後の日を入力したら
> > C列に最初の日から最後の日まで書き出され
> > D列には月/日が書き出されるようにしたいのですが
> >
> > 例えば
> > A B C D
> > 12 19 19 12/19
> > 22 20 12/20
> > 21 12/21
> > 22 12/22
> >
> >
> > 上記のように各セルがチェンジイベントで動作してくれればと
> >
> > それと文字などがB2に入力された場合は文字をC2、D2に反映したいです
> >
> >
> > A B C D
> > 12 19 19 12/19
> > h h h
> >
> > ここで色々お教えいただきそれらの構文を自分なりに組み合わせてみたのですが
> > 初心者の私にはレベルが高すぎるようで・・・
> >
> > 今までご親切にお教えいただいた構文を生かしてなく申し訳ありません。 hの位置がずれていました
朝から連続投稿すいません! 必要な仕様が足りない
・B2よりB1が大きい場合は動作しない?それとも翌月のその日までを記載?
・B1,B2に入力された数値が日付として有り得ない場合はどうする?動作しないだけでよいのか?
・年の判定はどうする?現在の年を使用してよいのか? >>963
> 必要な仕様が足りない
失礼しました
> ・B2よりB1が大きい場合は動作しない?それとも翌月のその日までを記載?
B1の方が大きければ空白になってくれればいいのですが
エラー表示がセルに表示されてもエラーはエクセルの設定で空白にできるので大丈夫かと思っています
月をまたぐことはありません
> ・B1,B2に入力された数値が日付として有り得ない場合はどうする?動作しないだけでよいのか?
122/111や12/35と表示されてもかまいません
文字が入力されてもそのまま表示したいです
> ・年の判定はどうする?現在の年を使用してよいのか?
年は考慮しなくても大丈夫です
長くて一週間の予定だけでしか使用しません
説明下手ですいません (汗 Dim a(10,20)
a(1,2)=3
上で2行目の1や2の数字のことを何て言うのでしょうか
初歩の質問で申し訳ありません。 あるソフトウェアが出力する
ログファイル(テキストファイルで行数は不定)をスペース区切りで文字列として読み込むコードを書いているのですが
ログファイルの先頭行のスペースの数が一定ではなく
単純に読み込むと先頭の数値が
A列目に入ったりB列目、C列目に入ったりして困っております
連続するスペースを一つのデリミタとして扱うか
(そうすればA列だけが空白になる)
もしくは先頭に連続して入っているスペースを無視する方法を探しているのですが見当たりません
皆様のお力添えをお願い致します >>970
自己レス
> 連続するスペースを一つのデリミタとして扱うか
> (そうすればA列だけが空白になる)
この方法は使えない事に気づきました
ログファイルの先頭(左端)
に数値が入っている場合もあるので
スペースが一つでも入っている場合では、入力される列が
A列とB列に変わってしまいます
先頭(左端)に連続して入っているスペースを無視する方法しか
無いかもしれません 連続レス申し訳ありません
必要な処理はもうちょっと複雑でした
GetOpenFilenameで開いたファイルを
Workbooks.Open(FileN,Format:=3,ReadOnly:=True)
で処理しているのですが
ログファイルの行中に連続して入っているスペースも一つずつカウントして空白列を作ってしまいます
必要な処理は
1) 連続したスペースを一つのデリミタとして区切り
2) 行先頭にスペースが入っていた場合は最初の文字が始まるまで削除もしくは無視する
といったものになると思います
何卒ご助力お願い致します >>975
それって固定長じゃないの?
全銀データみたいな奴
固定長なら、文字数数えて、データ区切り使ったほうが早いと思う 皆様ご回答ありがとうございます
>>972
ありがとうございます
正規表現は私にはちょっと敷居が高いようです
>>974
ありがとうございます
LTRIMで一度先頭スペースを抜いた中間ファイルを作るというのは
一つの手順としてあるかと思います
>>976
ありがとうございます
途中でエラーメッセージ行とかが
入るので全ての行が固定長
と言うわけではないのですが
データを処理したい行は固定長に近いです
問題は処理したい行の先頭に0〜3個のスペースが入ることです >>975
1行ずつ読み込んで事前処理するのがいいんじゃね
------------------------
行=1
列=1
Open filename for Input as #1
Do until EOF(1)
Line Input #1, str '一行ずつ読み込み
str=Trim(str) '両端の空白除去
arr=Split(str," ") '空白で分割し配列に格納
for i=1 to arr.Ubound(arr) 'セルに書き込み
Cells(行,列+i).Value=arr[i]
next i
行=行+1
Loop
close #1
----------------------------- >>966
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Union(Me.Range("A1"), Me.Range("B1"), Me.Range("B2"))) Is Nothing Then
If Me.Range("A1").Value <> "" And Me.Range("B1").Value <> "" And Me.Range("B2").Value <> "" Then
Me.Columns(3).ClearContents
If Me.Columns(3).NumberFormatLocal <> "@" Then Me.Columns(3).NumberFormatLocal = "@"
If IsNumeric(Me.Range("A1").Value) And IsNumeric(Me.Range("B1").Value) And IsNumeric(Me.Range("B2").Value) And Me.Range("B1").Value <= Me.Range("B2").Value Then
Dim OutAry() As String
ReDim OutAry(Me.Range("B1").Value To Me.Range("B2").Value)
Dim RowCnt As Long
For RowCnt = LBound(OutAry) To UBound(OutAry)
OutAry(RowCnt) = Me.Range("A1") & "/" & RowCnt
Next RowCnt
Range(Me.Cells(1, 3), Me.Cells(UBound(OutAry) - LBound(OutAry) + 1, 3)).Value = WorksheetFunction.Transpose(OutAry)
End If
End If
End If
Application.EnableEvents = True
End Sub >>978
ありがとうございます
私も一行ずつ処理するべきなのかと思い始めました
その際
----------------
arr=Split(str," ") '空白で分割し配列に格納
----------------
だとデータ行中に空白が連続している場合
例えば
a b c d
のような場合でも
A列→a
B列→b
C列→c
D列→d
のように入力可能でしょうか? >>980
わかりづらい説明にご親切にありがとうございます
感謝!
今から試したいと思います! >>981
そんなもんマクロの記録で連続する区切り文字は1文字として扱うオプション使えばいいでしょ Ruby なら、abc の前後・間に、複数の連続した空白類があっても、分割できる
Ruby で,文字列を空白文字類や「.」などを区切りとして切り出す
https://www.kkaneko.jp/pro/ruby/tokenize.html
str = " a b c "
p str.split( nil )
p str.strip.split( /\s+/ )
p str.strip.split( /[ |\t|\r|\n|\f]+/ )
これらはすべて、["a", "b", "c"] となる
空白類・\s は、[ |\t|\r|\n|\f] の5種類の空白を含む。
strip は、文字列の先頭・末尾から、連続した空白類を除去する >>980
すみません
今試してみました
C列には期間の日が表示され
D列には機関の月日が表示され
仮にB2に文字が入力されたら
C2とD2には文字が表示され
C1とD1には日と月日が表示したいです
私にはなにをどうしたらいいのかまったくわかりませんでした
技術的にむずかしいでしょうか?
ググってみましたが出来そうにないです >>981
その場合はtrim, splitの替わりに正規表現使うのがいいかと
dim reg as new regexp
reg.global=true
reg.pattern="(\S+)" '空白以外
set mc=reg.execute(str)
for i to mc.count-1
set m=mc.item(i)
cells(1,i).value=m.value
next i >>981
これで代入できる
Range("A1:D1") = Split(str, " ") >>983
!
ありがとうございます
やってみます
>>984
ありがとうございます
さすがにExcelで処理しているファイルをVBA以外で制御するのは無理です
>>987
ありがとうございます
正規表現は敷居が高い(奥深すぎ)ので敬遠していましたが
そのコードを手がかりに解析してみます
a b c d
a b c d
a b c d
のような場合でも
そのコードは使えますでしょうか? >>988
ありがとうございます
この場合も処理可能でしょうか?
a b c d
a b c d
a b c d ファイルを開いてVBAで処理する系は
VBAのエディタがアップデート放棄しててユニコードに対応しないらしいのでやめた方がいいかも
Regexpでユニコード文字列を置き換える処理をこさえたりすればなんとかなるかもしれないが >>992
ご注意ありがとうございます
私の場合であれば処理するlogは
ASCIIのみなので問題ないかと思います >>986
ごめん
ちょっと何を言っているのか分からないからもう少し整理してから言葉にして
文字列や日付として破綻しているものでも可なのにその期間を出力せよっていうのはどういう意味?
仕様がちぐはぐで何をしたいのかが分からない
出力列を増やすのはのは対して手間は変わらないから自分でアレンジして
分からないならもっと基礎の部分を勉強するか諦めて関数式書いた方が早いよ >>995
すいません
関数を使ってみたいとおもいます
これか自分で勉強しレベルを上げていきたいと思います
あなたのおっしゃるとおりだと思います
今までお教えいただいたことを参考に
勉強していきたいと思います
ここの先生たちには本当に感謝しています このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 13時間 51分 43秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。