[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/17 16:56 / Filesize : 280 KB / Number-of Response : 1024
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part82



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/

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 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<280KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef