[過去ログ] Excel VBA 質問スレ Part82 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
959
(1): 06/07(土)09:36 ID:zGsllLLl(1) AAS
>>954
その冗長なコードとやらを貼ってみれば何が悪いか指摘してもらえると思うぞ
960: 06/07(土)10:26 ID:pGBLBsE0(1) AAS
.netの文字列操作ライブラリとか見たらいたせりつくせりで贅沢過ぎるわ!って怒り出しそう
961
(1): 06/07(土)12:33 ID:NHsDgqoS(1/4) AAS
タスクバーのアイコンを取得したくて、下記のサイトのC#をVBAに移植しても、Excelがハングアップする
C#ではちゃんと動く
なぜ?

Dim pUIAutomation As New CUIAutomation
Dim windowElementTray As IUIAutomationElement
Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hTaskBar)


外部リンク:learn.microsoft.com
962
(1): 06/07(土)13:25 ID:QQtzQfGp(2/6) AAS
外部リンク:qiita.com
↑ここの人がVBAで似たようなことやってますね
GetReferenceElementという関数の中に >>961 と同等のコードが書かれているから
hTaskBarの値がおかしいんじゃないの?

これでブラウザの自動操縦できるのかぁ 便利そうだな
963: 06/07(土)13:32 ID:NHsDgqoS(2/4) AAS
>>962
このサイトも見た
hTaskBarの値は、C#版とVBA版で同じ値だったので、正しいと思う。

Chromeのウィンドウハンドルでやった場合は、ちゃんと動いた
964
(1): 06/07(土)13:58 ID:QQtzQfGp(3/6) AAS
これで最後の行まで動いたよ

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 "終わり"
965
(1): 06/07(土)14:07 ID:QQtzQfGp(4/6) AAS
もうひとつの方もこれで動いた

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 "終わり"
966
(1): 06/07(土)15:15 ID:NHsDgqoS(3/4) AAS
>>965
あ、
Windows 11だと動かないな…

>>964のタスクバーのボタンは動いたけど、
>>965のトレイアイコンは、最後の1行で、やっぱExcelごとハングアップで強制終了するわ
(Set windowElementTray = pUIAutomation.ElementFromHandle(ByVal hWndToolbar))

C#版は、>>965のトレイアイコンもちゃんと動くんだけど…
967
(4): 06/07(土)16:04 ID:I++ihMYF(1/2) AAS
>>959
例えばファイルシステムで
フォルダ1の中から指定の文字列を含むフォルダを探して
見つかったフォルダのパスを取得して
さらにそのフォルダの中から指定の文字列を含むフォルダを探して
見つかったフォルダのパスを取得して
そのフォルダの中に指定のフォルダがあるか確認してなかった場合はフォルダを作成するコードです
2〜3回同じ様な事を繰り返しているので冗長な気がしてなりません
968: 06/07(土)16:09 ID:WTKqP7i+(1) AAS
>>967
それそのままAIに投げたら一瞬で書いてくれるよ
969: 947 06/07(土)16:28 ID:ADmBeqPj(1) AAS
>>948 949, 950
ありがとうございます

マイクロソフトのサイトは機械翻訳がどうも…、と敬遠していましたが、参照してみます
それから洋書、かぁ…
970
(1): 06/07(土)17:36 ID:hTJ86lb5(2/2) AAS
>>967
それを平で書いてるなら冗長
再帰処理でやるのがあるべき姿
まずは指定フォルダ下の全フォルダを出力する再帰処理書いてみ
(全てが再帰処理ではない。呼び出し元処理と再帰処理の2つ書くことになる。念の為)
971
(1): 06/07(土)17:47 ID:QQtzQfGp(5/6) AAS
>>966
Windows11はタスクバーに使われてるクラスが変わってるらしいから関係あるかもよ
外部リンク[php]:www.autohotkey.com
AHKにクラス名を調べるツールがついてたような
972: 06/07(土)17:55 ID:nK7i38Q0(1) AAS
>>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
あとは関数の中身を書くだけ
973: 06/07(土)18:21 ID:QQtzQfGp(6/6) AAS
>>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
974: 06/07(土)18:49 ID:NHsDgqoS(4/4) AAS
>>971
んー

でも、C#ではちゃんと動くので、VBA側の問題な気が…
クラスが変わってるのも知ってる。
975
(1): 06/07(土)22:19 ID:I++ihMYF(2/2) AAS
>>970
やっぱりそうですよね
再帰処理を頑張って覚えます
976
(2): 06/08(日)02:30 ID:bVJzS0fI(1/2) AAS
>>975
そやね
たったこれだけでフォルダ階層どこまでも潜れるのかと感動すると思う
(かもしれないw)
フォルダ再帰ができたら各全ファイル名列挙も再帰処理の中に追加しとき
いつか使う時が来る
977
(1): 06/08(日)03:49 ID:kACuu3za(1) AAS
こんなので偉そうにする馬鹿
978
(1): 06/08(日)10:13 ID:szoadHGe(1) AAS
>>977
わざわざ「私バカです」って手を挙げて出てきてどうした
979: 897 06/08(日)10:59 ID:BE7fUg1L(1/2) AAS
>>976
昔だったら stack overflowとか心配してたけど今はあまり気にしなくて良さそうだね
980
(1): 06/08(日)11:01 ID:j4jIPbHU(1/2) AAS
.netのAPIラッパー関数もソース見ると大抵泥臭い事やってんのよね
981
(1): 06/08(日)11:03 ID:4qkaLQIW(1) AAS
スタック領域は昔からほとんど変わってないから気にする必要はある
982
(1): 06/08(日)11:07 ID:j4jIPbHU(2/2) AAS
Excel VBA 質問スレ Part83
2chスレ:tech
983
(1): 897 06/08(日)11:11 ID:BE7fUg1L(2/2) AAS
>>982
乙彼
>>981
共有サーバのアドレス変わった時、全フォルダの奥までショートカット探して書き換えたけど
何ともなかったからそんなもんだと思ってた
984
(1): 06/08(日)12:43 ID:gXHyLlYW(1) AAS
>>976
再帰処理のコード自体はわかるのですが、If文で再帰処理をする、しないまでは考えてなかったです
985: 06/08(日)14:43 ID:bVJzS0fI(2/2) AAS
>>984
if?
途中から折り返す時のこと?
それなら必要
986: 06/08(日)16:28 ID:46RFXcFD(1) AAS
2階層しか掘らないのにわざわざ再帰処理にするかなぁ
987: 06/08(日)16:56 ID:DI4VVn6/(1) AAS
>>978
構ってもらうのも大変なんだぞ
察してあげなきゃ
988: 06/08(日)17:17 ID:8915HtnW(1) AAS
>>983
スタックさせたまま全ファイル走査なんてしないだろうから、
ファイルの数何個あろうが同じでは?
1-
あと 14 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.031s