2017年4月12日水曜日

Outlookの自動操作

これまではVBAの基礎からIEの自動操作までを解説してきました。
今回はOutlookの自動操作についての説明をしていきたいと思います。

まずはこちらのコードを見てください。
Sub Sample()
Dim objOL As Object   'Outlook本体
Dim myNS As Object   'NameSpace
Dim myB As Object   '対象メールボックス
Dim myF As Object   '対象フォルダ
Dim myItem As Object    'メール本体
Dim bnam As String  'メールボックス名
Dim fnam As String  'ログイン情報のシートの予約メールフォルダ
Dim s As Integer
'bnamとfnamの変数の代入
bnam = Worksheets("情報").Range("A1").Value
fnam = Worksheets("情報").Range("A2").Value

'Outlookの起動
Set objOL = CreateObject("Outlook.Application")

'NameSpaceの代入
Set myNS = objOL.GetNameSpace("MAPI")

'メールボックスの代入
Set myB = myNS.Folders(bnam)

'メールボックスの対象のフォルダ階層まで移動
Set myF = myB.Folders("受信トレイ").Folders(fnam)

'myFまで移動したOutlookを表示
myF.Display

'myFのフォルダのメールの数だけ繰り返す
For s = 1 To myF.Items.Count
    DoEvents

'メールを変数に代入する
    Set myItem = myF.Items(s)
'メールの本文を切り取る
    h = Trim(myItem.Body)
'対象のセルに本文を貼り付ける
    Cells(s + 1, 1).Value = h
'メールの変数を空にする
    Set myItem = Nothing
'本文の変数を空にする
    h = ""
Next
MsgBox "終了"
objOL.Quit
Set objOL = Nothing
End Sub
上記のコードを実行すると、情報のシートのA1のセルに入れた名前のメールボックスの情報のシートのA2のセルに入れたフォルダにあるメールを、全てExcelへ取り出してきます。

例えば仕事でメールで届いたものを「今まで何件も何十件もExcelへ取り出していた」という方の場合、このマクロを覚えてしまえば全て自動でExcelに取り出してきます。
また今までマクロでと考えていた人でもネットで情報が少なくて出来なかった人などいるかと思います。

そういう人はこの解説をよく読んで自分なりに新しく開発してみるのも良いかと思います。

Outlookの起動~NameSpaceの代入


まずはOutlookの起動からNameSpaceの指定までを解説します。
'Outlookの起動
Set objOL = CreateObject("Outlook.Application")
'NameSpaceの代入
Set myNS = objOL.GetNameSpace("MAPI")
Set objOL = CreateObject("Outlook.Application")
ここはIE操作【IE起動~読み込み】を勉強している人はわかると思います。
objOLへCreateObjectで作ったOutlook.Applicationを代入し、Outlookを起動しています。

Set myNS = objOL.GetNameSpace("MAPI")
次のNameSpaceの指定は始めて見ますよね?
このNameSpaceはVBAでは基本的に使用しませんので、このコードを丸暗記してもらえれば大丈夫です。

ちなみに簡単にNameSpaceを説明すると、例えば2人のプログラマーがそれぞれのパーツを作って1つのプログラムを作る時、同じ名前の変数を二人ともが宣言していると、実際にプログラムを動かす時、それぞれの変数の名前がぶつかり合います。
そうして変数が衝突してしまうとエラーが起こってしまうので、そういう時にNameSpaceを使い、「AさんのAという変数ですよ」とプログラムに教えるわけです。

メールボックスの代入~対象フォルダの表示


次に自動で操作したいメールボックスの選択から自動操作の対象になるフォルダの表示までを解説します。
'メールボックスの代入
Set myB = myNS.Folders(bnam)
'メールボックスの対象のフォルダ階層まで移動
Set myF = myB.Folders("受信トレイ").Folders(fnam)
'myFまで移動したOutlookを表示
myF.Display
Set myB = myNS.Folders(bnam)
このコードはメールボックスの変数先ほど指定したネームスペースの中のbnamに代入した名前のフォルダを代入」という処理をしています。
つまりOutlook内のbnamのメールボックスを変数にしています。

