🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2949閲覧

プルダウンの項目をVBAでクリック(項目の変更ではなく)したい

gakusyu

総合スコア11

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/09/10 07:55

編集2019/09/11 06:55

プルダウンの項目をVBAでクリックしたい

VBAでとあるWEB上のプルダウンの項目をクリックしたいのですが、
調べても項目の表示の変更がされるだけでクリックがされるものが載っていません。
説明が下手で申し訳ございませんが、手動でそのプルダウンをクリックしますと
項目をクリックした瞬間にその専用ページに遷移します。
が、作成したVBAで行うと項目の表示の変更が行われるだけでページが遷移しません。

関係上WEBコードすべてを載せることはできませんが、以下のようなコードになっています

該当のソースコード

<select name="swich_team"> ==0 <option value="1a2b3c4d-5e6f-7g8h9i" selected> team1</option> <option value="9i8h7g-6f5e-4d3c2b1a" selected>team2</option> </select>  ・・・      の「team2」のボタンをクリックしたい。

試したコード(VBA)

#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If '接続先URL Public Const url1 As String = "https://XXXXXXXXXXXXXXXXXXXXXXXXX" Sub main() Dim objIE As InternetExplorer Dim objInpSel As HTMLSelectElement 'IE(InternetExplorer)のオブジェクトを作成する Set objIE = CreateObject("InternetExplorer.Application") 'IEを表示させurl1のページを表示する objIE.Visible = True objIE.navigate url1 'IEの表示を待つ Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE DoEvents Loop 'ID入力 objIE.document.getElementsByName("XXXXXXXXXXXXXXXXXX")(0).Focus objIE.document.getElementsByName("XXXXXXXXXXXXXXXXXX")(0).Value = "XXXXXXXXXXXXXXXXXXXXXXXXXXX" 'PW入力 objIE.document.getElementsByName("password")(0).Focus objIE.document.getElementsByName("password")(0).Value = "XXXXXXXXXXXXXXXX" 'ログインボタンをクリック objIE.document.getElementsByName("login")(0).Click Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE DoEvents Loop 'プルダウンからTeam変更 objIE.document.querySelector("[name=switch_team] option:nth-child(2)").Click Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE DoEvents Loop '======================================== 'Teamを選択 ' Set objInpSel = objIE.document.getElementsByName("switch_team")(0) 'セレクトボックスを選択 ' objInpSel.selectedIndex = 1 ' Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE ' DoEvents ' Loop '======================================== MsgBox "終了しました" End Sub

ちなみに直接URL開けばいいんじゃないかと思い、調べましたが
「team1」「team2」で表示されるURLは同じものでした。(すみませんHTMLの知識があまりないので理由はわかりませんが「team1」「team2」で表示されるページ内容は明らかに違います)

上記方法がわかる方、ご教示頂けますでしょうか。
何卒よろしくお願いいたします。

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

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

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

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

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

Lhankor_Mhy

2019/09/10 08:40

objIE.document.getElementsByName("swich_team")(0).Click ではダメでしたか?
gakusyu

2019/09/10 09:09

Set objInpSel = objIE.document.getElementsByName("swich_team")(0) objInpSel.selectedIndex = 1 objIE.document.getElementsByName("swich_team")(0).Click で実施しましたが、遷移はしませんでした。 項目の表示はteam2になったままです。
Lhankor_Mhy

2019/09/10 09:20

ああ、optionをクリックしなきゃいけないんですね? objIE.document.querySelector("[swich_team] option:nth-child(2)")(0).Click とかはどうでしょう?
gakusyu

2019/09/10 09:55

実行時エラー:13; 型が一致しません。 というエラーとともにデバックを押すと上記の文章がさされてしまいます。 querySelectorは初めて見たので自分でも調べてみます。
Lhankor_Mhy

2019/09/10 09:56

あ、すみません、間違えました。 objIE.document.querySelector("[swich_team] option:nth-child(2)").Click テストできれば話が早いのですが……
Lhankor_Mhy

2019/09/10 09:58

じゃないですね。 objIE.document.querySelector("[name=swich_team] option:nth-child(2)").Click
gakusyu

2019/09/11 01:09

何度もアドバイス頂きありがとうございます。 上記のコードで実行しましたが、今度は項目も変更されませんでした。 似たような仕様のサイト(プルダウン選択クリック時に遷移するサイト)があれば、ご紹介できるのですが、、、 見つけ次第ご連絡はさせていただきます!!
gakusyu

2019/09/11 01:14

五月雨で失礼いたします! まったく一緒ではありませんが以下のサイトはプルダウンで サイト内の表示は変わるので似たような仕様かもしれません! https://www.apple.com/jp/iphone/compare/
Lhankor_Mhy

2019/09/11 01:38

少なくとも、JavaScriptで document.querySelector("[name=swich_team] option:nth-child(2)").click() なら動作することを確認しました。 また、 objIE.document.querySelector と、 .Click が動作することも確認できています。 なので、あとはセレクタの取り方だと思うのですが…… ところで、そのアップルのページ、IE11だとスクリプトエラーで動作していないような気がします。
gakusyu

2019/09/11 05:29

