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

テーブル/クエリのデータシートビューでイベントを処理する方法

参考:テーブル/クエリのデータシートビューでイベントを処理する方法 | YU-TANG’s MS-Access Discovery え、そうなの? クエリを閉じた際のイベントをセットできる …

Accessのオブジェクトをデスクトップに作っておくと超便利

結構、知らない人が多いんじゃないかな。 クエリとか、フォームへの直接のリンクを、PCのデスクトップに作れること。 ユーザーがたくさんいて、その中の一部の人には、閲覧はして欲しいけど、編集はして欲しくな …

no image

Office2013のSELFCERT.EXEの場所

さがして、やっと見つかった。 自分のPC環境の場合は、以下だった。 C:\Program Files (x86)\Microsoft Office\Office15 参考にしたブログによっては、C:\ …

Accessのフォームをデザインしようとすると固まる

タイミングとしては、フォームをデザインビューにした直後、プロパティシートをクリックしたとき。それだけで数十秒待たされる。 原因は、なんとなく、気が付いている。 ついさっき、フォームで使っているクエリに …

no image

Accessクエリでのフィールド名は同じので重複できる

Accessではクエリの中で同じフィールド名を使えない! ・・・とずっと思っていた。 なので、テーブルで使っているフィールド名でクエリの結果を出す必要があった際には、クエリを二つ作ってそれぞれ前処理 …