Set myF = myB.Folders("受信フォルダ").Folders(fnam)
このコードではフォルダの変数先ほど指定したメールボックス受信フォルダの中のfnamに代入した名前のフォルダを代入」という処理をしています。
こちらも同じようにOutlook内のfnamのメールボックスを変数にしています。

myF.Display
これはmyFに代入したフォルダを可視化=見えるようにしています。
今までのIEの自動操作だと「Visible = True」として可視化していましたが、Outlookでは.Displayを使います。

メールの取り出し


最後にメールの取り出し方です。
'myFのフォルダのメールの数だけ繰り返す
For s = 1 To myF.Items.Count
    DoEvents
'メールを変数に代入する
    Set myItem = myF.Items(s)
'メールの本文を切り取る
    h = Trim(myItem.Body)
'対象のセルに本文を貼り付ける
    Cells(s + 1, 1).Value = h
'メールの変数を空にする
    Set myItem = Nothing
'本文の変数を空にする
    h = ""
Next
For s = 1 To myF.Items.Count
このコードでは「1~myFのフォルダの中にあるメールの数だけ繰り返し」という処理をします。
IEの自動操作で言うところの「For Each」でオブジェクトの数だけ繰り返しをするイメージです。

DoEvents
これはIEの自動操作の読み込み待ちでも使っていたようにOSに処理を戻すということでPCを操作出来る状態にしてくれます。

Set myItem = myF.Items(s)
このコードではmyItemmyFのフォルダs番目のメールを代入」という処理を実行しています。
今更ですが、ところどころに出てきているItemsとはフォルダ内のアイテム=メールになります。
勘の良い方はとっくに気付いてたでしょうけどね。笑

h = Trim(myItem.Body)
これはhという変数に前後の空白を切り取った状態myItemBody部分=本文を代入」ということになります。
例えばmyItem.Bodyをそのまま代入すると本文の最初や最後に空白があった場合、そのままセルの中に入れてしまうので、私が使う時には邪魔になるのでこのように削除しています。

Cells(s + 1, 1).Value = h
これはもう大丈夫ですよね?
s+1行目の1列目のセルにhに代入したメールの本文を貼り付けます。

Set myItem = Nothing
h = ""

この2つのコードはmyItemとhの変数の中身を空にしています。
これは念の為に2つの変数の中身を空にすることで誤って変数が上書きされないことを防ぐ為に入れました。
Outlookの自動操作はあまりしていないので不安なところがあるので確実に動いているかのチェックの為に入れています。

最後に


ここまでの操作が出来るようになったらメールの本文の取出しが出来るようになると思います。
例えばBodyを使用したら本文を指定することになりますが、Toを使用したら宛先を指定する事になります。
他にもOutlookに対するプロパティやメソッドがあるので、その辺についてはまた次の機会に説明したいと思います。

2017年4月11日火曜日

セルやワークシートの指定

VBAを組んでいく上で一番大事になるのがセルの指定やワークシートの指定です。
例えばA1のセルに何か文字を入れたい時にA1のセルを指定出来ないと、どう頑張っても文字は入れれないですよね?
なのでまず1番最初にセルやワークシートの指定方法を覚えましょう。

例1)Cells(1, 1).Value = "A1のセル"
例2)Range("A2").Value = "A2のセル"
例3)Worksheets("Sheet1").Activate

ValueやActivateについてはまた別記事で説明しますが、Valueは値、Activateはアクティブにするとだけ覚えておいてください。

では例1から説明しますね。

Cells


例1では【Cells(,)】を使用しています。
このCellsは縦軸, 横軸のセルを指定するということになります。
例1の場合は1行目の1列目のセル=A1のセルになってるということです。
数学の表で言うy, xの事です。

Range


次に例2の【Range("A2")】です。
これは簡単ですね。
Rangeは次の("")に入ってるA2のセルの事を指します。
つまり、A3を("")の中に入れたらA3のセルを指しますし、A4を("")の中に入れたらA4のセルを指します。

Worksheets


最後に例3の【Worksheets("Sheet1")】です。
まずWorksheetssは「シートという物の中からこのシートを選びますよ」という事で複数の物から1つの物を選ぶので、複数形のsの付け忘れに注意してください。
次の("Sheet1")についてはこれもRangeと同じで("")の中のシートを指す事になるので、シート名をそのまま入力してください。

最後に


上記の3例の他にもR1C1形式を使ったセルの指定や、Rangeの中にRangeを入れたりと複数の段階を踏む事もありますのでその辺についてはまた別の機会に説明します。

IE操作【リスト選択~送信ボタン】

前回のIE操作【inputタグへの値の入力】ではユーザーフォームのHTMLで、inputのタグへの値の入力、チェックボックスやラジオボックスへのチェックを入れるところまでやりました。
今回の記事では、textareaのタグやselectタグの選択、IEの操作が終わった後の処理などについて解説していこうと思います。

では前回同様にサンプルページのユーザーフォームより、「メモ欄、Excelのバージョンのリスト、送信ボタン、IE終了後の処理」の操作について解説していきたいと思います。
フォームの入力【コード】より下記のコードの部分を解説していきます。
    'メモ欄への記載
        
    'objIEのHTMLの中からtextareaのタグをobjに代入しながら確認
    For Each obj In objIE.Document.GetElementsByTagName("textarea")
        
        'objに代入されたtextareaのタグのIDがnoteの場合
        If obj.ID = "note" Then
            'objに代入されたtextareaのタグにB7のセルの値を入れる
            obj.Value = Worksheets("情報").Range("B7").Value
        End If
    Next
    
    'Excelのバージョンの選択
    
    'objIEのHTMLの中からselectのタグをsltに代入しながら確認
    For Each slt In objIE.Document.GetElementsByTagName("select")
        
        'sltに代入されたselectタグのIDがversionだった場合
        If slt.ID = "version" Then
            'sltのタグに含まれるoptionのタグをoptに代入しながら確認
            For Each opt In slt.GetElementsByTagName("option")
                
                'optに代入されたoptionタグのInnerTextがB6のセルと同じだった場合
                If Trim(opt.InnerText) = Worksheets("情報").Range("B6").Value Then
                    'optに代入されたoptionタグを選択
                    opt.Selected = True
                End If
            Next
        End If
    Next
    
    '送信ボタンのクリック
    
    'objIEのHTMLにあるinputタグをobjに代入しながら確認
    For Each obj In objIE.Document.GetElementsByTagName("input")
        
        'objに代入されたinputタグのvalueの値が送信だった場合
        If Trim(obj.Value) = "送信" Then
            'objをクリック
            obj.Click
        End If
    Next
    
    '終了のメッセージボックスを表示
    MsgBox "終了"
    
    'objIEに代入したInternetExplorerを閉じる
    objIE.Quit
    
    'objIEを空にする
    Set objIE = Nothing
End Sub

テキストエリアへの入力


では上記コードより最初にメモ欄への記載について解説したいと思います。
今回もHTMLとVBAのコードを確認しながら解説していきた思いますので、まずは下記HTMLとVBAのコードをご覧ください。
メモ欄のHTML
<th>メモ欄</th>
<textarea id="note" rows="3" cols="40"></textarea>
VBAのコード
'メモ欄への記載
'objIEのHTMLの中からtextareaのタグをobjに代入しながら確認
For Each obj In objIE.Document.GetElementsByTagName("textarea")
    'objに代入されたtextareaのタグのIDがnoteの場合
    If obj.ID = "note" Then
        'objに代入されたtextareaのタグにB7のセルの値を入れる
        obj.Value = Worksheets("情報").Range("B7").Value
    End If
