MS Access

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

投稿日:

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

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

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

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

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

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

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

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

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

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

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

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

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

-MS Access

執筆者:

関連記事

no image

Excelで使える祝日判定のWebAPIを見つけた

Excelの関数には、曜日を判定できる関数(WEEKDAY)が用意されている。また、表示だけなら書式設定でもできる。しかし祝日となると、関数も何も、用意されていない。 祝日は年により、突然増えたり、「 …

no image

Access2007 Runtime

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

no image

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

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

no image

AccessからExcelフォーマットでファイルに出力するサンプルコード

Excelから外部データの接続の際に,ユーザー定義関数を含んだクエリを指定するとエラーになったので、こんなやり方で対処。 Private Sub btnB2_Click() DoCmd.OutputT …

no image

テキスト型の日付をformat関数で揃える

CSV形式のデータからAccessにインポートしたものだから、日付が2012/5/5やら2012/05/05やら、文字列扱い(日付型でない)の混在したデータの入ったテーブルがある。 これをきちんと並べ …