インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBAに興味が沸いた方々へ④

基本④です これで最後。③同様Powerpoint独自の話ではありませんので,ExcelVBAの書籍やページを見るのがいいかと思います。探してまでやるほどではないけど,すぐ見れるならみてもいいかな,という方々が私の想定です。
長くなったので基本⑤まで書きます (ノД`)・゜・。

ExcelVBAを記録マクロからスタートした方が出会う壁が 条件分岐と繰り返し処理。これは記録できないからです。
ですので,この二つのうち最低これだけ知れば先が開けるという部分を自分なりにまとめる感じです。
繰り返し処理については基本⑤に続きます・・(;´▽`A``

条件分岐
If文とSelect caseの二つを紹介します。この二つでほぼ事足りるかなぁと。

1.If文
条件やその後の処理がとても短い場合は1文で書けます。

If [条件] Then [条件がTrueの場合の処理] Else [条件がFalseの場合の処理]

プログラミング自体初めてだとナンダヨソレな表現がたくさんなので,例を書いてから説明をします。

Sub test()
    a = 3
    If a > 1 Then Debug.Print "aは1より大きい" Else Debug.Print "aは1より大きくない"
    
    b = 1
    If b > 1 Then Debug.Print "bは1より大きい" Else Debug.Print "bは1より大きくない"
End Sub
実行結果
test
aは1より大きい
bは1より大きくない

いかがでしょうか。 条件が満たされている場合は True と返される,条件が満たされていない場合は False と返される仕組みがあります。
イミディエイトウィンドウに test [Enter] と入力すると testマクロを実行してくれます。

aのほうでは, aに3を代入した条件式 3>1 は Trueを返すので Thenのすぐ後の処理 Debug.Print "aは1より大きい" が実行される。
bのほうでは, bに1を代入した条件式 1>1 は Falseを返すので Elseのすぐ後の処理 Debug.Print "bは1より大きくない"が実行される。
Debug.Printというのはイミディエイトウィンドウに結果を出力するための命令です。とても便利なのでぜひ知っておいてください。

True,Falseについてはイミディエイトウィンドウで遊んでみると簡単にわかっていただけると思います。

?5>1
True
?0>1
False

イミディエイトウィンドウで 最初に?をつけて書いて[Enter]を押すと,その値を知ることができ,条件式ならtrue,falseを確認できます。
※PowerpointVBAの引数(ひきすう)ではmsoFalseとかmsoTrueになっているものが多く混乱しますが,そこはがんばって対応してください。

さて,処理が長い場合はこれじゃあ大変なので,If Then Elseには次の書き方もあります。

If [条件式] Then
    [Trueの場合の処理1]
    [Trueの場合の処理2]
    [Trueの場合の処理3]
    ・・・
Then
    [Falseの場合の処理1]
    [Falseの場合の処理2]
    [Falseの場合の処理3]
    ・・・
End If

同じ意味ですが,複数行書きやすくなってるんですね。
終わりを自動認識することはできませんので,End Ifで終わらせてあげる必要があります。
ちょいちがうものに,

If [条件1] Then
    [条件1がTrueの場合の処理1]
    ・・・
ElseIf [条件2] Then
    [条件2がTrueの場合の処理1]
    ・・・
Else
    [これまでの条件がすべてFalseの場合の処理1]
    ・・・
End If

こうすると,条件を次々と評価でき,全部Falseだったときは最後のFalseにたどり着くということになります。
どれかの条件でTrueとなったら,直後の処理が行われた後End If以降に飛んでいくので,そこは気を付けましょう。
この命令あたりから,インデントをぜひ気にしてください。If ElseIF Else End If が目立つように各場合の処理については[Tab]キーなどで数文字ずらす。
そうすることで構造を見易くすることができます。これをしなくてもコードは動きますが,間違いを探したりコードを読み解くときに大変です。

2.Select case文
この書き方をスマートにした感じが Select case になります。

Sub test2()

a = "大吉"

Select Case a
    Case "凶"
        Debug.Print "大凶よりは運がよかったから大丈夫"
    Case "大凶"
        Debug.Print "とっても数は少ないからむしろ運がいいかも!"
    Case "中吉"
        Debug.Print "なかなかイイネ。がんばって自力で良くしましょう"
    Case "吉"
        Debug.Print "今年は平穏なようです(ΦωΦ)"
    Case "大吉"
        Debug.Print "すばらしい運勢です なにかにチャレンジしてみては?"
    Case Else
        Debug.Print "あれれ,(・・? もしや小吉デスネ。ガンバ(* ̄▽ ̄)"
End Select

End Sub

実行結果は推測にまかせます。
Select Caseの意味より私の能天気さのほうが伝わるかもしれませんが,多くの条件についてスマートに表現する方法です。
Select Case を使用して複数の選択肢から処理を決定する
詳しくはこちらをご覧ください。全て書いてたら大変(;´▽`A``

ちょっと書き換えて

Sub test2()

'a = "大吉"
a = "小吉"

Select Case a
    Case "凶"
        Debug.Print "大凶よりは運がよかったから大丈夫"
    Case "大凶"
        Debug.Print "とっても数は少ないからむしろ運がいいかも!"
    Case "中吉"
        Debug.Print "なかなかイイネ。がんばって自力で良くしましょう"
    Case "吉"
        Debug.Print "今年は平穏なようです(ΦωΦ)"
    Case "大吉"
        Debug.Print "すばらしい運勢です なにかにチャレンジしてみては?"
    Case Else
        Debug.Print "あれれ,(・・? もしや小吉デスネ。ガンバ(* ̄▽ ̄)"
End Select

End Sub

こうしたらどうなるか。
' はその後のものをコメントにしますという意味なので,a="大吉"は実行されません。ですからaの値には"小吉"が入ります。
このように,本来入れたいものを消さずに,ほかの例ではどうなるかなーというときは,本来の文をコメントアウトして他の値を入れてみるということができます。

でも,これでも面倒ですね・・。ちょっと難しいことをしましょう。

Sub test2(a As String)

Select Case a
    Case "凶"
        Debug.Print "大凶よりは運がよかったから大丈夫"
    Case "大凶"
        Debug.Print "とっても数は少ないからむしろ運がいいかも!"
    Case "中吉"
        Debug.Print "なかなかイイネ。がんばって自力で良くしましょう"
    Case "吉"
        Debug.Print "今年は平穏なようです(ΦωΦ)"
    Case "大吉"
        Debug.Print "すばらしい運勢です なにかにチャレンジしてみては?"
    Case Else
        Debug.Print "あれれ,(・・? もしや小吉デスネ。ガンバ(* ̄▽ ̄)"
End Select

End Sub

面倒だったり,まだ変数の型はよくわからないなぁという方は 最初の部分を Sub test2(a) だけにしても動きます。
使ってみましょう
イミディエイトウィンドウに いままでと同じようにマクロ名 test2 [Enter] を入れると
f:id:chemiphys:20170109142044p:plain
怒られますね。引数(ひきすう)は省略できません,と。引数というのはここでいう a のことです。 test2(a As String) と書いたことで,マクロにaの値を渡しますよ,という書き方です。
この場合は次のように使います。
f:id:chemiphys:20170109142236p:plain
一番上の test2だけいれたものは 怒られたので,何も返してくれていません。次の二つはマクロが返事をしてくれています。
マクロ名の後にスペースを一つ入れて引数を書く。文字列は""で囲んであげましょう。囲まないと変数名と勘違いされて 想定外の動きをすることになります。
これ,test2("大吉")とか書いても動くんですが,その結果を何かの変数にいれる気が無いときは,()は使わない書き方を,逆に変数に結果を入れるときは()を使う書き方をするといいです。いいです,というか後者の場合は()をつけないと確実に怒られます。。

さて,あとは繰り返し処理。次こそ最後に(;´▽`A``