Next
結論を言うと、こちらのコードは前回とほとんど同じです。
取得するタグがtextareaになっているだけという感じなので解説は軽くにします。

【For Each obj In objIE.Document.GetElementsByTagName("textarea")】
これは前回のinputタグを取得した時と同じで、objの変数にobjIEのHTMLの中からtextareaというタグを取得していきます。
これはもうわかりますよね?

【If obj.ID = "note" Then】
こちらも上記と一緒で前回解説したobjに代入されたタグのIDがnoteだった時に次の処理に行くという内容です。

【obj.Value = Worksheets("情報").Range("B7").Value】こちらも前回のハンドルネームと一緒で「noteというIDのtextareaタグにB7のセルの内容を入れますよ」という事なので、もうわかりますよね?

この様にHTMLのタグが違ってもIDなどから処理したい要素を探し、Valueなどで値を入れるということは一緒なので、この事を覚えておいてください。

リストボックスの選択


では次にExcelのバージョンのリスト選択について解説します。
ExcelのバージョンのHTML
<th>Excelのバージョン</th>
<select id="version">
<option value="2016">Excel2016</option>
<option value="2013">Excel2013</option>
<option value="2010">Excel2010</option>
<option value="2007">Excel2007</option>
</select>
VBAのコード
'Excelのバージョンの選択
'objIEのHTMLの中からselectのタグをsltに代入しながら確認
For Each slt In objIE.Document.GetElementsByTagName("select")
    'sltに代入されたselectタグのIDがversionだった場合
    If slt.ID = "version" Then
        'sltのタグに含まれるoptionのタグをoptに代入しながら確認
        For Each opt In slt.GetElementsByTagName("option")
            'optに代入されたoptionタグのInnerTextがB6のセルと同じだった場合
            If Trim(opt.InnerText) = Worksheets("情報").Range("B6").Value Then
                'optに代入されたoptionタグを選択
                opt.Selected = True
            End If
        Next
    End If
Next
【For Each slt In objIE.Document.GetElementsByTagName("select")】
上記のコードも今までの解説とほとんど同じで、sltの変数にobjIEのHTMLの中からselectのタグを取得しています。
これはもう簡単ですよね?

【If slt.ID = "version" Then】
これもまたまた今まで通りで、sltの変数に入ったselectタグのIDがversionの時、次の処理をします。

【For Each opt In slt.GetElementsByTagName("option")】
やっとここから今までとは違った処理をします。
まず、optの変数にoptionを代入することはわかると思います。

ただ、ここが違います。
【slt.GetElementsByTagName】
このように先程sltに代入したタグの中にあるoptionというタグを取得するようにしています。

まず、HTMLを見ながら確認してもらうと分かりやすいと思うのですが、<select>~</select>の間に<option>~</option>というタグが挟まれていると思います。
このようにselectタグで囲まれているoptionタグの中の値がリストのパーツになります。

では上記のslt.GetElementsByTagNameselectタグに挟まれたoptionタグをあわせて考えると、sltにはselectタグが代入されています。
その「sltに代入されたselectタグの範囲からoptという変数にoptionのタグを代入していく」という処理をしていっているのです。

注意点としては、Documentを入れないことです。
Documentを入れてしまうとHTML全体から探してしまうので、他にoptionタグがあった時、全てのoptionタグに対して処理をしてしまうので、sltに代入されたリストだけを操作したい時には、必ずDocumentを抜いてあげましょう。

ボタンのクリック


次は送信ボタンの実行について説明します。
送信ボタンのHTML
<input  onclick="inf(frm)" id="date" value=" 送信 " type="submit">
VBAのコード
'送信ボタンのクリック
'objIEのHTMLにあるinputタグをobjに代入しながら確認
For Each obj In objIE.Document.GetElementsByTagName("input")
    'objに代入されたinputタグのvalueの値が送信だった場合
    If Trim(obj.Value) = "送信" Then
        'objをクリック
        obj.Click
    End If
