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

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

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

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

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

Q&A

3回答

1655閲覧

IEで従業員番号を入力すると名前が出るフォームのVBA操作について

hidelovers

総合スコア8

VBA

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

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

0グッド

1クリップ

投稿2019/01/17 04:41

編集2019/01/17 06:55

会社システムのIEフォームで、従業員番号を下記htmlのname="reqUserCd"入力すると、
name="reqUserName"に従業員番号対応した名前 山田太郎等が自動で入るのですが、
下記VBAのvalue= で従業員番号を入力しても、名前が反映されません。
名前が自動で反映されるようにしたいです。

IE側は会社システムで編集できないので、VBA側で何とか解決したいのですが、
何から調べればよいのか、キーワードを教えて貰えないでしょうか。

javascript,htmlは素人です。

試したこと
objDOC.parentWindow.execScript ="popupUser('reqUserCd','reqUserName')"
試してみましたが、検索ウィンドウが新規に開く別目的のjavascriptでした。

環境
VBA 7.1
エクセル 2016です
IE11

背景
会社の自部署経費管理のエクセル帳票のデータを、
IEで入力する会社の入力システムに書込もうとしています。

よろしくお願いします。

コード ~~ VBA Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Dim kenmei As String Dim iraisha As String Dim iraishamei As String Dim basho As String c = Selection.Row d = 20 kenmei = Cells(c, 2).Value iraisha = Cells(c, 3).Value iraishamei = Cells(c, 4).Value basho = "" 'Sub ウインドウを取得する() Dim colSh As Object Dim win As Object Dim objIE As InternetExplorer Set colSh = CreateObject("Shell.Application") For Each win In colSh.Windows '開いているすべてのウインドウに対して処理する If TypeName(win.document) = "HTMLDocument" Then '開いているファイルの種類がHTMLなら処理を実行する If InStr(win.document.Title, "ユーザの") > 0 Then '開いているファイルの「タイトル」にユーザのが含まれているなら Set objIE = win 'このウインドウをobjIEとして指定する Exit For '処理を中断してFor~Nextを終了する End If End If Next If objIE Is Nothing Then 'ウインドウが見つからなければ MsgBox "入力するページが見つかりません" 'メッセージを表示して Exit Sub '処理を終了する End If objIE.Visible = True 'IEを表示 AppActivate objIE Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち DoEvents Loop ' フレーム取得 Dim objFRAME As FramesCollection Set objFRAME = objIE.document.frames 'フレームの代入 Dim objDOC As HTMLDocument 'HTMLドキュメント Set objDOC = objFRAME(3).document 'フレームのドキュメント3をセット 動く '件名入力 Dim elPlaceholder1 As IHTMLElement Set elPlaceholder1 = objDOC.getElementById("subjectName") '書込場所指定 elPlaceholder1.Value = kenmei '値貼り付け '従業員番号 Dim elPlaceholder2 As IHTMLElement 'IHTMLElementオブジェクトを準備 Set elPlaceholder2 = objDOC.getElementById("reqUserCd") '書込場所指定 elPlaceholder2.Value = iraisha '値貼り付け objDOC.parentWindow.execScript "javascript:void(0);" 'javascript動作 Sleep (500) '納入場所 Dim elPlaceholder4 As IHTMLElement 'IHTMLElementオブジェクトを準備 Set elPlaceholder4 = objDOC.getElementById("deliveryPlace") '書込場所指定 elPlaceholder4.Value = basho '値貼り付け End Sub ~~ html抜粋 <td class="list_title_bg_left required">依頼者</td> <td class="list_data_bg_left"> <INPUT type="text" id="reqUserCd" name="reqUserCd" value="" size="6" maxlength="7" style="ime-mode: disabled;" class="default"><SCRIPT type="text/javascript" language="JavaScript">tokai.taglib.userPickupAndPopup.regist('reqUserCd', 'reqUserName', '/imart/conf.common-pickup.service', 'user','onKeyUpUserCd');</SCRIPT><A href="javascript:void(0);" onClick="popupUser('reqUserCd','reqUserName');return false;"><IMG border="0" src="/imart/images/standard/search.gif" align="absmiddle">&nbsp;</A> <INPUT id="reqUserName" type="text" name="reqUserName" size="20" tabindex="-1" value="" class="info" readonly> </td>

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

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

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

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

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

azuapricot

2019/01/17 04:44

? だからどうしたって感じですが、みなさんに何を聞きたいのか書かれていません。 コードはマークダウン <code> をつかって記述してください
stdio

2019/01/17 05:03

丸投げの様にしか感じません。そのプログラムで何が分からないのかをしっかりお書きください。
stdio

2019/01/17 05:21

