【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というマクロを実行してください。

【ExcelVBA】他のアプリケーション(LINE)を起動する方法

VBAでアプリケーションを起動

 icon-check-square-o LINE

ちょっと面白そうなタイトル。
ExcelVBAでブックやファイル、Excelの操作は行ったことはあるけど、他のアプリケーションを操作したことはなかったので、今回チャレンジしてみます!

今回、起動するアプリはLINE。
日本国内でも5000万人のユーザー数を誇り、ついに今日、うちの母(70歳)までも始めました。

そのLINEをVBAで起動して、ログインするところまでやってみたいと思います。


 icon-check-square-o shell関数

便利な関数がありました。
他のアプリケーションを開くには、shell関数を使うようです。

■shell関数
書式:shell(ファイル名,ウィンドウ形式)

ウィンドウ形式というのは、アプリケーションを開いたときの大きさ?なのかな。
よくわからないので、ここでは1にしておきます。

LINEのアイコンを右クリック ⇒ プロパティ

ライン1

リンク先がファイル名になります。
なので、コードは次のようになります。

Sub line_open()
    Shell "C:\Program Files (x86)\Naver\LINE\line.exe", 1
End Sub

LINEを起動するだけなら、1行で終わってしまった(笑)
さっそく実行してみましょう。

ライン4

すると、ログイン画面が立ち上がるので、ユーザー名とパスワードを入力します。


 icon-check-square-o SendKeysステートメント

どうやらIE操作とは、また勝手が違うようです。
なのでSendKeys関数を用いて、アクティブウィンドウに対してキーボード入力を行います。

■SendKeys関数
書式:SendKeys キーボード

Trueを指定すると、キーストロークが渡るまで処理を中断してくれるようです。
よくわからないので指定することにします。

ふつうの文字列は””ダブルクォーテーションで括るだけですが、特殊なキーの場合はコードを指定する必要があるみたいです。

Sub line_open()
    Shell "C:\Program Files (x86)\Naver\LINE\line.exe", 1
        SendKeys "●●●●●●●●", True
        SendKeys "{Tab}", True
        SendKeys "●●●●●●●●", True
        SendKeys "{Enter}", True
End Sub

人によって環境が違うと思いますが、都合がいいことにLINEを立ち上げると、ユーザー名を入力する欄にカーソルが合っています。
なので、このままキーストロークを渡しにいきます。

上のコードの3行目ですね。
ここはご自分のユーザー名を記述してください。5行目も同じようにパスワードを記述してください。

ライン5

Enterボタンが押される前、5行目までの実行結果です。
まず、ユーザー名を入力して、Tabキーでパスワード欄に移動。パスワードを入力、という流れです。

ライン2

すべて実行した結果です。
無事にログインできました。

色々調べていると、SenKeysは動作が安定しないので推奨されていないようです。
でも、手操作と同じことをできるので、とても便利な関数ですね。

行動経済学とは

行動経済学+心理学

 icon-check-square-o 標準経済学
経済学と聞くと、アレルギー反応を起こす人が多いでしょう。
私もその一人です(笑)

長年、株式トレードをしていたのにもかかわらず、経済学が大嫌いで、特にマクロ経済についてはまったく勉強しなかったなあ。

さっきもゼミの課題をやっている彼女に、「日銀が公定歩合を引き下げると、どうして円安になるの?」と聞かれて、答えられませんでした…

余談だけど、現役大学生がやってる経済学って難しいですね。
先日も「Jカーブ効果って何?」って聞かれたんだけど、こっちが何?って感じでしたよ(笑)

FXやってる人でも、Jカーブ効果を知らない人多いんじゃないかな。
まあ、その手のことを知らなくても、トレードで勝つことは可能ですからね。

実際に、知り合いでスキャルピングが得意な人なんかは、マクロ経済はおろか、単純なファンダメンタルも知らない。
知ってるのは板の読み方だけ。でも勝てちゃう。

だから、私は従来の標準経済学はあまり勉強しなくてもいいと思う。
あくまでも常識の範囲で知っていれば、トレードにさほど差し支えることはないと思います。


 icon-check-square-o 認知心理学
じゃあ、経済学はまったくトレードの役に立たないのかと言えば、当然そんなことはないです。

今から勉強していく行動経済学を理解するためにも、ある程度は標準経済学も学んでいく必要があります。