Next
こちらは前回のIE操作【inputタグへの値の入力】で解説した、ラジオボックスの選択とほとんど一緒です。

【For Each obj In objIE.Document.GetElementsByTagName("input")】
こちらはもうお分かりですよね?
objにobjIEのHTMLからinputタグを代入していきます。

【If Trim(obj.Value) = "送信" Then】
こちらが少しだけ違いますが、objに代入されたinputタグのvalueの値が送信だった時に次の処理に進みます。

【obj.Click】
こちらもわかりますよね?
objをクリックするだけです。

前回の記事からここまで理解できたら、ユーザーフォームの操作は出来るようになってると思います。
何度も言いますが、基本の流れは
【For Eachで変数へタグを代入し、そのタグが操作したいタグかをIfで確認する】
という流れになります。
この事を覚えたら、後はHTMLを確認してどのタグの何を確認して処理をするかを考えるという事になります。

オブジェクトの解放


最後に1つ、やっておかないといけないことがあります。
'objIEに代入したInternetExplorerを閉じる
objIE.Quit
'objIEを空にする
Set objIE = Nothing
【objIE.Quit】でIEを閉じます。
次の【Set objIE = Nothing】が大事で、objIEにInternetExplorerを代入したままだと、objIE.QuitでIEを消しても、PCのプロセスとしては起動したままになります。
なのでSetを使い、objIEの中身をNothingで空にして終了してください。

またマクロ実行後にInternetExplorerを目視で確認したい時もあると思います。
そういう時にはobjIE.Quitは省くことでIEを閉じないように出来ますので、必要に応じてobjIE.Quitは入れてください。
ただし、Set objIE = Nothingは入れておくことでマクロからIEを解放できますので、こちらはIEの自動操作をする場合、必ず最後に入れておいた方が良いと思います。

最後に


このIEの操作の解説はいかがでしたか?
結果実際に動かして、何をしているかを確認しながら理解することが一番覚えれるので、このブログを参考にしながら、コピペでもいいので動かしてみて、分からなければコメントなどで質問頂ければお答えしますので実践してみてください。

次からはIE上の表の出力を解説していきたいと思います。

IE操作【IE起動~読み込み】

では前回のIEの自動操作の1つ目のボタンに登録しているマクロの解説をしていきたいと思います。
今回解説する部分はフォームの入力【コード】から抜き出してきた下記のコード部分です。
Sub IE操作()
Dim objIE As Object
Dim obj As Object
Dim slt As Object
Dim opt As Object
Dim s As Integer
Dim hname As String
Dim brd As String

'hnameの変数にB2のセルの値を代入
hname = Worksheets("情報").Range("B2").Value

'pasの変数にB3のセルの値を代入
brd = Worksheets("情報").Range("B3").Value

'InternetExplorerをobjIEに代入し、IEのプロセスを起動
Set objIE = CreateObject("InternetExplorer.Application")
    
    'IEを可視化するか = はい
    objIE.Visible = True
    
    'IEのリンク先URLは情報のシートのB1のセルのURL
    objIE.Navigate Worksheets("情報").Range("B1").Value
    
    'IEの表示待ち
    wait objIE
Sub wait(objIE As Object)
'objIEに代入されたInternetExplorerがビジー状態、もしくは読み込み待ちの間、処理を待つ
Do While objIE.Busy Or objIE.ReadyState < 4
    DoEvents
Loop
End Sub
上記のコードを解説していきたいのですが、1つの記事だとあまりに長くなりますので分けて解説しようと思います。

変数宣言~代入


まずは変数です。
もう大丈夫だと思いますが、おさらいという事で解説していきます。

Dim objIE As Object  =  InternetExplorerのオブジェクトなので略してobjIE
Dim obj As Object    =  オブジェクトの代入の際に使うためオブジェクトを略してobj
Dim slt As Object    =  IEを操作する際のHTMLのタグにあるselectを略してslt
Dim opt As Object    =  IEを操作する際のHTMLのタグにあるoptionを略してopt
Dim s As Integer     =  繰り返しの際に使う変数でStartの意味からs
Dim hname As String  =  HandleNameを略してhname
Dim brd As String     =  BirthDayを略してbrd

