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

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

ただいまの
回答率

90.61%

  • HTML

    8693questions

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

  • VBA

    1728questions

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

  • Excel

    1470questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

テキストボックスのonChangeイベントをVBAから動かしたいです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 777

sumire_cl

score 54

前提・実現したいこと

Webに入力画面があります。
formData01にコードを入れると、対応する名前がformData02に自動で入るようなページの作りです。
このページは私が管理しているものではないので編集などはできません。
JavaScriptはヘッダのところでたくさん読み込まれています。
なので、このHTMLのonChangeのところにある「updatedData()」は、そのたくさん読み込まれているjsファイルのどれかのなかにあって
おそらくformData01の値を持ってサーバに検索に行って、名前を持って戻ってくる動作が書かれていると思われます。

<input name="formData01" tabindex="1024" id="formData01" onchange="updatedData();" type="text" size="4" maxlength="6" value="">
<input name="formData02" tabindex="1024" class="disabledItem" id="formData02" type="text" size="19" maxlength="50" readonly="true" value="">


実際のページでは、formData01にコードを入力してblurしたら、formData02に名前が自動で表示されます。
最終的な目標は、この入力フォームにExcelからコードを自動入力して、表示された名前を取得することです。

Excelのマクロはこんなのを書いてみました。

Sub getName()

Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
Const URL = "http://…/そのページ.html"

objIE.navigate URL
Do While objIE.Busy Or objIE.readyState < 4
    DoEvents
Loop

objIE.document.getElementById("formData01").Value = "123456"
objIE.document.getElementById("formData01").Change

End Sub

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

上記のVBAで、formData02に自動で名前が出てくるはずなのに出てきません。
コード"123456"は入力されています。
VBAのChangeではブラウザにonChangeとは認識してもらえないのでしょうか。
ChangeでもBlurでもいいのですが、ブラウザにそのように認識してもらうにはどう書いたらいいのでしょうか。

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

Windows(7と10があって半々くらい)
Microsoft Office 2016
IE11(会社の決まりでこれしか使えません)

==========================================
[2017/09/20]
外部から呼び出されているjsファイルをひとつずつ読んでみて、onChangeのときにどこかで何をしているのかを見ています。

    $('#formData01').focusout(function() {
    });


っていう記述をみつけて
これで、ajaxでjsonデータを持ってきて、それをformData02に入れているっぽいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

やりたいことは以下のような流れかと思います。
①formData01に値をセット
②IE側処理(updateData)を実行
③formData02の値を取得

上記であれば以下のような記述でできそうな気がしますが、いかがでしょうか?

'formData01に値をセット
objIE.document.getElementById("formData01").Value = "123456"
'IE側の処理(JavaScript)を実行
objIE.document.parentWindow.execScript "updatedData();"
'ここでおそらく画面更新があるので、処理待ち(Sleep(1000)など)があったほうがよさそう?
'formData02の値を取得
MsgBox objIE.document.getElementById("formData02").Value

参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/22 10:31

    ありがとうございます。
    できました!
    document.parentWindow.execScript
    っていう書き方を初めて知りました。
    直接中のものを起動したりできるものなのですね。活用します!

    キャンセル

0

当てずっぽうな回答になりますが……。

objIE.document.getElementById("formData01").FireEvent("OnChange")

というように、明示的にブラウザに「イベント着火してくれ」と命令する必要がありそうです。

 参考資料

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/19 16:02

    ありがとうございます。
    objIE.document.getElementById("formData01").FireEvent ("onchange")
    のみならず
    objIE.document.Script.setTimeout "javascript:updatedData()", 200
    もチャレンジしてみましたがダメでした…。
    いずれもExcelはエラー出ず終了、フォームのほうは”123456”が入力されているだけの状態です。
    私の声が聞こえていないのでしょうか…。
    もしくはブラウザの設定とかでしょうか…。

    キャンセル

  • 2017/09/20 14:28

    作りをうんと簡単にしたこのような入力フォームのページを自分で作って
    FireEventでやったら効いたので
    ブラウザの設定でなくて、このページでさらに何か見ている項目があって、それで阻まれている…?という感じがしています。

    キャンセル

  • 2017/09/20 15:27

    追記された質問文を見る限りだと、focusoutでも何かイベント走ってるようにサーバー側に見せかけてるのかなという印象を受けました。

    ただ、もしかするとjawaさんのソースの方がスマートかもしれませんね。

    キャンセル

  • 2017/09/22 11:08

    ありがとうございます。おかげさまで、
    onchange自体を起動したい
    というのは、これでできるようになったので
    今度は、この外部jsファイルに書いてあるfocusoutをどうにかする方法を考えないといけない
    というところまでたどり着きました。

    他の項目に
    objIE.document.getElementById("formData03").Focus
    ってしただけでは、formData01をfocusoutしたと認識してもらえないっぽいので
    この新たに困っているところについて
    新しく質問を立てようと思っています。
    しばらくお目汚しの質問が続くと思いますが、よろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    エクセルVBA   

    Sub ie_test() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer Dim htdoc As HTMLDocument

  • 受付中

    iuiuiiiiVBA クリック処理

    ①<a href="http://AAAx" target="_blank" data-ylk="slk:itemnm;pos:12" data-rapid_p="23"> パン

  • 解決済

    HTMLElementCollection 実行時エラー 型が一致しません 原因

    前提・実現したいこと EXCEL VBAで特定WEBページからデータを収集するシステムを作ってます。 HTMLから要素を抜き出す機能を実装中に以下エラーが発生しました。

  • 受付中

    VBAのIEオブジェクト操作でテキストボックスに値を設定できない

    前提・実現したいこと VBAのIE操作についてお詳しい方のアドバイスを頂きたいです。 発生している問題・エラーメッセージ BUYMAのポップアップ表示中のテキストボックス

  • 解決済

    VBA ユーザーフォーム内でコマンドボタン等を移動させる方法

    PowerPointのVBAでユーザーフォームを作成しています。 そこで以下のようなプログラムを作成しています。 ①フォーム内のコマンドボタンをクリックすると新たなコマンドボタンを

  • 解決済

    VBAにてGoogle検索結果を転記したい。

    本サイトでは、いつも教えて頂き、感謝をしております。 さて、本日も教えて頂きたく。 ■ やりたい事。 下記の様に、B列に会社名が入っており、C列が空欄のシートがあります。

  • 解決済

    【VBA】最終行に転記

     前提・実現したいこと (同一book) 【入力】シートに入力したものを【点検履歴】シートの最終行に転記したいです。 ↓入力シート(sheet9) ↓点検履歴(sheet8)

  • 受付中

    複数ブック、複数シートからの値コピー

     前提・実現したいこと [実現したいこと] VBAにて集計表を作成しております。 勉強をし始め、数日です。 複数ブックの複数シートから値のみコピーしたいと思っています。 [前提

同じタグがついた質問を見る

  • HTML

    8693questions

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

  • VBA

    1728questions

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

  • Excel

    1470questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。