で、ようやく本題。
タイトルにもある、行動経済学とはなんぞや?

まだ、歴史が浅い学問なので、知らない人も多いかもしれませんね。
超大雑把に説明すると、従来の経済学に心理学をミックスした感じです。

従来の経済学では、経済は「経済人」という超合理的な人間によって動いている、と考えられていました。

経済人は、すべてにおいて合理的かつ効率的に行動します。
私のように、メダルゲームに時間の無駄遣いはしません(笑)

ダイエットに失敗することもありません。
そもそも経済人は、ダイエットが必要になるまで太ることはないんじゃないかな?

一日の摂取カロリーと消費カロリーを計算して、最適な食事量と運動をします。
自分の利益のためだけに動きます。他人を気遣うようなことはしません。

このような経済人を、皮肉?で神のような人間と例えるのですが、私的には感情を持たない機械のような人間という印象を受けますね。

港北のお洒落な和カフェ|ノースポートにある「ナナズグリーンティー」

ナナズグリーンティー

 icon-check-square-o 和カフェ

一度入ってみたかった、ノースポート一階にある和カフェ「ナナズグリーンティー」
ついに行ってきましたよ♪

S__41115652

まあ、なんてキレイなお店の作りなんでしょう!

当然、おっさん一人では入りにくいです(笑)
客も女性が中心でした。

それもそのはず、和のスイーツがすごい充実してるんです。

S__41115651

これは彼女が頼んだスイーツ。
名前は忘れたけど、黒ゴマのアイスと抹茶フローズン、白玉入り。

見た目からして美味しそうだったけど、やっぱり最高でした(笑)

白玉ぜんざいにパフェ、わらび餅と充実のラインナップは、スイーツ好きの女子を虜にするんじゃないかな?


 icon-check-square-o 食事も充実

お腹が減ってたんで、正直スイーツだけだとキツイかな?と思ってたら、食事もとても充実してました。

でも、僕と彼女は二人ともアボカドに目がないので、この料理に即決(笑)

S__41115650

よくあるマグロとアボカド丼なんだけど、付いてきたソースがすっごい美味しかった。
アボカドも大き目に切ってあって、もちろんちょうど食べごろの硬さでした。

家で食べると、アボカドはタイミング難しいもんね。

あっ、この写真は彼女が頼んだミニなんですけど、これでもけっこうなボリュームですよね。

僕は通常サイズ頼んだんだけど、満腹になりました。
男性の方でも、お腹いっぱいになれると思います。

港北はデートスポットにもってこいだから、映画を観たあとに「ナナズグリーンティー」でお食事というコースがおすすめです。

ExcleVBA 繰り返し処理:For~Nextステートメント

0f2890d83857f2d3e50d317c4ef807c2_s

 icon-check-square-o 孤高の逡巡

今後のブログの方針、
というか、どうやってExcelVBAの解説をしていくか。

夕べ眠れずに絶望と戦いながら、考えましたよ。

ほんとですよ?笑

目先に拘って、流行りのCMや商品の紹介をしても、
自分にとって「財産」にならないもんね。

いや、月に数百万とか稼げるなら、それは財産だけど、
どう頑張っても無理そだもん。

だったら、数年後にも読んでもらえる、
みんなにシェアできるような記事を書きたいな。

と、思ったのはこれで72回目。

For~Nextステートメント

 icon-check-square-o 下準備

おっと、時間がない。
とりあえず、コードだけおいていきます。

・リボンに「開発」タブを表示
・セキュリティーの設定(マクロを有効)

この下準備ができていたら、
「開発」タブ ⇒ Alt+F11

で、VBE(Visual Basic Edtor)エディタを起動してください。

あっ、VBEとかエディタとか、
ステートメントだのオブジェクトだの、プロパティだの、etc…

そういった専門用語は、今は解説しません。
ときがきたら、必要なときに解説します。

まずは、実際にマクロを動かしてみるのが、一番かなと思います。


 icon-check-square-o VBEに記述

VBEを起動したら、
「挿入」 ⇒ 「標準モジュール」

これで、「Module1」という標準モジュールが作成されます。

そしたら、下記のコードを記述してください。


 icon-check-square-o sample01

Sub sample01()

Dim i As Integer

For i = 1 To 56

Range(“B” & i).Value = “STAP細胞”
Range(“B” & i).Font.ColorIndex = i

