【ExcelVBA】時間になったらLINEで自動的にメッセージを送る

マウス操作とキーストローク

 icon-check-square-o 外部アプリケーションの操作

ちょっと大げさなタイトル。
ここ数日、ExcelVBAで外部アプリケーションをどうにかできないかと試行錯誤してたのですが、なかなかどうして難しいようで。

正攻法じゃできなかったので、擬似的に。
マウス操作とキーストロークを使って、LINEでメッセージを送ってみました。


 icon-check-square-o LINEの起動

ExcelVBAでLINEを起動する方法は、前回の記事【ExcelVBA】他のアプリケーション(LINE)を起動する方法を参考にしてください。

ライン

LINEを起動したら、名前で検索(虫眼鏡マーク)のところに文字を入力したいのですが、どうやってもカーソルをここに合わせることができませんでした。

ログイン画面ではユーザー名のところにカーソルが合っていたので、そのままキーストロークを送ればよかったんですけどね。
仕方ないので、マウス操作を使うことにしました。

マウスポインタを合わせる位置などは、当然パソコンによって変わってくるので、ここに載せたコードをそのまま使っても上手く動作しないのであしからず。


 icon-check-square-o マウスポインタの位置を取得

Windowsの標準装備では、マウスポインタの座標を取得する方法ってないんですかね?

ググったらフリーソフトはたくさん出てきたんだけど、あまりフリーソフトをダウンロードするのは好きじゃないので、前に作った(パクッた)マクロを使ってマウスポインタの位置を取得します。

Public Declare Function GetCursorPos Lib “USER32” _
(lpPoint As POINTAPI) As Long

Public Type POINTAPI
x As Long
y As Long
End Type

Private Sub Auto_Open()
‘F12キーに「マウスの位置」を登録
Application.OnKey “{F12}”, “GET_POINTA”
End Sub

Sub GET_POINTA()

Dim Poi As POINTAPI
‘現在マウスポインタのある位置を取得
GetCursorPos Poi
MsgBox “x:” & Poi.x & ” y:” & Poi.y

End Sub

コードの説明・解説は割愛。
F12キーを押すと、現在のマウスポインタの座標をメッセージボックスに表示します。

なんだか備忘録というか、メモ書きみたいな記事だなあ。
イミフな方はごめんなさい。


 icon-check-square-o LINEでメッセージを送るマクロ

‘API宣言
Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

Declare Function ShowWindow Lib “USER32” _
(ByVal hwindow As Long, ByVal cmdshow As Long) As Long

Declare Function SetCursorPos Lib “USER32” (ByVal x As Long, ByVal x As Long) As Long

Declare Sub mouse_event Lib “USER32” _
(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _
ByValcButtons As Long, ByVal dwExtraInfo As Long)

Sub line_open()

Dim Ret As Long
Dim x As Long, y As Long
Dim i As Integer

Shell “C:\Program Files (x86)\Naver\LINE\line.exe”, 1
SendKeys “{Delete}”, True
‘ユーザー名
SendKeys “●●●●●●●●”, True
SendKeys “{Tab}”, True
‘パスワード
SendKeys “●●●●●●●●”, True
SendKeys “{Enter}”, True

Application.Wait Now + TimeSerial(0, 0, 4)

‘マウス操作
x = 390: y = 480 ‘名前で検索
Ret = SetCursorPos(x, y)
Sleep (2000)
Call mouse_Click ‘左クリック
Sleep (2000)
SendKeys “DHC”, True
SendKeys “{Enter}”, True

x = 380: y = 550
Ret = SetCursorPos(x, y)
Sleep (2000)
Call mouse_Click ‘ダブルクリック
Call mouse_Click
Sleep (2000)

SendKeys “こんばんは”, True
SendKeys “{Enter}”, True
SendKeys “{Enter}”, True

End Sub

‘左クリック
Public Sub mouse_Click()

mouse_event 2, 0, 0, 0, 0 ‘マウスの左ボタンを押す
mouse_event 4, 0, 0, 0, 0 ‘マウスの左ボタンを離す

End Sub

‘ダブルクリック
Public Sub mouse2_Click()

mouse_event 2, 0, 0, 0, 0
mouse_event 4, 0, 0, 0, 0
mouse_event 2, 0, 0, 0, 0
mouse_event 4, 0, 0, 0, 0

End Sub
‘マクロを実行する時刻
Sub start_time()
Application.OnTime EarliestTime:=TimeValue(“19:00″), Procedure:=”line_open”
End Sub

きったねえコードwww
こんなものをインターネット上で公開してもいいのか?という疑問を抱きつつ、要所だけ解説していきます。

1~11&:API関数の宣言
13~26:Shell関数でLINEを起動、SendKeys関数でキーストロークを送る

Application.Wait Now + TimeSerial(0, 0, 4)

現在の時刻から4秒間、アプリケーションを止めて待つ。
なかなか便利なコードですが、スリープとの使い分けは? >わかりませんw

‘マウス操作
x = 390: y = 480 ‘名前で検索
Ret = SetCursorPos(x, y)
Sleep (2000)
Call mouse_Click ‘左クリック
Sleep (2000)
SendKeys “DHC”, True
SendKeys “{Enter}”, True

虫眼鏡のところの座標がx:390,y:480あたりだったので、そこに合わせて左クリック。
カーソルが有効になったら名前で検索という入力欄に、”DHC”というキーストロークを送り、エンター。

という流れのコードです。
VBAわかる人には問題ないですよね、わからない人にはわけわかめですよね。

私の解説というか、この企画に問題があったようです…
次から、見切り発車で記事書くはやめよう。

DHC

DHCと入力してエンターを叩くと、玉川ヨシ子が出てきます。
この猫のスタンプ可愛いですよね。

実際の友達は練習に使いにくかったので、DHCを練習に使わせていただきました。
といっても、メッセージ送ることはできないけど。

x = 380: y = 550
Ret = SetCursorPos(x, y)
Sleep (2000)
Call mouse_Click ‘ダブルクリック
Call mouse_Click

猫のアイコン、DHCのあたりをダブルクリックします。

SendKeys “こんばんは”, True
SendKeys “{Enter}”, True
SendKeys “{Enter}”, True

メッセージ欄に”こんばんは”と入力。
エンターを2回叩くのは、確定したあとにエンターを叩くから。

ちなみに同じキーを2回叩く書式があったような気がしますが、修正が面倒なのでこのままにします。
あっ、ダブルクリックっていうサブプロシージャも作ってたみたい…

たまがわよしこ

ともあれ、無事に玉川ヨシ子にメッセージを送ることができました。
そしたら「ヨシ子は後ろを振り返らにゃいにゃ」という返信がくるんですねw


 icon-check-square-o 時間がきたらマクロを実行

‘マクロを実行する時刻
Sub start_time()
Application.OnTime EarliestTime:=TimeValue(“19:00″), Procedure:=”line_open”
End Sub

すっかり忘れてました。
タイトルに時間になったら~~って、書いてましたね。

説明不要、構文の通りです。
19:00になったら、line_openプロシージャを実行します。

なので、タイマーをかけるならstart_timeというマクロを実行してください。