Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MS Officeの便利な使い方 - VBAで始めるプログラミングのススメ

MS Officeの便利な使い方 - VBAで始めるプログラミングのススメ

2014/03/26 ALBERT社内勉強会
色々まずければお知らせ下さい。消します。

Takeru Ichii

March 26, 2014
Tweet

More Decks by Takeru Ichii

Other Decks in Technology

Transcript

  1. MS OFFICEの
    便利な使い方
    VBAで始めるプログラミングのススメ

    TAKERU ICHII
    Welcome to
    Programming World!

    View full-size slide

  2. 本日お伝えしたいこと
    •  プログラミングとは?
    •  VBAとは?
    •  VBAの利点・欠点
    •  Hello World!

    View full-size slide

  3. 今日の意気込み
    なるべくわかりやすくお伝えするつもりです
    ですが文字が多いのでそこは勘弁して下さい

    View full-size slide

  4. 今日の基本方針
    •  ぼく
    •  いわゆる「おまじない」という表現はつかわない
    •  なので途中で終わっちゃいます
    •  面白くやる
    •  みなさん
    •  わかんないことがあれば適宜質問をお願いします
    •  後述の場合はそのように言います
    •  発表している場ですぐに理解することは難しいので、もしVBA
    をマスターしたいのならば、あとで自主的にやることをおすすめ
    します

    View full-size slide

  5. プログラミングで重要なこと
    ※個人的意見

    友情・努力・勝利
    ではなく、
    環境・実践・思考
    ただし、楽をするための努力は惜しんではいけません
    何を使うか? どれだけ書いたか?
    洗練された
    アルゴリズムか?

    View full-size slide

  6. プログラミングって何ぞ?
    •  手続きを記述すること
    •  例: 1から100までの数の和を計算し、表示しなさい
    •  プログラミングによって作られた「文章」を「プログラム」と呼ぶ
    →「手順書」である
    •  手順書を記述するのに必要な方法は様々な種類がある
    →「プログラミング言語」
    •  VBAはプログラミング言語の一つ

    View full-size slide

  7. VBAとはなにか?
    •  Visual Basic for Applications の略
    •  おそらく皆さんが一番身近に体験できるプログラミング言語
    •  開発元はみなさんおなじみMicrosoft
    •  わりと初心者にもウケがいい言語っぽい(後述)

    View full-size slide

  8. VBAが選ばれる理由
    •  すぐに始められる(はず)
    •  開発するための環境がMicrosoft Officeに必ず備わっている
    •  実務に近い部分で利用しやすい
    •  比較的簡単に実行できる
    •  コンパイル※の手間が(見かけ上)無い
    ※コンパイル:プログラム文をコンピュータが理解できる形式に書き換えること

    View full-size slide

  9. VBAでどんなことが出来る?
    •  計算
    •  “1+1”も”微分・積分”も
    •  グラフ作成
    •  ヒストグラムも3次元立体図も
    •  データセットからの処理の自動化
    •  各Office Applicationの処理を自動化出来る
    •  例: 「Wordで全角数字を全て半角数字に変換する」
    VBAはExcelだけで使われると思われがちですが、WordやPowerpointでも使えます

    View full-size slide

  10. VBAで苦手なこと・出来ないこと
    •  巨大なデータの一括処理
    •  工夫次第でなんとかなるけど、遅いしやりにくいので非推奨
    •  リアルタイムでのデータ処理
    •  Web上のデータの処理(ソケット通信)
    •  コアな統計処理・高等数学な計算
    •  R言語とかPython等を利用したほうがやりやすいです
    •  他言語のコンパイル
    •  出来ないことは無いけど、それをやってるのは変態技術者
    プログラミング言語には得意な分野と苦手な分野があるので、
    やりたいことごとに適切にプログラミング言語を選択する必要があります

    View full-size slide

  11. HELLO WORLD!
    •  “HELLO WORLD!” とは?
    •  世界一有名なプログラム
    •  プログラミング言語を学ぶ上で殆どの人が最初に作るプログラム
    •  画面上に“HELLO WORLD!”と表示するだけ
    「なんだそんなことか…(ボソッ」
    そんなことはありません!
    プログラミングを行う上で大事なことがいくつも出てきます!

    View full-size slide

  12. 早速“Hello World!”を出力してみましょう。
    sample1()
    を実行
    HELLO WORLD!
    Sub sample1()
    MsgBox(“Hello World!”)
    End Sub
    ボブ・ロス
    ね、簡単でしょ?
    (Very easy)
    \わかるわけねーだろ!!/

    View full-size slide

  13. まず、どこに記述するか?
    •  Visual Basic Editor(VBE)を利用します
    •  デフォルトのOffice ApplicationではVBEを起動出来ない
    •  まずはVBEを起動するための設定をしましょう
    •  PCを持っている方はここから一緒にやってみましょう!
    今日はExcelでの例を中心にすすめます

    View full-size slide

  14. VBEを起動する
    クリック

    View full-size slide

  15. VBEを起動する
    クリック

    View full-size slide

  16. VBEを起動する
    2: 「開発」
    にチェック
    3: クリック
    1: 「リボンのユーザー設定」をクリック

    View full-size slide

  17. VBEを起動する
    2: クリック
    1: 「開発」タブをクリック

    View full-size slide

  18. VBEでプログラムを書く
    1:「Sheet1(Sheet1)」
    をクリック
    2:先ほどの
    Hello World!プログラム
    を書き込む
    Sub sample1()
    MsgBox(“Hello World!”)
    End Sub

    View full-size slide

  19. プログラムを実行する
    クリック

    View full-size slide

  20. プログラムを実行する
    1: 先ほど作ったプログラムと
    同じ名前なのを選択
    (シート名.プログラム名)
    2:クリック
    ちゃんと実行出来ましたか?

    View full-size slide

  21. さぁここから難しくなります…
    ごめんなさい…

    View full-size slide

  22. プログラム文の構成単位
    “キーワード”と“ステートメント”と“プロシージャ”

    •  プログラム文の単語一つ一つのことを“キーワード”と呼ぶ
    •  一行一行の命令文を“ステートメント”と呼ぶ
    •  命令文を束ねた塊を“プロシージャ”と呼ぶ
    Sub Sample1()
    MsgBox(“Hello World!”)
    End Sub
    プロシージャー
    •  Sub taketake()
    •  MsgBox(“Hello World!”)
    •  End Sub
    •  MsgBox
    •  “Hello World!”
    それぞれがステートメントです
    それぞれがキーワードです
    Sub sample1()
    MsgBox(“Hello World!”)
    End Sub

    View full-size slide

  23. Sub foo1()
    ‘処理
    End Sub
    Function foo2() As
    ‘処理
    foo2 = <戻り値>
    End Function
    Private Sub object_name.event_name()
    ‘処理
    End Sub
    サブルーチンプロシージャ
    ファンクションプロシージャ
    イベントプロシージャ
    “プロシージャ”のお話
    “サブルーチン”と“ファンクション”と“イベント”

    プロシージャはたった3種類!
    とりあえずは“サブルーチンプロシージャ”だけ覚えませう
    ステートメントを実行するだけ
    ステートメントを実行し、値を返す
    利用者が何かをやらかしたら、
    ステートメント実行
    “ファンクションプロシージャ”はあとで少し解説します

    View full-size slide

  24. “HELLO WORLD!”をもっと遊ぶ
    “変数”と、“プロシージャの呼び出し”

    “Hello World!”をもっといろんな方法で表現してみましょう
    Sub sample2_1()
    sample2_2()
    End Sub
    Sub sample2_2()
    Dim variable_sample As String
    variable_sample = "Hello World!"
    MsgBox (variable_sample)
    End Sub
    この2つのプロシージャで”Hello World!”を表示します
    ね、簡単(ry
    Sample2_1()
    を実行

    View full-size slide

  25. 他のサブルーチンを呼ぶ
    •  他のサブルーチンを別のサブルーチン内で呼びたい(実行したい)
    •  呼びたいサブルーチン名を記述すればおk
    Sub sample2_1()
    sample2_2()
    End Sub
    sample2_1というサブルーチンで、
    sample2_2というサブルーチンを呼んで(Callして)いる
    ここでどのような挙動をするか?
    1.  サブルーチン(sample2_2)が呼ばれる
    2.  呼ばれたサブルーチン(sample2_2)が実行が始まる
    3.  呼ばれたサブルーチン(sample2_2)の実行が終わる
    4.  呼んだサブルーチン(sample2_1)に戻ってくる
    ※呼ばれたサブルーチンの実行が終了するまで呼んだサブルーチンが実行を待つことを、
    スタックすると表現したりします(ホントはデータ構造の用語ですが)

    View full-size slide

  26. 変数の宣言
    “DIMステートメント”

    •  数学でこんな記述ありますよね?
    •  この時のyやxのことを“変数”といいます
    •  このxには自由な値を入れることができ、yはx+1の計算結果を    
    代入していますね
    •  プログラミングでもこれと同じように変数を使うことができます
    •  変数を使いたい場合はまず、「こんな名前で、こんなデータを      
    あつかう変数を使うよ」とあらかじめ宣言する必要があります
    y = x + 1
    Dim variable_sample As String
    1.  “Dimステートメント”でこれから変数を宣言するぞと宣言します
    2.  宣言する変数の名前を“variable_sample”と宣言します
    3.  “variable_sample”のデータ型は“String”(文字列型)と宣言します

    View full-size slide

  27. 変数の代入
    •  宣言した変数にはデータを格納することができます
    •  これを“代入”といいます
    •  ここではvariable_sampleを宣言したあと、variable_sample
    に“Hello World!”という文字列を格納しています
    •  変数を使えば次のようなことに用いることができます
    Dim variable_sample As String
    variable_sample = "Hello World!”
    MsgBox (variable_sample) MsgBox ("Hello World!”)
    ←全く同じ→

    View full-size slide

  28. 変数のデータ型
    •  変数を宣言するときに“データ型”というのがありましたね〜
    •  変数を宣言した時のデータ型はその変数に格納できるデータの 
    種類を限定するようになります(例外あり)
    •  例えば、次のようなプログラムを実行してみましょう
    •  Byte型は、0から255までの整数をあつかうことが出来る
    •  “Hello World!”は文字列(String型)なので、Byte型ではない
    Sub sample2_3()
    Dim byte_sample As Byte
    byte_sample = "Hello World!"
    MsgBox (byte_sample)
    End Sub
    Sample2_3()
    を実行

    View full-size slide

  29. ちょっとマニアックに…
    なぜデータ型はデータを限定するのか?
    •  VBAで変数を宣言する時、裏で何をやっているか?
    •  宣言した時のデータ型に応じて、データを保持するための連続した
    空間を宣言時にメモリの中で確保します
    •  Byte型だったら、1B = 8bit 分だけ確保します
    •  連続した8つの箱をイメージして下さい
    •  この箱には0と1しか格納できません
    •  この変数に147を代入すると、メモリの中身は…
    •  しっかりいれることができますね
    •  256を代入してみましょう
    •  桁が一個溢れたこの状態を“オーバーフロー”といいます
    1 0 0 1 0 0 1 1 ←2進数の147
    0 0 0 0 0 0 0 0
    1 ←2進数の256

    View full-size slide

  30. ちょっとマニアックに…
    なぜデータ型はデータを限定するのか?
    •  ためしにわざとオーバーフローさせてみましょう
    Sub sample2_4()
    Dim byte_sample As Byte
    byte_sample = 256
    MsgBox (byte_sample)
    End Sub
    sample2_4()
    を実行

    View full-size slide

  31. ちょっとマニアックに…
    なぜデータ型はデータを限定するのか?
    •  Byte型のデータにString型のデータを入れるとどうなる?
    •  Byte型のデータの型(表現)とString型のデータの型は違うから、  
    正しくデータを書き込み・読み出し出来ない
    •  String型は10B(80bit) + 文字列の長さ のメモリ空間が必要
    •  Byte型で確保した1B(8bit)のメモリ空間では溢れてしまう
    •  何故データを限定する必要があるのか?
    •  プログラミング言語がデータをあつかう時、メモリ上にデータが無いと
    扱えないから(HDDにデータがあっても一旦メモリにコピーします)
    •  メモリは一次元にデータを“並べているだけ”なので、データの範囲を
    決めてあげないと、他のデータを書き換えてしまう危険性がある
    •  これを利用した攻撃: バッファオーバーフロー攻撃
    •  楽な方法ない?
    •  Variant型ならなんでも食えますが、バグの温床になりやすいです
    •  あとVariant型は処理の速度が遅くなります

    View full-size slide

  32. まだ続きます

    View full-size slide

  33. “HELLO WORLD!”をもっと遊ぶ
    “プロシージャー”と“引数”

    •  次はファンクションプロシージャを用いてHello World!しましょう
    Sub sample3_1()
    Dim function_return As String
    function_return = sample3_2("Hello World!")
    MsgBox (function_return)
    End Sub
    Function sample3_2(input_text As String) As String
    Dim receive_text As String
    receive_text = input_text
    sample3_2 = receive_text
    End Function
    (ry
    sample3_1()
    を実行

    View full-size slide

  34. ファンクションプロシージャとは
    •  実行すると呼び出し元に値を渡すことが出来るプロシージャです
    •  いわゆる“関数”というもの
    •  “関数名(引数)”で呼ぶことができます
    •  サブルーチンと感じは一緒です
    •  ファンクションの戻り値を保持するためには変数に代入します
    •  代入しなくても関数の中に関数を入れても使えます
    •  VBAではファンクションを直接実行することはできません
    •  ユーザーがVBAコードを実行する際、必ずサブルーチンが最初に 
    走ります
    Dim return_sin As String
    return_sin = Sin(1) Sin関数は正弦値を計算して返す
    Sub sample3_3()
    MsgBox (Sin(1))
    End Sub
    sample3_3()
    を実行

    View full-size slide

  35. ファンクションプロシージャとは
    •  あまり説明してきませんでしたが、ファンクションはこの勉強会の 
    最初から使いまくってます
    •  MsgBoxと言うのはダイアログボックスを表示し、ユーザーが   
    押したボタンの内容を戻します
    Sub sample1()
    MsgBox(“Hello World!”)
    End Sub
    Sub sample3_4()
    Dim dialog_result As String
    dialog_result = MsgBox("Hello World!", vbOKCancel)
    MsgBox (dialog_result)
    End Sub
    ←ここです
    sample3_4()
    を実行

    View full-size slide

  36. •  自分でファンクションを作る(宣言する)には次のように書きます
    •  試しに、足し算するファンクションを見てみましょう
    ファンクションプロシージャとは
    Function add_up(variable1 As Integer, variable2 As Integer) As Integer
    Dim return_variable As Integer
    return_variable = variable1 + variable2
    add_up = return_variable
    End Function
    外部からデータを受ける変数の定義(引数) 戻り値のデータ型
    ファンクション名
    戻り値を指定するにはファンクション名に代入
    引数名 データ型

    View full-size slide

  37. “HELLO WORLD!”を連呼する
    繰り返し文

    •  “Hello World!”を5回、回数を含めて表示したいとします
    •  表示例:「Hello World! 1回目」、「Hello World! 2回目」…
    Sub sample4()
    Dim show_text As String
    Dim i As Integer
    For i = 1 To 5
    show_text = "Hello world! " & i & "回目"
    MsgBox (show_text)
    Next i
    End Sub
    sample4()
    を実行

    View full-size slide

  38. “HELLO WORLD!”を連呼する
    繰り返し文

    •  同じようなことを何度も繰り返したい場合は“繰り返し文”を使います
    •  For – Next ステートメント
    •  For Each – Next ステートメント
    •  While – Wend ステートメント
    •  Do While – Loop ステートメント
    •  Do Until – Loop ステートメント
    •  Do Loop – While ステートメント
    •  Do Loop – Until ステートメント
    •  例で用いた For – Nextステートメントを詳しく見てみましょう

    View full-size slide

  39. “HELLO WORLD!”を連呼する
    繰り返し文

    Sub sample4()
    Dim show_text As String
    Dim i As Integer
    For i = 1 To 5
    show_text = "Hello world! " & i & "回目"
    MsgBox (show_text)
    Next i
    End Sub
    繰り返す変数を指定する 1から5までの整数をiに繰り返すたび増加しながら代入する
    “&”で文字列として結合する
    “For i = …”まで戻る

    View full-size slide

  40. すいません、時間的制約で
    細かいことは説明できないので
    •  ご興味のある方は、本とかWebサイトとか見ればいろいろ見れます
    スパッとやりたいことを調べるには
    Excel VBA ハンドブック
    田中敦基 著
    基礎からしっかりと学びたいなら
    OfficePro : Excel VBA入門
    他にもいろんな本やブログで色々なノウハウを見ることができるので
    積極的にググりましょう

    View full-size slide

  41. ご質問ありますか?


    View full-size slide

  42. お疲れ様でした!

    View full-size slide