というように自分で使いやすい名前で変数宣言しています。

次に変数の代入ですが、下記のほかにもForやFor Eachでの代入もありますが、そちらはForやForEachの解説の際に説明していきます。

hname = Worksheets("情報").Range("B2").Value
brd = Worksheets("情報").Range("B3").Value
Set objIE = CreateObject("InternetExplorer.Application")

上記3つありますが、以前の変数の代入【Dim】でも解説していますが、代入する型の違いから覚えることは2種類だけです。

IEの起動~状態~サイトへのアクセス~読み込み待ち


Set objIE = CreateObject("InternetExplorer.Application")上記の変数の代入ではオブジェクトを代入するので、変数名の前にSetをつけて「Set 変数名 = 代入するオブジェクト」となります。
また、【CreateObject("")】は、そのまま英語を訳してオブジェクトを作成するということになりますので、オブジェクトを作成する際に使用します。
今回はIEを起動するのでIEのオブジェクトの作成が必要になりますのでCreateObjectでInternetExplorer.Applicationを作成してます。

他の2つに関しては変数に文字列を代入するのでSetなどは使わず、「変数名 = 代入する値」という事になります。

次のobjIE.Visible = Trueについては、作成したオブジェクト=IEのウィンドウ表示する
上記の色分けの様にIEの可視化をするかしないかになります。
もし可視化しない場合はTrueの部分をFalseにしてあげる事でウィンドウが表示されない状態になります。

次に【objIE.Navigate Worksheets("情報").Range("B1").Value】です。
これは「IEでどこどこのサイトにアクセスしてください」という命令になります。
「情報のシートのB1のセルにあるURLにNavigateで行きますよ」という意味になります。
また、直接URLを指定する場合はobjIE.Navigate "URL"というように""で囲んだURLを記載します。

最後に【wait objIE】ですが、先に【Sub wait(objIE As Object)】を理解した上で解説しないと難しいと思いますので、そちらを先に解説します。
また、Subプロシージャの呼び出しについて理解していると次に進みやすいと思いますので、こちらのSubプロシージャの呼び出しもあわせて確認するといいかもしれません。

上記のwaitというSubプロシージャ内で処理している内容を簡潔に説明すると、「IEが読み込みをしている最中、もしくはビジー状態で動かない時、DoEvents関数でOSに処理を戻す事で読み込み待ちをしている」という状態になります。

この処理をしないでIEの操作をするとどうなるかというと、IEがページを読み込んでいないのに、次のマクロの処理に入ってしまうので、意図しない操作をしてしまうことになります。
なので正確な処理をするためにもwaitというSubプロシージャの内容は覚えておいてください。

では上記を踏まえた上で【wait objIE】について解説します。
これは「SubプロシージャをSubプロシージャから呼び出して処理をする」ということになります。
どういうことかというと【Sub IE操作()】を実行している中で【Sub wait(objIE As Object)】を呼び出して実行しているのです。

表記については【Subプロシージャ名 受け渡す変数名】となります。
実行する側のプロシージャにも受け渡される変数を宣言しないといけないのですが、その変数を宣言する場所が、Sub プロシージャ名()の括弧の部分になります。

ここが最初のうちは少し慣れないと思うのですが、SubプロシージャからSubプロシージャを呼び出す理由としては、IEの操作をする際、ページが変わる度に読み込み待ちの処理を入力すると大変なので、なら1つだけSubプロシージャとして書いておいて、読み込み待ちの処理をする度にSubプロシージャを呼び出そうという事です。

最後に


VBAを勉強始めたばかりの時は、ここまでの解説でもかなり難しく感じると思いますが、実際に実行したりHTMLを見てみることで感覚を掴むのが一番早い上達方法だと思いますので、難しく考えず1つ1つゆっくり進んでみてください。

では次回は値の入力について解説していきたいと思います。

VBAの基礎用語

記事の順番がバラバラですが、VBAの基本文法でも少し触れているのですが、プロパティやメソッド、ステートメントやプロシージャといった用語が出てきています。

この用語の意味を簡単にですが、解説していけたらと思います。
まず、ここでは6種類の用語を説明したいと思います。

1.プロシージャ(Sub~End SubやFunction~End Function等)
2.オブジェクト(セルやワークシート、ワークブック等)
3.ステートメント(If~End IfやFor~Next等)
4.プロパティ(ValueやName等)
5.メソッド(SelectやMove等)
6.関数(MidやTrim等)

この6種類の用語を覚えると、コーディングする際に「何が足りてないか」や「何をしたいか」等を調べる際にも役に立ちます。

ではこの用語を1つずつ説明していきたいと思います。

プロシージャ


プロシージャとは主に1つのコードの集合体です。
つまりマクロ本体のことです。
Sub a()
Dim s As Integer
b s
MsgBox "終了"
End Sub

Sub b(s As Integer)
s = 1
MsgBox s
End Sub
上記を実行すると最初に「1」と表示されて次に「終了」と表示されると思います。
そこはおいといて、これは2つのプロシージャを実行しています。
つまりSubの塊の数=プロシージャということです。
他にもFunctionもプロシージャに含まれます。

オブジェクト


オブジェクトとは操作対象になる物の事です。
例えばExcelのシートやブック、セルもオブジェクトですし、IEの自動操作する時のIE本体やサイトのボタンなどもオブジェクトに含まれます。
Sub a()
Worksheets("sample").Select
Range("A1").Select
End Sub
このWorksheetsやRange等がオブジェクトになります。
VBAの基本文法の記事で詳しく説明しているのですが、VBAの基本的な文法としては「オブジェクト.プロパティorメソッド」となっており、このオブジェクトが操作対象プロパティorメソッドが操作方法というようになっています。

ステートメント


ステートメントとはマクロの処理方法です。
例えばIf~Else~EndIfやFor~Nextの様に繰り返しや条件などを指定し、マクロを実行する際の動きになります。
Sub a()
For s = 1 To 10
    Cells(s, 1).Value = s
Next
End Sub
このFor~Nextの部分がステートメントです。
Forでは繰り返しを、Ifでは条件分岐を、とマクロがどういう処理を行うかを決める部分がステートメントと呼ばれます。

プロパティ


プロパティとは操作対象に対する情報の部分に当たります。
例えばValueでは操作対象(オブジェクト)の値を指定、もしくは取得します。
Sub a()
Range("A1").Value = "ここだよ!"
MsgBox ActiveSheet.Name
End Sub
このValueとNameがプロパティです。
Range("A1").Value = "ここだよ!"
上記のコードは「A1のセルのを「ここだよ!」にしてください」という意味になります。
MsgBox ActiveSheet.Name
上記のコードは「メッセージボックスに今選んでいるシートの名前を出してください」という意味になります。
このように名前などの情報プロパティになります。

メソッド


メソッドはプロパティに似ているのですが、操作対象に対する動きの部分に当たります。
例えばSelectでは操作対象(オブジェクト)を選択します。
Sub a()
Worksheets("Sheet1").Select
Range("A1").Select
End Sub
上記のコードのようにシートやセルというオブジェクトに対する選択という動きがメソッドになります。
他にもわかりやすいもので言うとMoveは英語の意味そのままに動きなのでメソッドになります。

関数


関数とはプロパティなどの情報を処理し、形を変える操作の部分に当たります。
例えばTrimではValueやInnerTextなどで取得した値の前後にあるスペースを削除する操作をします。
Sub a()
Range("A1").Value = " 空白があるよ? "
MsgBox Trim(Range("A1").Value)
End Sub
このMsgBox Trim(Range("A1").Value)では「 空白があるよ? 」ではなく「空白があるよ?」がメッセージボックスでは出力されます。
A1のセルの文字の前後のスペースをTrimでは削除してくれますのでスペースが入っていない状態の文字が出力されるのです。

