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

Accessのフォームでテキストボックスに入れた値を次回オープン時の既定値として自身に保存するには

ちょっとだけ苦労した。 次回もきっと使うことがあるだろうから、メモメモ。 現在の値を変数に入れておく(これをしておかないと、次の処理でデザインビューに切り替わるために入力した値も消える)。 フォームを …

no image

Accessでメッセージ内容が無い(のっぺらぼう、OKボタンのみ)エラーメッセージがでる

自分作のモジュールの記述で、以下のように書いている箇所があって、 If rs.EOF = True Then GoTo Err_chkFukuyamaVcr ‘error Else   (中略) また …

no image

初めてのSQL Server 2008 R2 Express Editionでつまづいたことの記録

やりたかったことは、 1.Accessのとあるテーブルを、SQL Server 2008にインポートして、複製を作る。 2.上記で作ったテーブルを、AccessからODBCで読め、かつパススルークエリ …

no image

AccessのBeforeUpdateでUndo

BeforeUpdateプロシージャ内の処理で、Cancel = Trueとしたら更新がキャンセルされるところまではできたが、テキストボックスにNullを代入しようとしてエラーが出たりして、間違って入 …

Office365にはSharePointリストという表データが保存できる機能がありAccessのリンクテーブルにできる

Office365では、AccessのWebアプリを作れる。 それで今、勉強しているのだが、Office365にはSharePointリストという表データが保存でき、それをAccessのリンクテーブル …