何から勉強すればよいかヒントを教えて頂ければと思います。 では、何の質問をしたいのか分かりません。質問をする場なので質問して下さい。貴方のは質問ではなく丸投げです。 もしやりたいなら適当に業者にでも依頼しておいてください。
guest

回答3

0

直接DOM操作で入れるとイベントが発生せず、
Javascriptで作られた機構がうまく動かないことがあります。
下記のように直接DOM操作ではなくJavascriptのタイムアウトを突っ込む形での動作はどうでしょうか?

VBA

1objIE.Document.Script.setTimeout javascript:document.getElementById('subjectName').value='" & kenmei &"'", 200

投稿2019/01/17 10:38

shinobu_osaka

総合スコア456

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

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

hidelovers

2019/01/18 02:38

回答ありがとうございます。動作は変わらずでした・・・。 頂いたコードでkenmeiの値も入力されるでよかったですか? elPlaceholder2.Value = kenmei消して試したところ、値が入力されなかったもので。 elPlaceholder2.Value = kenmeiと合わせて頂いたコードも試しましたが変わらずでした。
shinobu_osaka

2019/01/18 03:06

値が入力されなかったのは私の提示したコードがそのままでは動かないからでしょう、 コードを詳しくみてませんでしたが、今よくみますと、細かく別の変数にいれてますので、 script.setTimeoutはobjFRAME(3).documentに対して処理しないといけないかと思います。 回答ではobjIE.Documentに対しての処理で記載しましたが、 objIE.document(フレーム元)での回答したコードの実行では、 下位フレーム内のDOMエレメントアクセスを行ってない為値が入りません。 (あと…Script.setTimeout の後のダブルクウォートが抜けておりました…。) ちなみにコードの説明をしますと、指定したDOMに対して200ミリ秒後に下記のJavascriptを実行させる、 javascript:document.getElementById('subjectName').value='件名変数内容' という物です、ですので、”getElementById('subjectName')”が存在するフレームで 実行されなければいけません。 ところでもしかしてこのコードはゼロからご自分で書かれたのわけではないのでしょうか?
hidelovers

2019/01/18 07:55

丁寧な回答ありがとうございます。 script.setTimeoutを用いて値を入れることができました。 残念ながら自動反映の方は動かなかったですが。 力技ですが SendKeys "{tab}" 連打で該当テキストボックスを選択、 通過させると自動反映されるので、この方法でいこうかと思います。 コードに関しては、各参考サイトのコードをツギハギして作ってます。 丁寧な対応ありがとうございました。
shinobu_osaka

2019/01/18 15:46

なるほど…TAB送信で反映されると言うことは変更されたイベントではなく、 フォーカスの変更かもしれませんね、 objDOC.getElementById("subjectName") .Focus といった感じで次々フォーカスを替えて内容を変更すれば成功するかもしれません。 sendkeyは不安定ですので…あまりおすすめは出来ません、 特にVBAのsendkeyは不安定さに定評がありまして…(笑) それでもだめならsendkeyしかないかもですが…。 (あとはAPIでメッセージ送るかページ側を解析して手動でスクリプトを起動させるくらいしか) 継ぎ接ぎコードでしたか…コードの内容への理解が浅いのですこし疑問に思いました。
guest

0

VBA側で何とか解決したい

質問で開示された挙動からすると、イベントリスナとかでDBから検索して入るようになってるんでしょうね。従業員マスタをあなたがを持っていない以上、正引きは無理ですし、仮に(自分とか自分の関係者しか入れないから)名前が知り得るとしたところで、そういう入れかたをして(つまり社内サービスの想定する経路と違うセットをして)値が入ったことになるかは、私は微妙だと思います。

可能性としては、そのサービスがIE以外で動くなら、「SeleniumBasic」ですかね。ブラウザを制御して、手で入れる行為自体を模倣すれば良いと思います。

投稿2019/01/17 06:18

編集2019/01/17 07:45
papinianus

総合スコア12705

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

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

hidelovers

2019/01/17 07:30

個人情報の指摘ありがとうございます。 お手数ですが、気が付かれましたら、回答修正して頂けると幸いです。 seleniumBasic試してみます。
papinianus

2019/01/17 07:45

個人情報ではないです(法律上の)。履歴が残ります。運営に申告して消してもらいましょう。
guest

0

正論から申し上げますと、その会社システムを管理している部署に要望として
相談するのが一番良いです。業務フローを変えるよう働きかける(Excelをなくして最初から会社システムでやる)というのもよいと思います。

上記のような解決が難しい、面倒なのであれば既に実施されている通りVBAでやるしかないと思います。
社員番号を入力しても紐づいた社員名が自動で入らないということでしたが、基本的に社員番号と社員名の紐づきは変わらないと思いますので、別途自分で作って参照して入力するように変更してはどうですか?

投稿2019/01/17 05:53

ozwind918

総合スコア1140

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問