MS Access

AccessからVBAでブラウザの入力フォームに値をセットする

投稿日:

ExcelWebAddin でWebフォームを自動入力 – Home and Abroad
CliborのマクロをPythonの正規表現を使ってフォームに値をセットする – Home and Abroad
Cliborのマクロでウィンドウ操作&コピペを楽にする – Home and Abroad

・・・のように、いままでコピペで様々な仕組みを試していたが、最近AccessVBAに立ち返ったほうが良いのではと思うようになり、試しに作ってみた。
以前のシステム開発でSendkyesの挙動不審に苦しめられたことがあり、Sendkyesはなるべく使いたくなかったのだが、先様のブログを見ていると、結構伝えるようになっているのかなと感じ、時代が変わっているのかなとも思い、やってみた。

最初に作ったコードはこんな感じ

[code]
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub ReturnToWindows()
Dim tmp As Variant, var As String
var = "木村,太郎,キムラ,タロウ,鹿児島商工業高校,8900082,鹿児島県,鹿児島市紫原,2-49-6,,090-1234-4567,kagoshima999aaa@yahoo.co.jp"
tmp = Split(var, ",")
SendKeys ("%{TAB}"), True ‘ALT+TAB
Sleep (200)
For i = 0 To 10
SetCB(temp(i))
Sleep (200)
SendKeys ("^v"), True
Sleep (200)
SendKeys "{TAB}", True
Next
End Sub

Private Sub SetCB(ByVal str As String)
‘クリップボードに文字列を格納
With CreateObject("Forms.TextBox.1")
.MultiLine = True
.Text = str
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
End Sub
[/code]

コードを実行すると、直前までアクティブにしていたウィンドウに切り替え、カンマ付きの文字列を細切れに分割したうえで、一つ一つコピペしてタブで移動する・・・という目論見。

最初、直前までみていたウィンドウ(ブラウザ)をアクティブにするのをどうすればいいかわからず、難しく考えていたが、Sendkyesの「ALT+TAB」を使えばよかった。

SetCBのやり方は、[VBA]DataObjectを使ったクリップボード操作が上手くいかない場合の対処法 | 初心者備忘録 を参考にさせていただいた。これはこれですごくいい方法。

しかし、なぜか、コピペがうまくいったりいかなかったりする。10連続でコピペすると、そのうち3回は失敗する。Sleepを長く入れてもダメ。

やっぱり予想通り「SendKeys (“^v”)」が鬼門だ。

諦めかけていたところで、「SendKeys tmp(i), True」で直接文字が出力できることがわかり、やってみるとすんなりOK!

このあと、さらに試行錯誤し、最終的に、完成したコードが、以下。

[code]
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub ReturnToWindows()
Dim tmp As Variant, var As String
var = "木村,太郎,キムラ,タロウ,鹿児島商工業高校,8900082,鹿児島県,鹿児島市紫原,2-49-6,,090-1234-4567,kagoshima999aaa@yahoo.co.jp"
tmp = Split(var, ",")
SendKeys ("%{TAB}"), True ‘ALT+TAB
Sleep (200)
For i = LBound(tmp) To UBound(tmp)
SendKeys tmp(i), True
Sleep (200)
SendKeys "{TAB}", True
Next
Call numlock_onoff ‘ SendkeysでNumlockがOFFになるバグを回避
End Sub

‘======================================================
‘ SendkeysでNumlockがOFFになるバグを回避する
‘   WSH(Windows Scripting Host)
‘======================================================

Sub numlock_onoff()
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{NUMLOCK}"
Set WshShell = Nothing
End Sub
[/code]

以下、参考にさせていただいた情報
Office TANAKA – Excel VBA Tips[Split関数で文字列を区切る]
SendKeys を実行するとNumLock キーがオフになる現象を回避 ? Santa Network
[VBA]DataObjectを使ったクリップボード操作が上手くいかない場合の対処法 | 初心者備忘録

-MS Access

執筆者:

関連記事

no image

Access2007 Runtime

MS-Access Discovery – [News] 速報:Access 2007 ランタイムはバグフィックスのため延期 http://x7net.com/~access/index. …

no image

access覚書

複雑な親子フォームを作る際、テーブル設定でインデックスを2つのフィールドとも「はい (重複あり)」にすることで、親のコンボボックスに子が連動するようになった。 Excelでコピーした表データをテーブル …

no image

AccessのDoCmd.OpenForm acPreviewでデータが表示されない

なぜか、フォームに新規データを入力し、印刷プレビュー(DoCmd.OpenForm “見積請求書F”, acPreview)した際に、それまで入力したデータが消えたようになる。 …

no image

AccessでレポートにMeキーワードを含む場合のコードの共通パーツ化

Accessで、レポートにMeキーワードを含む場合の、コードの共通パーツ化・標準モジュールへのまとめ化に悩んでいたら、こういう記事を見つけた。 標準モジュールで「Meキーワードの使用方法が不正です」 …

no image

Accessでレコードコピー(オートナンバー除く)の決定版のコード!

Accessで、レコードのオートナンバーを除くフィールドを1行、複製(コピー)したくって、Google検索したのだけどなかなか出てこず、しかしやっと見つけた、黄金のソース・・・・。 [VBA] ADO …