【ExcelVBA】新規ブックの作成、ブックを開く

VBAでブックを操作

 icon-check-square-o 新規ブックの作成

Sub sample01()
    Workbooks.Add
End Sub

WorkbooksコレクションのAddメソッドで、新規ブックを作成します。
Addメソッドは、コレクションに新しいメンバーを追加するメソッドです。


 icon-check-square-o ブックを開く

Sub sample02()
    Workbooks.Open Filename:="C:\Users\PCUser\Desktop.test01.xlsm"
End Sub

●保存先を指定してブックを開く
FileName:=”ドライブ名:フォルダ名:ファイル名:拡張子”

カレントフォルダのブックを開く場合は、ドライブ名、フォルダ名を指定する必要はありません。
カレントフォルダとは、現在選択されているフォルダのことです。

Workbooks.Open Filename:=”test01.xlsm”

引数名(Filename)は、省略することができます。
引数名を省略して、メソッドのすぐあとに引数の値を指定する方法を「標準引数」とよびます。

メソッドの引数が多いときは、名前付き引数を利用した方がステートメント(文、命令文)はわかりやすいですが、メソッドの引数が少ないときは省略しても問題ありません。

Workbooks.Open Filename:=”test01.xlsm”
       ↓
Workbooks.Open “test01.xlsm”

【ExcelVBA】そもそもマクロとは?VBAとの違いは?基本用語の解説

マクロの基本用語

 icon-check-square-o マクロとVBAの違い

ここではマクロの基本用語を簡単に紹介していきます。

まず、そもそもマクロとは何でしょう?
私もプログラミングをする際に、何気なくマクロやVBAという言葉を使ってしまっていますが、その違いを説明することはできません。

なのでこれを機会に、マクロの基本用語をしっかりと覚えておきたいと思います。

■マクロとは
VBAで記述されたプログラム

■VBAとは
マクロを作成するために用意されたプログラミング言語

なるほど。
マクロ=プログラム、VBA=プログラミング言語だったんですね。

もっと詳しく解説すると、VBAはOffice製品のアプリケーションを開発するために言語で、最初はVBAが搭載されていたのはExcelだけでした。
しかしOffice2000以降は、すべてのOffice製品にVBAは搭載されています。


 icon-check-square-o 用語解説

■キーワード
RangeやActiveCellなど。
マクロのために用意されている単語のこと。

■コメント
シングルクォーテーション(’)で始まる文はコメント行として、緑で表示されます。
コメント行はマクロの動作とは無関係なので、コードの説明やメモなど自分の好きなコメントを記述することができます。

■ステートメント
マクロの中の個々の命令文のこと。
マクロはステートメント単位で命令を実行していきます。

■VBE
Visual Basic Editorの略。
マクロの作成や編集など、VBAプログラミングの作業はすべてVBEで行われます。

■モジュール
マクロを記述するための専用シートです。

■プロジェクト
モジュールの集まり。
標準モジュール、ユーザーフォーム、クラスモジュール、Excelオブジェクト(ブック、ワークシート、グラフシート)を1つに束ねたものです。

【確率・統計学】うちにはそんなに貯蓄はない!平均と中央値の違い

平均貯蓄額と中央値

051216-659x1024

 icon-check-square-o 二人以上の家庭の平均貯蓄額

2013年の調査によると、二人以上の家庭の平均貯蓄額は約1100万円だそうです。

えー!うちはそんなに貯金ないよ?
と、心配になった方も多いでしょう。あっ、でもこのブログの読者はトレーダーが多いだろうから、お金持ちも多そうだな…

それでも、平均以上。貯蓄額が1100万円以上ある方は、半分以上もいないでしょう。
実際に貯蓄額が1100万円以上の方は、3割程度しかいません。つまり7割の方はそんなに貯金はないのです。

平均以下が7割なの?5割じゃないの?と思ったあなた。
ありがとうございます。最後までこの記事を読んでいただければ、少しはお役にたてるはずです。


 icon-check-square-o 平均の求め方

大学生レベルになってしまうので、詳しい説明は割愛しますが、平均にもいくつかの種類があります。

ふつう平均といったら相加平均のことをいうので、ここでも平均=相加平均として扱います。

平均の求め方は、なんとなくはわかりますよね?
そう、合計を個数で割ったものです。

平均=総和÷個数n

具体例を一つ示しましょうか。

【例】
ボーリングを5G投げたときのスコア

ボーリングスコア

計算式:(128+147+161+118+138)/5=138.4


 icon-check-square-o 平均の問題点

異常値が含まれていると、それに平均が引きずられてしまうということです。
これも具体例を用いた方が説明しやすそうですね。

【例】
5人の平均年収

平均年収

ビルゲッツさんのような異常値があると、総和が大きくなるので平均も高くなってしまいます。
5人の平均年収を9億400万円と考えるのは、おかしいですもんね。

この場合は、平均ではなく中央値で考えた方がいいです。


 icon-check-square-o 中央値とは

データが奇数個の場合、下から(上から)数えてちょうど真ん中に位置する値です。
先ほどの例の場合は、5人中3番目、500万円(Bさん)が中央値になります。

データが偶数個の場合、真ん中に近い二つの値の平均です。

【例】
22,58,11,24

中央値=(22+24)÷2=23

中央値は平均と違い、異常値に引きずられません。
なので比較をするときは、中央値を使った方が現実的かもしれませんね。


 icon-check-square-o 平均貯蓄額がやけに高い理由

もうおわかりでしょうか?
平均貯蓄額が思いのほか高く感じるのは、一部のお金持ちによって平均が引き上げられているからです、羨ましい。

実際に冒頭の調査だと、中央値は330万円で平均と大きな差があります。

これで安心したでしょうか。
もし、これでもうちにはそんなに貯蓄はない!という人は頑張ってください、はい私も頑張ります。


 icon-check-square-o 苦手な確率・統計

サンプルが少なすぎてアテにならないとはいえ、アンケートでは確率・統計学が一番興味があるという結果になっているので、今日はそのことについて記事を書きました。

ちなみに、このブログのメインコンテンツを行動経済学、Excel、確率・統計学の3つのどれにするかで迷っていますが、その中で一番知識がないのが確率・統計学です。

うーん、私の知識は高校生レベルくらいかな?
少なくとも大学生レベルの知識はないのは確かです。

それでもトレードは十分勝てると思いますけどね。
このブログを見てる中学生レベルの方は、ぜひ私の記事を参考にしてください。

【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は動作が安定しないので推奨されていないようです。
でも、手操作と同じことをできるので、とても便利な関数ですね。