Next i

End Sub


 icon-check-square-o 実行結果

F5で実行を開始すると、色鮮やかなSTAP細胞が、
56色表示されたと思います。

sample01

では、このプロシージャの解説をしますかね!

コードの解説

 icon-check-square-o サブプロシージャ

Sub プロシージャ名()

プログラム

End Sub

Sub プロシージャ名()~End Subの間に、プログラムを記述する。
これはマクロの「お約束事」として、とりあえず覚えておいてください。

今回は、プロシージャ名を「sample01」としてますが、
プロシージャ名は、日本語でもOKです。

 icon-check-square-o 変数の宣言

Dim i As Integer

ここ、超重要です。
なるべくわかりやすく説明できるように、頑張ります。

このコードは、「これからiという数値の変数を使いますよ」、という意味です。
変数は「箱」って考えてもらえば、わかりやすいかもしれません。

Dim i As Integer
    ↓
これからiという数値を入れる用の箱を使いますよ

こうすることで、変数iに数値(正確には整数)を代入できるようになります。

たとえば、変数iの初期値は0ですが、i=256とすると、変数iの値は256になります。

次にもう少し、具体的な例もあげてみましょう。

i=20
i=i+5

こうすると、変数iの値はどうなるでしょう。

まずはじめに、iに20が代入されます。
これは、大丈夫でしょうか?

次が重要で、プログラムに慣れてない方は、数学と混合してわかりにくいと思います。
i=i+5???

プログラムの場合、=は等しいという意味ではなく、左辺に右辺を代入するという意味で使われます。

i=i+5の場合、iは5加算されます。
つまり、iに20が代入されたあと5加算されるので、iの値は25になります。

これじゃ、わかりづらいかなぁ…
超重要なので、もう一回説明しますね。


 icon-check-square-o 変数の代入

Dim x As Integer, y As Integer

x = 5
y = 70

y = y / x

Dim x As Integer, y As Integer
     ↓
整数型の変数、xとyを使うことを宣言します

x = 5
y = 70
 ↓
xに5、yに70を代入します

y = y / x
 ↓
yにy / x
つまり、yに70÷5を代入します

したがって、yの値は14になります

Rangeオブジェクト

 icon-check-square-o セルに対する操作

単純なようで奥が深い、Rangeオブジェクト。
まあ、僕も難しいことはわからないので、単純に使わせていただきます。

Range(“B4”).Value = “こんばんは”

セルB4に、「こんばんは」と記述します。
単純ですよね。

レンジというくらいだから、範囲も指定できます。

Range(“B4:G8”).Value = “こんばんは”

sample02

今のところは、Rangeオブジェクトについては、こういうもんだと覚えておいてください。

For~Nextステートメントの解説

 icon-check-square-o 繰り返し(ループ)処理

ようやく、本題のFor~Nextステートメントの解説に入れます。
Excel入門のサイトとか作ってる人ってすごいな…

でも僕も頑張って、できるだけわかりやすく解説します。

For i = 8 To 20 Step 4

コード

Next i

変数iに8を代入します。
iは4つずつ増えていきます。

iが20になるまで、For~Nextの処理が繰り返し行われます。
20になったら、ループを抜けます。

どうですかね…
わからないときは、実行してみましょう!


 icon-check-square-o サンプルマクロ03

Sub sample03()

Dim i As Integer

For i = 8 To 20 Step 4

Range(“B” & i).Value = i

Next i

End Sub

本日の集大成です。

Range(“B” & i).Value = i
このコードがわかりにくいと思うので、簡単に説明しますね。

Range(“B” & i).Value = i
     ↓
セルB & iに、iの値を記述します。
たとえばiの値が8だった場合は、セルB8に数値の8が記述されます。

うーん、わかりにくいので、実行してみましょう!


 icon-check-square-o サンプルマクロ03 実行結果

sample03

プログラムの流れとしては、まず整数型の変数iを宣言します。
そして、For~Nextの繰り返し処理に入ります。

はじめにiに8が代入されます。
なので、セルB8に数値の8が記述されます。

次は、iが4加算されます。つまり、iは12になります。
なので、セルB12に数値の12が記述されます。

この処理を、iが20になるまで繰り返します。

以上で、For~Nextステートメントの説明を終わります。
長々とお付き合いいただき、ありがとうございました。