この様に情報に対する処理をし、形を変えた状態で出力する操作をしているのが関数です。
この変更前の情報を引数(ひきすう)といい、形が変わった状態を戻り値(もどりち)と言います。

最後に


最後に上記をまとめると
プロシージャ・・・コードの集合体
ステートメント・・・処理方法
プロパティ・・・情報
メソッド・・・動き
関数・・・操作 

ということになります。

この事を覚えてVBAの基本文法を見ると意味がわかりやすくなると思います。

2017年4月7日金曜日

VBAの基本文法

突然ですが、例えば喋る時や文字を書く時、英語などでも文法って学校行ってた頃に散々先生達からよく言われたと思います。笑
VBAでも日本語や英語等の様にパソコンに対しての文法があるのです。

人間同士なら予想しあったり感情で伝えることが出来ますが、パソコンを相手にした時にはそうはいきません。
パソコンではあらかじめ言語を作った人達によって文法が決められており、その文法から外れてしまうとエラーという形で「伝わりませんよ~」と返ってくるのです。

ではその文法から外れない為にも簡単にですが、基本的な文法を2つ紹介したいと思います。

例)Range("A1").Value = "ここに文字を入れてね?"

上記の例の様にコードを書いて実行するとExcelのA1のセルに「ここに文字を入れてね?」と文字が入力されます。
このコードを日本語でわかりやすく訳すとA1のセルのここに文字を入れてね?にしてね」という意味になります。

このオレンジの文字の部分オブジェクトと呼ばれるもので、実際に人間が操作するもの、例えばA1のセルもそうですし、ここで紹介してるようにIEの操作をする時のIE本体だったりもオブジェクトと呼ばれます。
イメージとしては既存の箱パーツのようなものです。

次の緑の文字の部分プロパティメソッドという部分になります。
このプロパティメソッドはオレンジのオブジェクトに対しての動作や情報等になります。
例えば今回のValueで言うと、A1のセルというオブジェクトのがプロパティになります。

次の赤の文字の部分演算子と呼ばれ、数学で使うような「+-*/=」等の記号が入ります。
今回の場合は、上記リンクの代入演算子の部分にある「=」で「右を左に入れる」という動作をしています。
他にもIfステートメント等では不等号(<>)等も使うことがあります。

最後に水色の文字の部分代入される値になります。
Ifステートメントの時は左に対する条件になりますし、変数の代入の時には代入される値になるように、この部分は必要に必要に応じて変わります。

例えば【If Range("A1").Value = Range("B1").Value Then】と書いた場合、水色の部分は上記のオレンジと緑の部分と同じ文法になります。
この様に水色の部分は左に対する物なので、内容が変わる部分になります。

まとめるとオブジェクト.プロパティorメソッドという文法が出来上がります。
赤の部分や水色の部分はステートメント等によって必要がない場合もありますので、まずは上記の形を覚えてください。

上記の様にたった2つのポイントだけがVBAの文法になります。
英語とかみたいに「~は~で~・・・」みたいに長々と覚える必要がないので簡単ですよね?笑

ただし、IEの操作をする時やシートやブックの操作が入る時等はオブジェクトが複数になることがあります。

例)Workbooks("sample.xlsm").Worksheets("sample").Range("A1").Value

上記の様に「sample.xlsmというブックのsampleというシートのセルA1」というように【オブジェクトのオブジェクトのオブジェクトのプロパティ】という文法になります。

これもまとめてしまうと「3つのオブジェクトのプロパティ」ということなので、「オブジェクト.プロパティ」という言い方も出来てしまうので、基本としてオブジェクト.プロパティを覚えておいてください。
また、この事を意識してこれからのコードを見ていくと、「どういうものをどう動かしているか」という事が理解しやすくなると思います。