質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1019閲覧

VBAで印刷ダイアログを操作して印刷を自動化したいです

kakerukyun

総合スコア11

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/10/18 07:15

IE上で開いたpdfを連続で印刷したく、その際に印刷設定を変えたいため印刷ダイアログを操作したいです。

以下の質問を参考にしました。
https://teratail.com/questions/282475

該当のソースコード

VBA

1Dim oyaHwnd As LongPtr 2oyaHwnd = FindWindowA (vbNullString, "印刷") 3 4Dim i As LongPtr, dic as new Dictionary 5i = EnumChildWindows (hwnd, AddressOf getCombos, dic) 6Dim keys 7keys = dic.keys 8Dim cbHwnd As LongPtr 9cbHwnd = keys(1) 10 11Dim itm as String 12itm = "プリンター名" 13 14Call SendMessageA (cbHwnd, &H6, 1, 0) 15Call SendMessageA (cbHwnd, &H14D, -1, itm) 16 17Dim cb_id As LongPtr 18cb_id = GetWindowLongA (cbHwnd, -12) 19 20Dim wp As LongPtr 21wp = &H10000 Or (cb_id And &HFFFF) 22 23Call PostMessage (oyaHwnd, &H111, wp, cbHwnd)

補足情報

・親ハンドルとして、キャプションが「印刷」のウィンドウを探しています。
・EnumChildWindowsで親ウィンドウ内のコンボボックスのハンドルをすべてDictionaryに格納しています。
・2番目に出てくるコンボボックスのハンドルをkeys(1)として取得し、cbHwndに格納しています。

コンボボックスをアクティブにして項目を選択するところまでは動作しています。
しかし、コンボボックスの文字が変わっているだけで、SELCHANGEが起きていません。

どこか問題がありますでしょうか?

変数wpについては参考にした質問の中にあったコードをそのまま持ってきただけで、何をしているのか理解できておらず、そこに間違いがあるような気がしております。
また、印刷ダイアログの中でプロパティボタンを押下して出てきたプロパティウィンドウの方では、上記と同じようなコードでコンボボックスの操作ができているため、親ハンドルが間違っているのかもしれないとも考えております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikukiku

2022/10/19 06:11

参考先(https://teratail.com/questions/282475)の自己解決結果の中では 下記のように修正していましたが、 PostMessage oyahundle, WM_COMMAND, wp, 0 質問者さんのコードは下記になっています。 Call PostMessage (oyaHwnd, &H111, wp, cbHwnd) 第4パラメータに差があるように感じました。 内容は検証などせず、ただ比較しただけですが。。。
kakerukyun

2022/10/24 06:13

ありがとうございます。 返信が遅くなり大変失礼いたしました。 おっしゃる通り参考にしたコードと同じように第4引数に0を入れてみましたが、やはりコンボボックスのSELCHANGEは起きていませんでした。 参考コードがなぜ0になっているのかがわかりません。 この引数にはコンボボックスのハンドルを渡すと認識しておりますが、そういうわけでもないのでしょうか。
guest

回答1

0

自己解決

お世話になっております。

結局解決しませんでしたので別の方法を考えました。

・コンボボックスオブジェクトの選択
・コンボボックスの一番上の項目 (0)を選択

ここまではできますので、その後sendkeysで{down}を送り、
今選択されている項目の文字列と、選択させたい文字列が一致しているか判定、
一致していなければまた{down}、一致していれば次に進む

というようなコードにしました。

ありがとうございました。

投稿2022/10/28 05:09

kakerukyun

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問