1 名前:デフォルトの名無しさん [2025/01/24(金) 03:31:15.25 ID:l239yW+P.net] ExcelのVBAに関する質問スレ コード書き込みや作成依頼もOK 次スレは>>980 が立てること 無理なら細かく安価指定 関連スレ Excel VBA 質問スレ Part79(ワッチョイあり) https://mevius.5ch.net/test/read.cgi/tech/1674875532/ Excel VBA 質問スレ Part80(ワッチョイあり) https://mevius.5ch.net/test/read.cgi/tech/1700826110/ ※前スレ Excel VBA 質問スレ Part79 https://mevius.5ch.net/test/read.cgi/tech/1674874007/ Excel VBA 質問スレ Part80 https://mevius.5ch.net/test/read.cgi/tech/1685489018/ Excel VBA 質問スレ Part81 https://mevius.5ch.net/test/read.cgi/tech/1713416618/
970 名前:デフォルトの名無しさん mailto:sage [2025/06/06(金) 18:52:09.71 ID:4a1tHPn5.net] COMの解説 https://learn.microsoft.com/ja-jp/windows/win32/com/component-object-model--com--portal
971 名前:デフォルトの名無しさん [2025/06/06(金) 19:13:06.68 ID:fJneNGsq.net] >>939 TYPEは他のオブジェクトに引き渡せないとは聞いていました 結局ディクショナリーで登録しました
972 名前:デフォルトの名無しさん [2025/06/06(金) 20:17:15.03 ID:tc8PGxli.net] >>951 ディクショナリだとインテリ使えんけど、まあそれでいいなら
973 名前:デフォルトの名無しさん mailto:sage [2025/06/06(金) 20:34:48.52 ID:2QLQ97JJ.net] たまにいる勘違い人間 「自分、CやJavaできるから低レベルのVBA(笑)なんてすぐマスターできるし」とか豪語するヤツ
974 名前:デフォルトの名無しさん [2025/06/06(金) 21:03:29.16 ID:fJneNGsq.net] 私はファイルパスやフォルダパスの取得や設定、ファイル名やフォルダ名の作成に冗長なコードを書いている気がしてならないのですが、何かいいコードはないでしょうか?
975 名前:897 [2025/06/06(金) 21:52:26.62 ID:CfJ/EVmD.net] Typeの代わりにRecordSet使ったりする Field設定いちいちするの面倒だけど Filterとか使えるしCopyFromRecorSetとかできるし
976 名前:デフォルトの名無しさん [2025/06/07(土) 01:20:40.40 ID:hTJ86lb5.net] >>954 昔はdirやnameだったけど、今はfso使ってればいいんじゃね
977 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 04:19:49.26 ID:GCIZhVy1.net] >>954 その程度の処理なら、冗長で困ることなんかほとんどないよ 自分に理解できる形で書くのが、長い目で見れば一番保守性が高いんだから ちゃんと
978 名前:動いてる物を直そうとして壊すことも多いから、そっとしとけ [] [ここ壊れてます]
979 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 07:03:08.54 ID:QQtzQfGp.net] >>954 末尾の円マーク有無で毎回処理を分岐させてるのならBuildPathを使え
980 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 09:36:28.54 ID:zGsllLLl.net] >>954 その冗長なコードとやらを貼ってみれば何が悪いか指摘してもらえると思うぞ
981 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 10:26:27.74 ID:pGBLBsE0.net] .netの文字列操作ライブラリとか見たらいたせりつくせりで贅沢過ぎるわ!って怒り出しそう
982 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 12:33:58.98 ID:NHsDgqoS.net] タスクバーのアイコンを取得したくて、下記のサイトのC#をVBAに移植しても、Excelがハングアップする C#ではちゃんと動く なぜ? Dim pUIAutomation As New CUIAutomation Dim windowElementTray As IUIAutomationElement Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hTaskBar) ↓ https://learn.microsoft.com/en-us/answers/questions/115440/how-to-find-taskbar-button-screen-rect-of-a-window
983 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 13:25:32.25 ID:QQtzQfGp.net] https://qiita.com/Mrs_P/items/5c8070fd880b9deb284a ↑ここの人がVBAで似たようなことやってますね GetReferenceElementという関数の中に >>961 と同等のコードが書かれているから hTaskBarの値がおかしいんじゃないの? これでブラウザの自動操縦できるのかぁ 便利そうだな
984 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 13:32:49.76 ID:NHsDgqoS.net] >>962 このサイトも見た hTaskBarの値は、C#版とVBA版で同じ値だったので、正しいと思う。 Chromeのウィンドウハンドルでやった場合は、ちゃんと動いた
985 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 13:58:10.47 ID:QQtzQfGp.net] これで最後の行まで動いたよ Dim hWndTray As LongPtr: hWndTray = FindWindow("Shell_TrayWnd", vbNullString) Dim hWndRebar As LongPtr: hWndRebar = FindWindowEx(hWndTray, 0, "ReBarWindow32", vbNullString) Dim hWndMSTaskSwWClass As LongPtr: hWndMSTaskSwWClass = FindWindowEx(hWndRebar, 0, "MSTaskSwWClass", vbNullString) Dim hWndMSTaskListWClass As LongPtr: hWndMSTaskListWClass = FindWindowEx(hWndMSTaskSwWClass, 0, "MSTaskListWClass", vbNullString) Dim pUIAutomation As New CUIAutomation Dim windowElementTray As IUIAutomationElement Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hWndMSTaskListWClass) MsgBox "終わり"
986 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 14:07:56.34 ID:QQtzQfGp.net] もうひとつの方もこれで動いた Dim hWndTray As LongPtr: hWndTray = FindWindow("Shell_TrayWnd", vbNullString0) Dim hWndTrayNotify As LongPtr: hWndTrayNotify = FindWindowEx(hWndTray, 0, "TrayNotifyWnd", vbNullString) Dim hWndSysPager As LongPtr: hWndSysPager = FindWindowEx(hWndTrayNotify, 0, "SysPager", vbNullString) Dim hWndToolbar As LongPtr: hWndToolbar = FindWindowEx(hWndSysPager, 0, "ToolbarWindow32", vbNullString) Dim pUIAutomation As New CUIAutomation Dim windowElementTray As IUIAutomationElement Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hWndToolbar) MsgBox "終わり"
987 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 15:15:58.64 ID:NHsDgqoS.net] >>965 あ、 Windows 11だと動かないな… >>964 のタスクバーのボタンは動いたけど、 >>965 のトレイアイコンは、最後の1行で、やっぱExcelごとハングアップで強制終了するわ (Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hWndToolbar)) C#版は、>>965 のトレイアイコンもちゃんと動くんだけど…
988 名前:デフォルトの名無しさん [2025/06/07(土) 16:04:31.64 ID:I++ihMYF.net] >>959 例えばファイルシステムで フォルダ1の中から指定の文字列を含むフォルダを探して 見つかったフォルダのパスを取得して さらにそのフォルダの中から指定の文字列を含むフォルダを探して 見つかったフォルダのパスを取得して そのフォルダの中に指定のフォルダがあるか確認してなかった場合はフォルダを作成するコードです 2〜3回同じ様な事を繰り返しているので冗長な気がしてなりません
989 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 16:09:10.87 ID:WTKqP7i+.net] >>967 それそのままAIに投げたら一瞬で書いてくれるよ
990 名前:947 mailto:sage [2025/06/07(土) 16:28:51.74 ID:ADmBeqPj.net] >>948 , 949, 950 ありがとうございます マイクロソフトのサイトは機械翻訳がどうも…、と敬遠していましたが、参照してみます それから洋書、かぁ…
991 名前:デフォルトの名無しさん [2025/06/07(土) 17:36:52.86 ID:hTJ86lb5.net] >>967 それを平で書いてるなら冗長 再帰処理でやるのがあるべき姿 まずは指定フォルダ下の全フォルダを出力する再帰処理書いてみ (全てが再帰処理ではない。呼び出し元処理と再帰処理の2つ書くことになる。念の為)
992 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 17:47:31.26 ID:QQtzQfGp.net] >>966 Windows11はタスクバーに使われてるクラスが変わってるらしいから関係あるかもよ https://www.autohotkey.com/boards/viewtopic.php?style=19&t=108539 AHKにクラス名を調べるツールがついてたような
993 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 17:55:49.45 ID:nK7i38Q0.net] >>967 こんなのかな >フォルダ1(Path1)の中から指定の文字列を含むフォルダ(Pattern1)を探して見つかったフォルダのパス(Path2)を取得する Path2 = GetPatternPath(Path1, Pattern1) As String >さらにそのフォルダ(Path2)の中から指定の文字列(Pattern2)を含むフォルダを探して >見つかったフォルダのパス(Path3)を取得する Path3 = FindPatternPath(Path2, Pattern2) As String >そのフォルダ(Path3)の中に指定のフォルダ(Pattern3)があるか確認してなかった場合はフォルダを作成するコードです result = CheckPatternPath(Path3, Pattern3) As Boolean If result Then Call MakePatternPath(Path3, Pattern3) End If あとは関数の中身を書くだけ
994 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 18:21:21.32 ID:QQtzQfGp.net] >>967 ShiteiNoMojiretsu = "指定の文字列" Shitei = "指定" Path = "C:\フォルダ1" Path = Path & "\" & Dir(Path & "\*" & ShiteiNoMojiretsu & "*", vbDirectory) Path = Path & "\" & Dir(Path & "\*" & ShiteiNoMojiretsu & "*", vbDirectory) If Dir(Path & "\" & Shitei, vbDirectory) = "" Then MkDir Path & "\" & Shitei End If
995 名前:デフォルトの名無しさん mailto:sage [2025/06/07(土) 18:49:45.58 ID:NHsDgqoS.net] >>971 んー でも、C#ではちゃんと動くので、VBA側の問題な気が… クラスが変わってるのも知ってる。
996 名前:デフォルトの名無しさん [2025/06/07(土) 22:19:45.07 ID:I++ihMYF.net] >>970 やっぱりそうですよね 再帰処理を頑張って覚えます
997 名前:デフォルトの名無しさん [2025/06/08(日) 02:30:07.18 ID:bVJzS0fI.net] >>975 そやね たったこれだけでフォルダ階層どこまでも潜れるのかと感動すると思う (かもしれないw) フォルダ再帰ができたら各全ファイル名列挙も再帰処理の中に追加しとき いつか使う時が来る
998 名前:デフォルトの名無しさん [2025/06/08(日) 03:49:16.50 ID:kACuu3za.net] こんなので偉そうにする馬鹿
999 名前:デフォルトの名無しさん [2025/06/08(日) 10:13:48.24 ID:szoadHGe.net] >>977 わざわざ「私バカです」って手を挙げて出てきてどうした
1000 名前:897 [2025/06/08(日) 10:59:09.81 ID:BE7fUg1L.net] >>976 昔だったら stack overflowとか心配してたけど今はあまり気にしなくて良さそうだね
1001 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 11:01:04.08 ID:j4jIPbHU.net] .netのAPIラッパー関数もソース見ると大抵泥臭い事やってんのよね
1002 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 11:03:50.75 ID:4qkaLQIW.net] スタック領域は昔からほとんど変わってないから気にする必要はある
1003 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 11:07:37.10 ID:j4jIPbHU.net] Excel VBA 質問スレ Part83 https://mevius.5ch.net/test/read.cgi/tech/1749348402/
1004 名前:897 [2025/06/08(日) 11:11:01.02 ID:BE7fUg1L.net] >>982 乙彼 >>981 共有サーバのアドレス変わった時、全フォルダの奥までショートカット探して書き換えたけど 何ともなかったからそんなもんだと思ってた
1005 名前:デフォルトの名無しさん [2025/06/08(日) 12:43:48.49 ID:gXHyLlYW.net] >>976 再帰処理のコード自体はわかるのですが、If文で再帰処理をする、しないまでは考えてなかったです
1006 名前:デフォルトの名無しさん [2025/06/08(日) 14:43:09.01 ID:bVJzS0fI.net] >>984 if? 途中から折り返す時のこと? それなら必要
1007 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 16:28:21.07 ID:46RFXcFD.net] 2階層しか掘らないのにわざわざ再帰処理にするかなぁ
1008 名前:デフォルトの名無しさん [2025/06/08(日) 16:56:20.91 ID:DI4VVn6/.net] >>978 構ってもらうのも大変なんだぞ 察してあげなきゃ
1009 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 17:17:56.33 ID:8915HtnW.net] >>983 スタックさせたまま全ファイル走査なんてしないだろうから、 ファイルの数何個あろうが同じでは?
1010 名前:デフォルトの名無しさん mailto:sage [2025/06/08(日) 19:19:30.01 ID:4BwIalv3.net] ソース的に簡単にするなら全ファイルのフルパス取って正規表現だな
1011 名前:デフォルトの名無しさん [2025/06/09(月) 07:30:24.52 ID:UIpY0QNU.net] フォルダのショートカットファイルがある場合の動作確認はした方がいいぞ
1012 名前:デフォルトの名無しさん mailto:sage [2025/06/09(月) 08:19:56.01 ID:EHQrQQev.net] シンボリックリンクとジャンクションとハードリンクも動作確認した方がいいぞ パスが255文字超えた場合も動作確認した方がいいぞ
1013 名前:デフォルトの名無しさん [2025/06/10(火) 20:52:05.68 ID:RKOrDLCJ.net] VBAのfor eachやfor nextでif文を使用して条件に合わなかった時にnext するにはどうしたらいいでしょうか?
1014 名前:デフォルトの名無しさん mailto:sage [2025/06/10(火) 21:05:38.20 ID:94f6xD2K.net] forの中をDo-Loopで囲んで脱出したい時はExit Doする
1015 名前:デフォルトの名無しさん mailto:sage [2025/06/10(火) 21:05:45.22 ID:zK5HBYNC.net] >>992 VBAでFor EachやFor Nextループ中に条件に合わない場合に次のループに進むには、If文を使い、条件が合致した場合のみ処理を記述します。 ' For Each の例 For Each item In collection If 条件 Then ' 条件に合った場合の処理をここに書く End If Next item ' For Next の例 For i = 1 To 10 If 条件 Then ' 条件に合った場合の処理をここに書く End If Next i Elseブロックを記述しないことで、条件が合わない場合は自動的に次のループへ進みます。
1016 名前:デフォルトの名無しさん mailto:sage [2025/06/10(火) 21:17:29.25 ID:KLsW+s5l.net] next の手前にgoto
1017 名前:デフォルトの名無しさん [2025/06/10(火) 21:35:49.89 ID:chtn5cci.net] gotoでnext前のラベルに飛ぶ。ラベルは CONTINUE_1: など
1018 名前:897 [2025/06/10(火) 21:41:20.79 ID:4RtejL7X.net] C言語の呪いから解けずにGoTo使いにくい俺
1019 名前:デフォルトの名無しさん mailto:sage [2025/06/10(火) 21:55:14.34 ID:qJv58WHL.net] 無理して使うもんじゃない そもそもifで処理せずにnextさせたいなら、 逆にifで処理させれば条件に当てはまらなければnextになるんだし
1020 名前:デフォルトの名無しさん [2025/06/10(火) 21:57:34.45 ID:YNq6kTxr.net] 馬鹿ばっかで呆れるスレ
1021 名前:デフォルトの名無しさん [2025/06/10(火) 21:58:07.04 ID:YNq6kTxr.net] 馬鹿ばっか
1022 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 137日 18時間 26分 52秒
1023 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています