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を使ったクリップボード操作が上手くいかない場合の対処法 | 初心者備忘録