JavaScriptを触ったことがあまりないので 根拠があるコメントでもないですが VBAで作成していたのでそれで動作しないんでしょうか。 >ところで、そのアップルのページ、IE11だとスクリプトエラーで動作していないような気がします。 →すみません、対応していないみたいですね・・・  Chromeデベロッパーツールを使いながらサイトを探していたので  見つけた嬉しさでIEでためしていませんでした・・・;;
Lhankor_Mhy

2019/09/11 06:14

こちらもVBA(エクセルのマクロ)で試していますよ。
Lhankor_Mhy

2019/09/11 06:38

ローカルにサーバ立てて試してみましたが、 objIE.document.querySelector("[name=swich_team] option:nth-child(2)").Click で動作しました。 なので、あとは環境の問題か、ご提示いただいてない部分のコードに問題があるのかと思います。
gakusyu

2019/09/11 06:57

試したコードに関してどうしても開示できない部分はマスクしてそれ以外はすべて載せました! objIE.document.querySelector("[name=swich_team] option:nth-child(2)").Click に関しては実行するとログインまで行き、上記コードを無視(?)1してMsgBoxを出す状況です!
gakusyu

2019/09/11 07:04

============で区切ってコメントアウトしている部分に関しては 有効にして実行すると表示の変更がされるだけでクリックがされず、 objIE.document.getElementsByName("swich_team")(0).Click は最初に記載しました通り、遷移は行われませんでした・・・
guest

回答1

0

ベストアンサー

とりあえず、ブログにHTMLを書いて試してみました。
当方では動作しますが、どうでしょう?

ExcelVBA

1Sub MySub() 2 3 Dim objIE As InternetExplorer 4 Set objIE = New InternetExplorer 5 6 objIE.Visible = True 7 objIE.Navigate "http://realtor-readyabooks.hatenablog.com/entry/2019/09/11/000000" 8 Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE 9 DoEvents 10 Loop 11 12 objIE.document.querySelector("[name=swich_team] option:nth-child(2)").Click 13 14 15End Sub

投稿2019/09/11 07:04

編集2019/09/11 07:07
Lhankor_Mhy

総合スコア36928

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

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

gakusyu

2019/09/11 07:23

わざわざページまで作成頂いて本当にありがとうございます泣 結果としましてはブログは開きTeam2になっていました。 が、以下のようにコメントアウトしてもteam1ではなくteam2になっていました(終了は出現しました) ================================== Sub 頂いたマクロ() Dim objIE As InternetExplorer Set objIE = New InternetExplorer objIE.Visible = True objIE.navigate "http://realtor-readyabooks.hatenablog.com/entry/2019/09/11/000000" Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE DoEvents Loop ’ objIE.Document.querySelector("[name=swich_team] option:nth-child(2)").Click MsgBox "終了" End Sub ================================== キャッシュが残っているとも思いTeam1にして消したりしましたがteam2のままで 逆に objIE.Document.querySelector("[name=swich_team] option:nth-child(1)").Click としてみてもteam1ではなくteam2が表示されました。
Lhankor_Mhy

2019/09/11 07:27

team2をクリックするのが目的だと思っていたのですが、team2を表示するのが目的なのですか?
Lhankor_Mhy

2019/09/11 07:39

「クリックされました!」というアラートは表示されたのですよね? それであればクリックされた、ということになるかと思います。
gakusyu

2019/09/11 07:53

team2をクリックするのが目的です! すみませんクリックすると表示も変わると勘違いしていました。 (nth-child(1)にしたら「team1」が表示されると思っていました) 見た目には分からないですがクリックはされているのですね・・・ だとしたらクリックするという行為は objIE.Document.querySelector("[name=swich_team] option:nth-child(2)").Click であっているのですね! そこで遷移するトリガーをもう一回調べたところ、フォーカスして「↓ボタン」を押すことで遷移したため、 以下のコードを試したところ遷移しました!! objIE.document.getElementsByName("swich_team")(0).Focus Application.SendKeys "{DOWN}" 一応現状では解決できたのですが 出来ればteam2という名前で指定して遷移させたいところです・・・ (teamは今後数が増減する可能性があるため) ので頑張って模索はしてみます。 ちなみに遷移するトリガーはもう一つあり、手動での説明になりますがプルダウンを押し、一覧が表示された状態でteam2をクリックすると遷移しました。
gakusyu

2019/09/11 08:02

>「クリックされました!」というアラートは表示されたのですよね? >それであればクリックされた、ということになるかと思います。 →こちらはFirefoxでは表示されましたが  IEでは表示されませんでした・・・  使用IEは11.3143.1439.0です
Lhankor_Mhy

2019/09/11 08:07 編集

なるほど。 もしかすると、change イベントを拾っているのかもしれませんね。 > 出来ればteam2という名前で指定して遷移させたい そうすると、getElementsByName("swich_team")(0).Children で option の配列を取得して、ループで回して中身を調べて……とするしかないかもしれません。
Lhankor_Mhy

2019/09/11 08:06

>  IEでは表示されませんでした・・・ > 使用IEは11.3143.1439.0です そうでしたか。当方は、11.0.9600.19431 でした。 セキュリティ設定の影響とかもありそうですね……
gakusyu

2019/09/17 04:35

>getElementsByName("swich_team")(0).Children で option の配列を取得して、ループで回して中身を調べて……とするしかないかもしれません。 →なるほど!試してみます!  ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問