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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

Q&A

解決済

1回答

2937閲覧

VBAでWebサイト上のテキストボックスのonchangeイベントを発生させたい

demeKIN

総合スコア6

VBA

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

0グッド

1クリップ

投稿2018/08/07 06:42

編集2018/08/07 08:23

前提・実現したいこと

VBAでWebサイト上のテキストボックスに値を入力し、当該テキストボックスのonchangeイベントに設定されている関数「"onchangeMyTxtBox(this)」を実行させたいです。

検討している実装方法で課題となるIEventTarget型としてのテキストボックスボックスの取得、もしくはIHTMLElement型からIEventTarget型へのキャストの方法がわからないため方法を教えていただけないでしょうか。
そもそもこ実装方法をかえて、別の実装方法(直接関数を実行させるなど)のアドバイスでもいただけると幸いです。

<検討している実装方法>
当該テキストボックスのonchangeイベントをMSHTML.IEventTargetクラスの
dispatchEventを用いて発生させることで、当該関数を実行する

発生している問題・エラーメッセージ

当該テキストボックスをIEventTarget型オブジェクトとして取得できない。MSHTML.IHTMLElement型オブジェクトとして取得はできるが、その場合は
MSHTML.IEventTarget型にキャストしないとdispatchEventで
onchageイベントを発生させられない。
ソースコードの下から2行目で型不一致のエラーが発生します。

該当のソースコード

HTML

1 <INPUT type="text" name="my_txtbox" class="my_class" onBlur="onblurMyTxtBox(this)" onChange="onchangeMyTxtBox(this)">

VBA

1Dim ie As InternetExplorer 2Dim doc As HTMLDocument 3Dim elm As IHTMLElement 4Dim trgt As IEventTarget 5Dim evt As DOMEvent 6 7Set ie = CreateObject("InternetExplorer.Application") 8ie.navigate "https://mytestsite.jp" 9ie.Visible = True 10Call waitIE(ie) 11 12Set doc = ie.document 13Set evt = doc.createEvent("HTMLEvents") ' 14evt.initEvent "change", True, True 15 16'勤務時間の入力 17Set elm = ie.document.getElementsByName("my_txtbox")(0) 18elm.Value = "test" 19Set trgt = ie.document.getElementsByName("my_txtbox")(0) '★「型が一致しません」エラー(要キャスト) 20trgt.dispatchEvent (evt)

試したこと

・キャストせずにie.document.getElementsByName("my_txtbox").dispatchEvent (evt)
→ IHTMLElement型にはdispatchEventメソッドがないため「メソッドが存在しません」エラー
※Web上ではこれで動くという記述もあり、Excelのバージョンが古いのが原因?

・キャストせずにie.document.getElementsByName("my_txtbox").fireEvent ("onchange")
→ エラーは出ないがIE11では動作しない

・Ctype関数でキャストする
→ VBAには存在しない

・trgt = ie.document.getElementsByName("my_txtbox")(0).objectとして
コンパイラにキャストさせる
→ IHTMLElement型にはobjectプロパティがない

補足情報(FW/ツールのバージョンなど)

IEのバージョン11
ExcelのバージョンMicrosoft Office Professional Plus 2010

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

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

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

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

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

m.ts10806

2018/08/07 06:55

trgt変数はIEventTargetとして宣言されていますが、そこは問題ないですか?elmと同じ情報を格納するのでしたらIHTMLElementとして宣言する必要があるように思いますが。
demeKIN

2018/08/07 07:03

trgt変数の型はあっています。オブジェクトブラウザで調べたところ、dispatchEventメソッドを呼び出せるのはIEventTarget型でしたので、elmをtrgrにキャストしようとしています。
m.ts10806

2018/08/07 07:35

ではgetElementsByName()の返り値はあくまでIHTMLElementなので、IEventTarget型を返すメソッドにしないといけませんね。キャストの問題ではなさそうです。
demeKIN

2018/08/07 08:16

はい、対象のテキストボックスをIEventTarget型として取得できれば解決できるのですが、方法が見つからずキャストしようとしています。もう少し調べてみますが、IEventTarget型を返すメソッドについて情報いただければ助かります。
guest

回答1

0

自己解決

私の勘違いが原因でした。問題は解決しました。
結論から言うと、onchangeイベントはMSHTML.IHTMLElement型のfireeventメソッドで実行、
もしくはonchangeプロパティを呼び出すことで発生可能でした。
fireeventメソッドはIE11で推奨されていませんが動作するようです。

onchangeイベントの実行方法

VBA

1ie.document.getElementsByName("my_txtbox").fireEvent ("onchange") 2' もしくは 3ie.document.getElementsByName("my_txtbox").onchange

試したこととして、fireeventでは動作しないと書いていましたが私の勘違いでした。
やりたいことが「onchangeMyTxtBox(this)」では実行されず、
実際は「onblurMyTxtBox(this)」で実行されることに気付き、
「onchangeMyTxtBox(this)」が動かないと勘違いしていました。

推奨されているMSHTML.IEventTargetクラスのdispatchEventを実行する方法は
不明のままですが、目的としていたonchangeイベントを発生させるということは
実現できましたので解決とします。

ご協力いただいたみなさま、ありがとうございました。

投稿2018/08/09 07:44

編集2018/08/09 07:46
demeKIN

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問