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

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

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

no image

Accessのフォーム/レポートのコントロール同士をくっつけて桝目状にしたい

レポートを、Excelのような桝目の罫線にしたい。 お客からこんなニーズが多い。 やったことがある人ならわかるけど、これが、なかなか苦労する。 レポートのデザインビューで、いざ個々にコントロールをきち …

no image

Accessの再クエリーでデータが移動してしまうのを解消

仕事メモ。 メイン・明細フォームのときは、 http://www.sanryu.net/acc/tips/tips323.htm を参考に、 Dim m_offset As Long ‘レ …

no image

ExcelからAccessの外部データの取り込みでトラブル

ExcelからAccessのクエリを使いたいとき、データ接続途中の「テーブルの選択」ウィンドウに、使いたいクエリが表示されない。 ウィンドウ内には、Accessにあるはずのクエリがあったりなかったり。 …

no image

AccessからMySQLを操作

WordPressに書いた記事は、MySQLに格納されている。 格納された大量の記事をまとめて修正したいときは、いちいち管理画面から修正するのは疲れる。 今までは、PhpMyAdminでSQLのUPD …