Slide 1

Slide 1 text

MS OFFICEの 便利な使い方 VBAで始めるプログラミングのススメ TAKERU ICHII Welcome to Programming World!

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

プログラミングで重要なこと ※個人的意見 友情・努力・勝利 ではなく、 環境・実践・思考 ただし、楽をするための努力は惜しんではいけません 何を使うか? どれだけ書いたか? 洗練された アルゴリズムか?

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

VBEを起動する クリック

Slide 15

Slide 15 text

VBEを起動する クリック

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Sub foo1() ‘処理 End Sub Function foo2() As ‘処理 foo2 = <戻り値> End Function Private Sub object_name.event_name() ‘処理 End Sub サブルーチンプロシージャ ファンクションプロシージャ イベントプロシージャ “プロシージャ”のお話 “サブルーチン”と“ファンクション”と“イベント” プロシージャはたった3種類! とりあえずは“サブルーチンプロシージャ”だけ覚えませう ステートメントを実行するだけ ステートメントを実行し、値を返す 利用者が何かをやらかしたら、 ステートメント実行 “ファンクションプロシージャ”はあとで少し解説します

Slide 24

Slide 24 text

“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() を実行

Slide 25

Slide 25 text

他のサブルーチンを呼ぶ •  他のサブルーチンを別のサブルーチン内で呼びたい(実行したい) •  呼びたいサブルーチン名を記述すればお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)に戻ってくる ※呼ばれたサブルーチンの実行が終了するまで呼んだサブルーチンが実行を待つことを、 スタックすると表現したりします(ホントはデータ構造の用語ですが)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

変数のデータ型 •  変数を宣言するときに“データ型”というのがありましたね〜 •  変数を宣言した時のデータ型はその変数に格納できるデータの  種類を限定するようになります(例外あり) •  例えば、次のようなプログラムを実行してみましょう •  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() を実行

Slide 29

Slide 29 text

ちょっとマニアックに… なぜデータ型はデータを限定するのか? •  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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

まだ続きます

Slide 33

Slide 33 text

“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() を実行

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

ファンクションプロシージャとは •  あまり説明してきませんでしたが、ファンクションはこの勉強会の  最初から使いまくってます •  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() を実行

Slide 36

Slide 36 text

•  自分でファンクションを作る(宣言する)には次のように書きます •  試しに、足し算するファンクションを見てみましょう ファンクションプロシージャとは 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 外部からデータを受ける変数の定義(引数) 戻り値のデータ型 ファンクション名 戻り値を指定するにはファンクション名に代入 引数名 データ型

Slide 37

Slide 37 text

“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() を実行 …

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

“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 = …”まで戻る

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

ご質問ありますか? 質 問

Slide 42

Slide 42 text

お疲れ様でした!