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. 今日の基本方針 •  ぼく •  いわゆる「おまじない」という表現はつかわない •  なので途中で終わっちゃいます •  面白くやる • 

    みなさん •  わかんないことがあれば適宜質問をお願いします •  後述の場合はそのように言います •  発表している場ですぐに理解することは難しいので、もしVBA をマスターしたいのならば、あとで自主的にやることをおすすめ します
  2. VBAとはなにか? •  Visual Basic for Applications の略 •  おそらく皆さんが一番身近に体験できるプログラミング言語 • 

    開発元はみなさんおなじみMicrosoft •  わりと初心者にもウケがいい言語っぽい(後述)
  3. VBAが選ばれる理由 •  すぐに始められる(はず) •  開発するための環境がMicrosoft Officeに必ず備わっている •  実務に近い部分で利用しやすい •  比較的簡単に実行できる

    •  コンパイル※の手間が(見かけ上)無い ※コンパイル:プログラム文をコンピュータが理解できる形式に書き換えること
  4. VBAでどんなことが出来る? •  計算 •  “1+1”も”微分・積分”も •  グラフ作成 •  ヒストグラムも3次元立体図も • 

    データセットからの処理の自動化 •  各Office Applicationの処理を自動化出来る •  例: 「Wordで全角数字を全て半角数字に変換する」 VBAはExcelだけで使われると思われがちですが、WordやPowerpointでも使えます
  5. VBAで苦手なこと・出来ないこと •  巨大なデータの一括処理 •  工夫次第でなんとかなるけど、遅いしやりにくいので非推奨 •  リアルタイムでのデータ処理 •  Web上のデータの処理(ソケット通信) • 

    コアな統計処理・高等数学な計算 •  R言語とかPython等を利用したほうがやりやすいです •  他言語のコンパイル •  出来ないことは無いけど、それをやってるのは変態技術者 プログラミング言語には得意な分野と苦手な分野があるので、 やりたいことごとに適切にプログラミング言語を選択する必要があります
  6. HELLO WORLD! •  “HELLO WORLD!” とは? •  世界一有名なプログラム •  プログラミング言語を学ぶ上で殆どの人が最初に作るプログラム

    •  画面上に“HELLO WORLD!”と表示するだけ 「なんだそんなことか…(ボソッ」 そんなことはありません! プログラミングを行う上で大事なことがいくつも出てきます!
  7. 早速“Hello World!”を出力してみましょう。 sample1() を実行 HELLO WORLD! Sub sample1() MsgBox(“Hello World!”)

    End Sub ボブ・ロス ね、簡単でしょ? (Very easy) \わかるわけねーだろ!!/
  8. プログラム文の構成単位 “キーワード”と“ステートメント”と“プロシージャ” •  プログラム文の単語一つ一つのことを“キーワード”と呼ぶ •  一行一行の命令文を“ステートメント”と呼ぶ •  命令文を束ねた塊を“プロシージャ”と呼ぶ Sub Sample1()

    MsgBox(“Hello World!”) End Sub プロシージャー •  Sub taketake() •  MsgBox(“Hello World!”) •  End Sub •  MsgBox •  “Hello World!” それぞれがステートメントです それぞれがキーワードです Sub sample1() MsgBox(“Hello World!”) End Sub
  9. Sub foo1() ‘処理 End Sub Function foo2() As <data_type> ‘処理

    foo2 = <戻り値> End Function Private Sub object_name.event_name() ‘処理 End Sub サブルーチンプロシージャ ファンクションプロシージャ イベントプロシージャ “プロシージャ”のお話 “サブルーチン”と“ファンクション”と“イベント” プロシージャはたった3種類! とりあえずは“サブルーチンプロシージャ”だけ覚えませう ステートメントを実行するだけ ステートメントを実行し、値を返す 利用者が何かをやらかしたら、 ステートメント実行 “ファンクションプロシージャ”はあとで少し解説します
  10. “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() を実行
  11. 他のサブルーチンを呼ぶ •  他のサブルーチンを別のサブルーチン内で呼びたい(実行したい) •  呼びたいサブルーチン名を記述すればお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)に戻ってくる ※呼ばれたサブルーチンの実行が終了するまで呼んだサブルーチンが実行を待つことを、 スタックすると表現したりします(ホントはデータ構造の用語ですが)
  12. 変数の宣言 “DIMステートメント” •  数学でこんな記述ありますよね? •  この時のyやxのことを“変数”といいます •  このxには自由な値を入れることができ、yはx+1の計算結果を     代入していますね • 

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

    変数を使えば次のようなことに用いることができます Dim variable_sample As String variable_sample = "Hello World!” MsgBox (variable_sample) MsgBox ("Hello World!”) ←全く同じ→
  14. ちょっとマニアックに… なぜデータ型はデータを限定するのか? •  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
  15. ちょっとマニアックに… なぜデータ型はデータを限定するのか? •  Byte型のデータにString型のデータを入れるとどうなる? •  Byte型のデータの型(表現)とString型のデータの型は違うから、   正しくデータを書き込み・読み出し出来ない •  String型は10B(80bit) +

    文字列の長さ のメモリ空間が必要 •  Byte型で確保した1B(8bit)のメモリ空間では溢れてしまう •  何故データを限定する必要があるのか? •  プログラミング言語がデータをあつかう時、メモリ上にデータが無いと 扱えないから(HDDにデータがあっても一旦メモリにコピーします) •  メモリは一次元にデータを“並べているだけ”なので、データの範囲を 決めてあげないと、他のデータを書き換えてしまう危険性がある •  これを利用した攻撃: バッファオーバーフロー攻撃 •  楽な方法ない? •  Variant型ならなんでも食えますが、バグの温床になりやすいです •  あとVariant型は処理の速度が遅くなります
  16. “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() を実行
  17. ファンクションプロシージャとは •  実行すると呼び出し元に値を渡すことが出来るプロシージャです •  いわゆる“関数”というもの •  “関数名(引数)”で呼ぶことができます •  サブルーチンと感じは一緒です • 

    ファンクションの戻り値を保持するためには変数に代入します •  代入しなくても関数の中に関数を入れても使えます •  VBAではファンクションを直接実行することはできません •  ユーザーがVBAコードを実行する際、必ずサブルーチンが最初に  走ります Dim return_sin As String return_sin = Sin(1) Sin関数は正弦値を計算して返す Sub sample3_3() MsgBox (Sin(1)) End Sub sample3_3() を実行
  18. •  自分でファンクションを作る(宣言する)には次のように書きます •  試しに、足し算するファンクションを見てみましょう ファンクションプロシージャとは 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 外部からデータを受ける変数の定義(引数) 戻り値のデータ型 ファンクション名 戻り値を指定するにはファンクション名に代入 引数名 データ型
  19. “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() を実行 …
  20. “HELLO WORLD!”を連呼する 繰り返し文 •  同じようなことを何度も繰り返したい場合は“繰り返し文”を使います •  For – Next ステートメント

    •  For Each – Next ステートメント •  While – Wend ステートメント •  Do While – Loop ステートメント •  Do Until – Loop ステートメント •  Do Loop – While ステートメント •  Do Loop – Until ステートメント •  例で用いた For – Nextステートメントを詳しく見てみましょう
  21. “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 = …”まで戻る
  22. すいません、時間的制約で 細かいことは説明できないので •  ご興味のある方は、本とかWebサイトとか見ればいろいろ見れます スパッとやりたいことを調べるには Excel VBA ハンドブック 田中敦基 著

    基礎からしっかりと学びたいなら OfficePro : Excel VBA入門 他にもいろんな本やブログで色々なノウハウを見ることができるので 積極的にググりましょう