資 料 心 理 学 における Excel VBA の 利 用 その1 VBA の 基 本 文 法 久 本 博 行 Applications of Excel VBA for the Psychology (1) VBA Programming Hiroyuki HISAMOTO Abstract An experimental systems in psychology using Excel VBA(Visual Basic Applications) is proposed, and the basic grammar of VBA is introduced. Key words: Excel VBA, Psychological Experiments, Programming 抄 録 Excel VBA(Visual Basic Applications)によって, 心 理 学 のコンピュータ 実 験 システムを 作 成 する ことが 提 案 され,その1として VBA の 基 本 文 法 が 紹 介 された キーワード:Excel VBA, 心 理 学 実 験,プログラミング 1
はじめに 現 在 心 理 学 の 実 験 にはコンピュータが 使 われることが 多 くなってきている これは,コンピュータ による 刺 激 提 示 や 提 示 時 間 の 制 御, 反 応 時 間 の 測 定 などが 容 易 なためである また,コンピュータ 上 で 実 験 が 行 われ,データが 収 集 されるとそのデータをすぐに 分 析 することができる,という 利 点 も ある コンピュータによる 心 理 学 実 験 システムとしては,Cedrus 社 の Super Lab が 有 名 であり 多 くの 実 験 で 用 いられている しかし,Super Lab は 高 価 で,システムは 柔 軟 性 に 富 むものであるがそれゆえ に 設 定 が 複 雑 である また,コンピュータによる 心 理 学 実 験 についての 著 作 は 数 多 く 発 表 されてい る( 田 中 1975, 吉 村 山 上 1983, 市 川 矢 部 1985, 野 沢 1986, 金 子 ら 1990,Dixon,M.R. & MacLin,O.H. 2003, 北 村 坂 本 2004, 水 野 りか 2004)が,この 中 で 1970 年 代 から 90 年 代 に 発 表 されたものは BASIC で 作 られたものがほとんどで,Windows に 対 応 していない Dixon & MacLin の ものは Visual Basic.Net が 必 要 であること, 北 村 坂 本 のものは Visual Basic6.0,HSP,Delphi とい った 各 種 のプログラミング 言 語 を 使 っているため 初 心 者 には 難 しく,さらに Visual Basic6.0 や Delphi の 開 発 環 境 が 必 要 である 水 野 は Web ブラウザ 上 で 動 く 心 理 学 実 験 システムを JAVA と Perl で 作 成 しているが,これは 開 発 環 境 はフリーで 入 手 しやすいのであるが,JAVA や Perl を 学 習 するのが 難 しいという 難 点 がある もちろん, 北 村 坂 本 や 水 野 らのプログラムをそのまま 利 用 するうえでは 問 題 はないのであるが, 同 様 なプログラムを 開 発 しようとすると 上 記 のような 障 害 がある したがって, 開 発 環 境 が 手 軽 に 手 に 入 り,プログラミングが 容 易 な 言 語 で 実 験 のシステムを 構 築 することが 多 くの 実 験 者 にとって 有 益 であると 考 えられる そこでフリーウェアではないが, 多 くの Windows システムにバンドルされており,プログラミングも 比 較 的 容 易 な Microsoft 社 の Excel の VBA(Visual Basic for Applications)を 使 い,いくつかの 心 理 学 実 験 用 ソフトやデータ 分 析 用 ソフトを 作 成 した これらは, 心 理 学 実 験 を 行 おうとするものが,そのままでも 使 えるが,さらに 自 分 の 実 験 向 きにプログラムを 改 良 したり,サンプルプログラムとして 利 用 できるようなものを 目 指 した 今 回 は その 1 として 自 分 で VBA のプログラミングが 可 能 になるように,VBA の 基 本 文 法 を 紹 介 する また, 今 後 は 錯 視, Stroop 効 果 などの 実 験 ソフトウェアや SD 法, 一 対 比 較 法 などの 刺 激 提 示 とデータ 収 集 用 ソフトウェア, 因 子 分 析 などのデータ 解 析 ソフトウェアを 順 次 発 表 していき たい なおこれを 読 むにあたり,Excel の 基 本 操 作 を 理 解 していることを 前 提 としている 2
1.Excel VBA の 操 作 1.1VBA とは VBA とは,Visual Basic for Applications の 略 で Microsoft 社 の Word,Excel,Access,Power Point といった Office 製 品 で 使 われるプログラミング 言 語 です VBA を 利 用 すると Office を 使 ったア プリケーション ソフトを 開 発 することができます ここでは,Excel のアプリケーションを 開 発 していき ますが,この 知 識 は 他 の Office 製 品 のアプリケーションを 作 る 時 にも 役 立 ちます 1.2マクロのセキュリティ Excel でマクロを 利 用 する 場 合 には,はじめにマクロのセキュリティ 設 定 をしなければなりませ ん マクロのセキュリティレベルを 変 えるには,[ツール]メニューをクリックし, 次 に[マクロ]をポイント し[セキュリティ] をクリックします 図 1.2.1 そうすると, 次 の 図 のようなセキュリティ 設 定 のダイアログボックスが 出 てきます 通 常,デフォ ルト( 既 定 値 )ではセキュリティレベルは 高 (H) に 設 定 されており, 自 分 で 作 成 したマクロを 実 行 す ることができません そこで,セキュリティレベルを 中 (M) にします そして, OK ボタンをクリックし ます この 状 態 ではまだセキュリティレベルは 変 わっていませんので,いったん Excel を 終 了 し,もう 3
一 度 Excel を 起 動 しなおします これで,セキュリティレベルの 変 更 が 完 了 しました 図 1.2.2 次 にマクロを 含 む Excel のファイルを 開 こうとすると, 下 図 のようなセキュリティ 警 告 が 出 ます そ のときは, 自 分 が 作 ったような 信 頼 できるマクロであれば マクロを 有 効 にする(E) をクリックしファイ ルを 開 きます 図 1.2.3 4
1.3Visual Basic Editor の 起 動 マクロを 作 成 するには,まずマクロを 作 成 するツール Visual Basic Editor( 以 下 VBE と 略 )を 起 動 します [ツール]メニューをクリックし,[マクロ] [Visual Basic Editor]の 順 でクリックします (Alt キーを 押 しながら,F11 を 押 しても VBE を 起 動 できます ) マクロを 作 る 他 のやり 方 として,Excel では マクロ 記 録 という 方 法 があります これは,マクロ に 行 わせたい 操 作 を 実 際 に 行 い,その 一 連 の 操 作 手 順 を 記 録 し,マクロとして 利 用 するものです これは 簡 単 にマクロが 作 成 できますが, 使 える 機 能 が 限 られているのでここでは 取 り 上 げません 図 1.3.1 5
1.4やさしい 入 門 では, 実 際 にプログラムを 書 いてみましょう 図 1.4.1 のような 形 のフォームを 作 り, はじめての プログラム というボタンをクリックすると, Hello World! と 表 示 されるようにします 1.4.1ユーザーフォームの 作 成 図 1.4.1 挿 入 ボタンから ユーザーフォーム を 選 び( 図 1.4.2),ユーザーフォームを 作 ります この 操 作 は 挿 入 メニューから ユーザーフォーム を 選 んでもできます 図 1.4.2 ここで 少 し,Visual Basic Editor の 画 面 ( 図 1.4.3)の 説 明 をしておきましょう プロジェクトエクスプロ ーラは,そのブックに 含 まれるオブジェクトやモジュールの 階 層 構 造 を 表 したものです プロパティウィンドウは, 選 択 されているオブジェクトのプロパティを 見 たり, 編 集 したりするためのも のです フォームウィンドウは,フォームを 編 集 するためのもので,ツールボックスはフォームに 貼 り 6
付 けるいろいろなコントロールを 用 意 しているものです ツールボックスが 非 表 示 の 場 合 は, 標 準 ツールバーのツールボ ックスボタンを 押 すと 表 示 されます 作 業 ウィンドウはヘ ルプを 表 示 します プロジェクト エクスプローラ フォームウィンドウ 作 業 ウィンドウ プロパティ ウィンドウ ツールボックス 図 1.4.3 Hello World! と 表 示 が 出 ている 部 分 は,テキストボックスと 呼 ばれるものです このテキストボッ クスをフォームに 貼 り 付 けます ツールボックスのテキストボックスをクリックし( 図 1.4.4),フォーム 上 で 適 当 な 大 きさになるようにドラッグします ( 図 1.4.5) 図 1.4.4 7
ドラッグ 図 1.4.5 次 に, 初 めてのプログラム というボタンを 作 ります このボタンのことをコマンドボタンといいます が,これをテキストボックスの 同 じ 要 領 で 貼 り 付 けます ツールボックスのコマンドボタンをクリックし ( 図 1.4.6),フォーム 上 で 適 当 な 大 きさになるようにドラッグします ( 図 1.4.7) 図 1.4.6 ドラッグ 図 1.4.7 8
次 に,フォームのタイトルバーに 表 示 されている 名 前 が UserForm1 となっていますので,これを やさしい 入 門 に,コマンドボタンには CommandButton1 と 表 示 されていますので,これを 初 め てのプログラム に 変 更 します まず,フォーム 上 でテキストボックスやコマンドボタンのないところならどこでも 構 いませんからクリ ックし,フォームを 選 択 状 態 にします そして 画 面 左 下 のプロパティ ウィンドウの Caption 欄 を や さしい 入 門 に 書 き 換 えます( 図 1.4.8) これでユーザーフォームのタイトルバーの 表 示 が UserForm1 から やさしい 入 門 に 変 わりました コマンドボタンについても 同 様 です コマンドボ タンを 一 度 クリックし, 選 択 状 態 にするとコマンドボタンのプロパティがプロパティ ウィンドウに 表 示 されますので, Caption 欄 を はじめてのプログラム に 書 き 換 えます( 図 1.4.9) プロパティでは, この 他 に 文 字 の 色,サイズ,そのオブジェクトの 幅, 高 さ, 背 景 色 などの 属 性 が 定 義 されています プロパティはこのようにいろいろな 属 性 を 定 義 しているもので,あるオブジェクトを 選 択 状 態 にすると, プロパティ ウィンドウにそのプロパティが 表 示 されるような 仕 組 みになっています なお,プロパティ を 変 更 するのは, 今 のようにプロパティ ウィンドウでもできますし,プログラムからもできます 図 1.4.8 図 1.4.9 9
1.4.2 プログラムの 作 成 で は, 次 に コ マ ン ド ボ タ ン を 押 す と Hello World! と 表 示 されるようにプログ ラムを 作 ってみます 先 ほど 作 った はじめてのプログラム と いうコマンドボタンをダブルクリックします ( 図 1.4.10) そうすると, 図 1.4.11 にある ようなコードウィンドウが 表 示 されます こ のコードウィンドウでコマンドボタンが 押 さ れたときの 動 作 を 記 述 します 図 1.4.10 Private Sub CommandButton1_Click( ) 図 1.4.11 と End Sub の 2 行 の 間 に TextBox1.Text = "Hello World!" と 入 力 します これで 出 来 上 がりです 10
図 1.4.12 プログラムの 詳 しい 説 明 の 前 に,このプログラムを 動 かしてみましょう ツールバーにある Sub/ユ ーザーフォームの 実 行 ボタンをクリックしてください( 図 1.4.13) そして, はじめてのプログラム のボタンをクリックしましょう Hello World! と 表 示 されましたか( 図 1.4.14) 図 1.4.13 図 1.4.15 図 1.4.14 もし,うまく 表 示 されなかったり,エラーが 表 示 された 場 合 は, 左 記 のプログラムとよく 見 比 べてく ださい 正 しく 実 行 できれば,リセットボタン( 図 1.4.15)を 押 して 停 止 します では,プログラムについて 説 明 しておきましょう プログラムの 1 行 目 は,このプログラムが CommandButton1 をクリックされたときの 動 作 を 定 義 しているプログラムであることを 示 しています 2 行 目 が 実 際 にテキストボックスに Hello World! を 表 示 している 部 分 です TextBox1.Text は TextBox1 というオブジェクトのなかの Text プロパティを 示 しており,=は 代 入 の 記 号 で,Text プロパ ティに""で 囲 まれた 文 字 列 の Hello World! を 代 入 しなさい,ということになります 文 字 列 を 指 定 11
するときには,""で 囲 むことになっており,""で 囲 まれた 文 字 列 はプログラムではなく,データとして 取 り 扱 われます 3 行 目 はこのプログラムの 終 わりを 示 す 部 分 です 1 基 本 文 法 ここでは,Excel Visual Basic for Applications(VBA と 略 )の 基 本 的 な 文 法 を 説 明 します VBA や Visual Basic の 文 法 をすでにご 存 知 の 方 は,この 章 をとばしていただいて 構 いません なお, 文 法 の 説 明 の 中 で [ ] で 囲 まれた 部 分 は, 省 力 可 能 であることを 示 しています 2.1 変 数 変 数 とはプログラム 中 で a,b などのように 名 前 がつけられた, 数 値 や 文 字 列 を 収 納 しておく 記 憶 領 域 です 変 数 の 名 前 のつけ 方 には 規 則 があります 名 前 の 先 頭 は 数 字 以 外 の 文 字 ( 英 字, 漢 字,ひらがな,カタカナ)で 始 めます 名 前 には 空 白 や&,#などの 記 号 (_アンダースコアを 除 く)を 使 うことはできません 名 前 は 255 文 字 ( 半 角 の 場 合 ) 以 内 でなければなりません Visual Basic の 関 数,ステートメント,およびメソッドと 同 じ 名 前 を 使 うことはできません 正 しい 変 数 名 の 例 a heikin 利 息 悪 い 変 数 名 の 例 1gakki 数 字 で 始 まっている abc@def @が 使 われている right Visual Basic に 同 じ 関 数 名 がある 12
2.2 データ 型 VBA で 取 り 扱 う 変 数 には, 表 2.2 のようなデータ 型 があります 通 常, 取 り 扱 うデータが 整 数 の 場 合 は,Integer 型 か Long 型 を, 実 数 型 の 場 合 は Single 型 か Double 型 を 使 います 金 銭 の 計 算 を 行 う 場 合 は,Currency 型 を 使 います 用 途 に 合 わせることと,その 変 数 型 で 表 現 できる 範 囲 を 考 え 合 わせてデータ 型 を 選 択 します データ 型 サイズ 説 明 表 2.2 データ 型 Byte(バイト 型 ) 1 バイト 0~255 の 整 数 Boolean ( ブ ー ル 型 ) 2 バイト True あるいは False のみです 数 値 をブール 型 に 変 換 す ると 0 は False で 0 以 外 の 値 は True となります また,ブ ール 型 の 変 数 を 数 値 に 変 換 すると True は-1,False は 0 となります Integer( 整 数 型 ) 2 バイト -32,768~32,767 Long( 長 整 数 型 ) 4 バイト -2,147,483,648~2,147,483,647 Single( 短 精 度 浮 動 小 数 点 数 型 ) Double ( 倍 精 度 浮 動 小 数 点 数 型 ) 4 バイト -3.402823E38~-1.401298E-45( 負 の 値 ) 1.401298E-45~3.402823E38( 正 の 値 ) 8 バイト -1.29769313486231E308~ -4.94065645841247E-324( 負 の 値 ) String( 文 字 列 型 ) 10 バイト+ 文 字 列 の 長 さ 4.94065645841247E-324~ 0~2GB 1.29769313486231E308( 正 の 値 ) Currency( 通 貨 型 ) 8 バイト -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 Decimal(10 進 型 ) 14 バイト 小 数 部 分 を 持 たない 数 値 の 場 合, -79,228,162,514,264,337,593,543,950,335 ~ 79,228,162,514,264,337,593,543,950,335 小 数 点 以 下 28 桁 の 数 値 の 場 合, -7.9228162514264337593543950335 ~ 13
7.9228162514264337593543950335 Date( 日 付 型 ) 8 バイト 西 暦 100 年 1 月 1 日 ~ 西 暦 9999 年 12 月 31 日 の 範 囲 の 日 付 と,0:00:00 ~ 23:59:59 の 範 囲 の 時 刻 Object(オブジェク 4 バイト オブジェクトを 参 照 するためのアドレスです ト 型 ) Variant(バリアント 型 ) 数 値 の 場 合 は, 倍 精 度 浮 動 小 数 点 数 型 と 同 じで, 文 字 列 の 場 合 は, 文 字 列 型 と 同 じです 2.1.2 変 数 の 宣 言 変 数 は 使 う 前 に 必 ず 宣 言 してから 使 うようにしましょう VBA では 変 数 は 宣 言 しなくても 使 えます が, 宣 言 してから 使 うようにした 方 が, 間 違 いを 発 見 しやすくなります 変 数 の 宣 言 には,Dim 文 を 使 います Dim の 構 文 は 以 下 の 通 りです Dim 変 数 名 [As データ 型 ] []で 囲 まれた 部 分 は 省 略 可 能 です 例 悪 い 例 変 数 を 使 う 場 合 に 必 ず 宣 言 を 必 要 とするように 強 制 するには,モジュールの 先 頭 で 次 のように 記 述 します Option Explicit この 宣 言 をしておくと, 宣 言 をせずに 変 数 を 使 うとエラーメッセージが 表 示 されます( 図 2.1.1) 例 え ば,タイプミスで 変 数 の 綴 りを 間 違 えた 場 合 でも,Option Explicit の 宣 言 をしておくと,タイプミスした 変 数 は 宣 言 されていないのでエラーになり,すぐに 見 つけることができます 14
図 2.1.1 2.4 定 数 一 般 的 には,プログラム 上 に 直 接 記 述 された 数 値 や 文 字 列 のことを 定 数 と 呼 びますが,ここでは ユーザーが 定 数 を 定 義 する 方 法 について 説 明 します ユーザーが 定 数 を 宣 言 する 場 合 は,Const キーワードを 使 います [Public/Private] Const 定 数 名 [As データ 型 ] = 値 例 VBA で 既 に 定 義 されている 定 数 もあります 非 常 に 数 多 くの 定 数 が 定 義 されていますので, 詳 し くは Help を 見 てください 例 なお, 比 較 的 よく 使 われる 円 周 率 については,PI()というワークシート 関 数 を 呼 び 出 すことで 3.14159265358979 という 値 を 得 ることができます 15
2.5 演 算 子 VBA で 使 われる 演 算 子 には, 以 下 のようなものがあります 表 2.5.1 演 算 子 の 一 覧 表 演 算 子 機 能 使 用 例 算 術 演 算 子 a=10,b=4 とすると + 2 つの 数 値 の 和 を 求 める a + b 14-2 つの 数 値 の 差 を 求 める a b 6 * 2 つの 数 値 の 積 を 求 める a * b 40 / 2 つの 数 値 の 商 を 求 める a / b 2.5 \ 2 つの 数 値 の 商 の 整 数 部 を 求 める a \ b 2 Mod 2 つの 数 値 の 割 り 算 の 余 りを 求 める a Mod b 2 ^ べき 乗 を 求 める a ^ b (a を b 乗 する) 10000 文 字 列 連 結 演 算 子 a="good ",b="morning"とすると & 2 つの 文 字 列 を 連 結 する a & b "Good Morning" + a + b "Good Morning" 比 較 演 算 子 a=5 b=8 とすると = 等 しい a = b False <> 等 しくない a <> b True < より 小 さい a < b True > より 大 きい a > b False <= 以 下 a <= b True >= 以 上 a >= b False Like 文 字 列 の 比 較 を 行 う a="good",b="g*" の 場 合 (*はメタ 文 字 ) a Like b は True Is オブジェクト 変 数 の 比 較 を 行 う Dim aobject,bobject Set bobject=aobject の 場 合 a Is b True 論 理 演 算 子 a=2,b=3,c=4,d=5 とすると Not 論 理 否 定 Not a = b True And 論 理 積 a <= b And c <> d True 16
Or 論 理 和 a = b Or c = d False Xor 排 他 的 論 理 和 a <= b Xor c <= d False Eqv 論 理 等 価 演 算 a <= b Eqv c <= d True Imp 論 理 包 含 演 算 a <= b Imp c >= d False 2.7 配 列 2.7.1 1 次 元 配 列 配 列 は,たくさんの 変 数 を 1 つの 変 数 名 で 利 用 できるようにしたもの,と 考 えることができます 線 形 代 数 のベクトルや 行 列 を, 思 い 浮 かべてもらってもいいでしょう 配 列 の 宣 言 は, 次 のように 行 います Dim 変 数 名 ( 要 素 の 初 めの 番 号 To 要 素 の 終 わりの 番 号 ) As データ 型 例 a (3) (4) (5) (6) (7) (8) b (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 要 素 の 初 めの 番 号 を 1 からはじめたい 場 合 には,モジュールの 先 頭 で 次 のように 書 きます Option Base 1 この 宣 言 で 配 列 要 素 の 先 頭 は,(1)から 始 まるようになります この 指 定 がなければ(0)から 始 まり ます 指 定 できるのは 1 か 0 しかありません 17
2.7.2 多 次 元 配 列 2 次 元 以 上 の 配 列 も 作 ることができます 例 (0) (1) (2) (3) (4) (5) (0) x(0,0) x(0,1) x(0,2) x(0,3) x(0,4) x(0,5) (1) x(1,0) x(1,1) x(1,2) x(1,3) x(1,4) x(1,5) (2) x(2,0) x(2,1) x(2,2) x(2,3) x(2,4) x(2,5) (3) x(3,0) x(3,1) x(3,2) x(3,3) x(3,4) x(3,5) (4) x(4,0) x(4,1) x(4,2) x(4,3) x(4,4) x(4,5) この 表 からも 分 かるように,2 次 元 配 列 の 宣 言 では Dim 変 数 名 ( 最 後 の 行 番 号, 最 後 の 列 番 号 ) という 形 になります また 3 次 元 以 上 の 配 列 も 利 用 することができます 次 元 数 の 最 大 値 は 60 です 例 配 列 の 要 素 数 の 最 大 値 は, 使 用 しているコンピュータのメモリの 容 量 によって 決 まります 上 限 を 超 えて 大 きな 配 列 を 宣 言 すると メモリが 不 足 しています ( 図 2.7.2)というエラーが 出 ます エラ ーが 出 なくても, 不 必 要 に 大 きな 配 列 を 宣 言 すると 実 行 速 度 が 極 端 に 低 下 しますので 注 意 しましょ う 図 2.7.2 18
2.7.3 動 的 配 列 必 要 な 配 列 の 大 きさが,プログラムの 実 行 時 にならないと 分 からない 場 合 にはどうすればいいの でしょうか そのような 場 合 には, 動 的 配 列 を 使 うことができます 動 的 配 列 は, 最 初 に 要 素 数 を 指 定 しないで 配 列 を 宣 言 しておき, 実 行 時 に 要 素 数 が 確 定 したと きに,その 配 列 を 再 宣 言 します 例 ReDim 文 の 構 文 は, 下 記 のとおりです この 文 は 配 列 の 大 きさや 次 元 数 を 変 えるために 何 度 でも 使 うことができます ReDim [Preserve] 変 数 名 ( 要 素 数 ) [As データ 型 ] ReDim 文 は Dim 文 とほぼ 同 じですが, 違 うのは Preserve というオプションを 指 定 できることです Preserve をつけると, 既 に 配 列 に 格 納 されているデータを 保 持 したまま 配 列 の 大 きさや 次 元 数 を 変 えることができます Preserve がない 場 合 は, 配 列 は 初 期 化 されます 2.8コメント コメントというのは,プログラムを 読 みやすくするために 記 述 する, 解 説 文 のことです コメント 文 は, プログラムの 実 行 には 何 も 影 響 を 与 えません プログラムを 作 成 している 時 点 では,よく 分 かってい るつもりでも, 後 で 読 み 返 すとどのような 処 理 をしているのかさっぱり 分 からない,というようなことが あります そのようなことを 防 ぐために,きちんと 分 かりやすいコメントを 書 く 習 慣 を 付 けましょう Rem あるいは '(シングルクォーテーション) に 続 く 文 字 列 は,コメントとみなされ, 緑 色 の 文 字 で 表 されます 例 19
2.9 継 続 行 プログラムの 1 行 が 非 常 に 長 くなると, 画 面 をスクロールしてみなければならず, 見 づらくなってし まいます そういう 場 合 は,1 行 のプログラムを 2 行 以 上 に 書 くことができます _( 半 角 の 空 白 とア ンダースコア) を 行 の 最 後 にすると, 次 の 行 と 続 いていて 同 一 の 行 とみなされます 継 続 行 例 2.10 条 件 判 断 条 件 判 断 とは, 変 数 の 値 などによってプログラム 中 の 処 理 を 変 えるような 操 作 をいいます コンピ ュータが 他 の 機 械 と 大 きく 異 なるのは,この 条 件 判 断 ができるところにあるのです 2.10.1 If 文 If 文 の 構 文 は 以 下 のような 2 通 りのものがあります If 条 件 式 Then 実 行 文 [ Else 実 行 文 EndIf ] If 条 件 式 Then 実 行 文 [ ElseIf 条 件 式 Then 実 行 文 [ Else 実 行 文 ] EndIf ] If のあとの 条 件 式 には, 比 較 演 算 子 や 論 理 演 算 子 を 使 って 答 えが 真 (True)か 偽 (False)である ような 式 か,あるいは Boolean 型 の 変 数 が 入 ります 条 件 式 の 答 えが 真 であれば,Then の 後 の 実 行 文 を 実 行 し, 偽 であれば 何 もしないか,Else の 後 の 実 行 文 あるいは ElseIf のあとの 条 件 式 の 評 価 を 行 います 例 20
: 次 は ElseIf の 例 ですが,ElseIf を 使 った 場 合, 注 意 しなければいけないのは If や ElseIf の 条 件 式 のうち 一 つでも 真 の 場 合 があれば,それ 以 降 の 条 件 式 については 判 定 を 行 わないことです 下 記 の 例 は tokuten が 80 以 上 なら seiseki に" 優 "を,70 以 上 80 未 満 の 場 合 は" 良 ",60 以 上 70 未 満 は" 可 ",60 未 満 は" 不 可 "を 代 入 するプログラムです ElseIf の 正 しい 例 下 記 の 誤 った 例 では, 最 初 に tokuten が 60 以 上 かどうか 判 定 され,60 以 上 の 場 合 は 全 て " 可 "なり,60 未 満 のものだけが" 不 可 "となってしまいます それは,ElseIf ではいづれかの 条 件 式 が 真 (True)となると,それ 以 降 に 記 述 されている ElseIf の 条 件 式 は, 評 価 されなくなるからです ElseIf の 誤 った 例 21
2.10.2 Select Case 文 す Select Case 文 は,ElseIf と 同 様 に 多 方 向 への 分 岐 を 行 う 制 御 文 です 構 文 は 以 下 のとおりで Select Case 式 1 Case 式 2 実 行 文 : 実 行 文 Case 式 3 実 行 文 : 実 行 文 Case 式 n : : : Case Else : : : EndSelect Select Case 文 の 式 1 には, 式 や 変 数 を 記 述 します この 式 1 と 式 2~ 式 n までで 等 しい 式 の Case に 続 く 文 を 実 行 します Case Else は 必 要 がなければ, 記 述 しなくてもかまいませんが, 想 定 外 の 値 が 出 た 場 合 Case Else に 跳 ぶようにしておくと 予 期 せぬエラーを 防 ぐことができます Else If で 用 いたものと 同 じ 例 を,Select Case で 記 述 してみましょう 下 記 の 例 は tokuten が 80 以 上 なら seiseki に" 優 "を,70 以 上 80 未 満 の 場 合 は" 良 ",60 以 上 70 未 満 は" 可 ",60 未 満 は" 不 可 "を 代 入 するプログラムです 例 1 のプログラムは 数 値 の 大 きいものから 判 定 しています それに 対 して, 例 2 のものは 数 値 の 小 さいものから 判 定 しています 例 3 は, 値 の 範 囲 を 指 定 して 分 岐 す るものです 22
ここで Is,To というキーワードが 使 われているのに 注 意 して 下 さい Is は 比 較 式 を 使 って 値 を 指 定 したい 場 合 に 使 います To は 最 小 値 と 最 大 値 を 指 定 し, 値 の 範 囲 を 示 したい 場 合 に 使 います 例 4 はもっとも 一 般 的 に 良 く 使 われる Select Case 文 の 使 い 方 です 例 1 例 2 例 3 23
例 4 2.11 繰 り 返 し 条 件 判 断 がコンピュータのコンピュータらしいところなのですが, 繰 り 返 しはコンピュータが 機 械 であることを 思 い 出 させてくれるところで, 同 じ 処 理 を 何 度 も 何 度 も 繰 り 返 し 実 行 していくところで す 2.11.1 For Next For Next は 反 復 回 数 が, 事 前 に 分 かっている 場 合 に 使 われる 繰 り 返 しの 方 法 です For Next は 次 のような 構 文 です For 変 数 = 初 期 値 To 終 値 [Step 増 分 ] 実 行 文 実 行 文 Next [ 変 数 ] 24
例 1 アクティブなシート 上 に 下 図 のようなデータがある 場 合,これらのデータを 1 次 元 配 列 の 変 数 に 代 入 するプログラムを 作 ってみましょう 図 2.11. 1 データの 表 例 2 次 にシート 上 に 下 図 のような 2 次 元 のデータがある 場 合,このデータを 2 次 元 配 列 に 代 入 するプ ログラムを 作 ってみましょう この 場 合 は,For Next の 繰 り 返 しを 二 重 に 使 います 図 2.11.2 データの 表 上 のプログラムでは, 外 側 の 繰 り 返 しで 初 めにjが 1 となり, 次 に 内 側 の 繰 り 返 しで i が 1,2,3,4, 5 と 変 わっていき,i が 5 までくると 内 側 の 繰 り 返 しが 終 了 し, 外 側 の 繰 り 返 しでjが 2 となります a(i,j) は 表 2.11.1 のように 変 化 していきます 25
表 2.11.1 繰 り 返 しの 値 の 変 化 繰 り 返 しの 回 数 j i a(i,j)の 値 1 1 1 1 2 1 2 2 3 1 3 3 4 2 1 2 5 2 2 3 6 2 3 4 なお, 例 1, 例 2 では Step 増 分 の 部 分 が 省 略 されています 省 略 された 場 合 の 増 分 は, 既 定 値 1 となります 次 のように 増 分 を 2 として,1 つ 飛 ばしに 指 定 したり, 負 の 値 を 指 定 し 大 きいものか ら, 小 さいものへと 繰 り 返 すこともできます 例 3 増 分 が 2 刻 みの 場 合 例 4 増 分 が 負 の 値 ここで, 例 1 と 例 2 で 出 てきた Cells というキーワードについて 説 明 しておきます Cells とは,ワー クシート 上 のセルの 属 性 (プロパティ)を 示 すもので,そのセルの 値, 大 きさ, 色,フォント,フォント サイズといったプロパティがあるところです シート 上 の 特 定 のセルのデータを 取 得 するには,Cells プロパティを 使 います Cells プロパティの 構 文 は, 下 記 のとおりです [オブジェクト 名.]Cells( 行 番 号, 列 番 号 ) オブジェクト 名 は, 通 常 はシート 名 が 入 りますが, 何 も 指 定 がなければアクティブなシートが 指 定 されたとみなされます また, 列 番 号 は 左 から 順 に 数 えた 場 合 の 列 番 号 を 指 定 します ですから, 26
列 A は 列 番 号 1, 列 B は 2, 列 C は 3 というように 指 定 します 例 2.11.2 Do Loop For Next 文 は, 繰 り 返 しの 回 数 が 分 かっている 場 合 に 使 いますが, 繰 り 返 しの 回 数 が 分 から ないが, 定 められた 条 件 式 が 真 の 間 繰 り 返 したり, 条 件 式 が 真 になるまで 繰 り 返 したりする 場 合, Do Loop を 使 います Do Loop には, 条 件 式 が 真 の 間 処 理 を 繰 り 返 す While 型 と, 条 件 式 が 真 になるまで 処 理 を 繰 り 返 す Until 型 があり,それぞれに 繰 り 返 しの 最 初 で 条 件 判 断 を 行 うものと 最 後 で 条 件 判 断 を 行 うものの 計 4 つのタイプがあります 繰 り 返 しの 最 初 で 条 件 判 断 を 行 う 場 合 は, 条 件 によってはその 繰 り 返 しが 1 回 も 実 行 されない 場 合 があるのに 対 して, 条 件 判 断 を 最 後 に 行 う 場 合 は,1 回 目 の 繰 り 返 しは 無 条 件 に 実 行 されるという 違 いがある 表 2.11.3 Do Loop の 4 つのタイプ 最 初 に 条 件 判 断 最 後 に 条 件 判 断 While 型 条 件 式 が 真 の 間 反 復 Do While 条 件 式 実 行 文 実 行 文 Loop Do 実 行 文 実 行 文 Loop While 条 件 式 Until 型 条 件 式 が 真 になるまで 反 復 Do Until 条 件 式 実 行 文 実 行 文 Loop Do 実 行 文 実 行 文 Loop Until 条 件 式 27
例 1 アクティブなシート 上 に 下 図 のようなデータがある 場 合,これらのデータを 1 次 元 配 列 の 変 数 に 代 入 するプログラムを 作 ってみましょう その 際,データがいくつあるか 分 からないが,データの 無 図 2.11.2 いセルがあれば,そこでデータは 終 わりにします While による 前 判 定 While による 後 判 定 Until による 前 判 定 Until による 後 判 定 28
2.12 その 他 の 制 御 文 2.12.1 GoTo 文 GoTo 文 は 無 条 件 に 分 岐 する 文 です 構 文 は 次 のような 形 式 で,GoTo 文 のあとに 記 述 されたラ ベルと 同 じラベルの 行 まで 制 御 が 移 ります GoTo ラベル ラベル: 例 1 下 記 の 例 では Cell の 値 が 負 のとき Negative というラベルの 行 まで 跳 びます ですから,Cell の 値 が 負 の 場 合 は,それ 以 降 の For Next は 実 行 されなくなります 2.12.2 Exit 文 For Next,Do Loop などの 繰 り 返 しから 途 中 で 抜 け 出 したり,Sub プロシージャや 関 数 プ ロシージャから 抜 け 出 す 文 です 構 文 としては, 以 下 の 5 種 類 があります 表 2.12.2 各 種 の Exit 文 文 説 明 Exit For* Exit Do* Exit Sub For Next の 繰 り 返 しから 抜 け,Next 文 の 次 に 制 御 が 移 ります Do Loop の 繰 り 返 しから 抜 け,Loop 文 の 次 に 制 御 が 移 ります Exit 文 を 含 む Sub プロシージャから 抜 け,その Sub プロシージャを 呼 び 出 し た 文 の 次 の 文 へ 制 御 が 移 ります Exit Function Exit 文 を 含 む Function プロシージャから 抜 け,その Function プロシージャを 呼 び 出 した 文 の 次 の 文 へ 制 御 が 移 ります Exit Property Exit 文 を 含 む Property プロシージャから 抜 け,その Property プロシージャ を 呼 び 出 した 文 の 次 の 文 へ 制 御 が 移 ります * 上 記 の Exit 文 のうち Exit For や Exit Do の 場 合, 二 重 以 上 の 繰 り 返 しの 中 で Exit 文 を 使 うとそ の Exit 文 を 含 む 最 も 内 側 の 繰 り 返 しから 抜 け 出 します 29
例 1 下 記 の 例 は 二 重 の 繰 り 返 しの 中 で Exit 文 が 使 われていますが,この 場 合 Exit 文 が 実 行 される と, 次 に 実 行 されるのは Next j の 文 です 外 側 の 繰 り 返 しまでは 抜 け 出 すことはありません ここへ 抜 け 出 す 2.13 Sub プロシージャ Sub 文 の 構 文 は 下 記 のとおりです Sub 文 は Sub プロシージャを 作 るときに 使 います Sub 名 前 ([ 引 数 1, 引 数 2,, 引 数 n ]) End Sub Sub 文 では,Sub プロシージャの 名 前 と 名 前 の 後 の( )が 必 要 です 引 数 リストは, 引 数 がなけれ ば 必 要 がありませんが,()はその 場 合 でも 必 要 です Sub プロシージャの 呼 び 出 し 方 法 には,2 通 りの 方 法 があります 1 つは Call 文 を 使 う 方 法 と 使 わ ない 方 法 です 例 下 記 のような Exampl1 という Sub プロシージャを 呼 び 出 します Call 文 を 使 った 呼 び 出 しでは, 引 数 を()で 括 る 必 要 があります VBA の Sub プロシージャは, 自 分 自 身 を 呼 び 出 す 再 帰 呼 び 出 しが 可 能 です 再 帰 呼 び 出 しの 例 は, 次 の Function 文 で 示 します 30
2.14 Function 文 Function 文 の 構 文 は 下 記 のとおりです Function 文 は Function プロシージャを 作 るときに 使 いま す Function プロシージャと Sub プロシージャの 違 いは, 戻 り 値 がありそれによって 呼 び 出 したプロ シージャに 値 を 戻 すことができるという 点 です もちろん,Sub プロシージャでも 引 数 を 使 うことによ って 値 を 戻 すことはできますが,Function プロシージャの 場 合 はそれ 以 外 に 戻 り 値 という 形 で 呼 び 出 したプロシージャに 値 を 戻 すことができるのです Function 関 数 名 ([ 引 数 1, 引 数 2,, 引 数 n ]) [As 型 ] [ 関 数 名 = 戻 り 値 ] End Function 例 1 階 乗 の 計 算 を 行 う 関 数 です Function プロシージャの 呼 び 出 しは, 下 の 例 のように 関 数 名 の 次 に()で 括 って 引 数 を 記 述 しま す 引 数 がない 場 合 でも()は 必 要 です 例 2 関 数 の 呼 び 出 し 方 例 1 の 関 数 を 呼 び 出 しています Function プロシージャも Sub プロシージャと 同 様 に, 再 帰 呼 び 出 しができます 再 帰 呼 び 出 しは, 自 分 自 身 を 呼 び 出 すものです 次 の 例 3 は, 例 1 の 階 乗 を 行 う 関 数 を 再 帰 呼 び 出 しの 形 に 書 き 換 えたものです 31
再 帰 呼 び 出 しは,プログラムの 実 行 効 率 から 考 えると 必 ずしも 良 くありませんが, 再 帰 呼 び 出 しを 使 ったほうが,よりわかりやすいプログラムになるアルゴリズムも 多 いので,うまく 使 い 分 ける 必 要 が あります 自 分 で 関 数 を 作 成 する 場 合 は,Function 文 を 使 いますが, 多 くの 便 利 な 関 数 が VBA で 用 意 さ れています また,ワークシートで 使 われる 関 数 の 一 部 は VBAの 中 で 利 用 することもできます ワー クシートで 使 われる 関 数 をワークシート 関 数 と 呼 びますが,その 使 い 方 は 標 準 の VBA 関 数 と 異 なり ます ワークシート 関 数 は 次 のような 形 で 呼 び 出 します Application.WorksheetFunction. 関 数 名 ([ 引 数 ]) 例 上 記 の 例 では,セル B2~B51 までの 数 値 の 平 均 を,ワークシート 関 数 を 使 って 求 めています このときに Range("B2:B51")は Range オブジェクトといい,セル 範 囲 を 指 定 するときに 使 います ワ ークシート 関 数 を 使 う 場 合 は, 必 要 になることが 多 いのでよく 覚 えておいてください 32
参 考 文 献 アスキー 書 籍 編 集 部 編 1999 Excel VBA 2000 リファレンス アスキー 東 京 Dixon,M.R. & MacLin,O.H. 2003 Visual Basic for Behavioral Psychologists. Context Press Reno 市 川 伸 一, 矢 部 富 美 枝 編 1985 パーソナル コンピュータによる 心 理 学 実 験 入 門 ブレーン 出 版 東 京 金 子 秀 彬, 吉 田 俊 郎, 伊 田 政 司, 森 山 哲 美 1990 心 理 学 に 必 要 なコンピュータ 技 術 北 樹 出 版 東 京 北 村 英 哉, 坂 本 正 浩 編 2004 パーソナル コンピュータによる 心 理 学 実 験 入 門 : 誰 でもすぐにでき るコンピュータ 実 験 ナカニシヤ 出 版 京 都 水 野 りか 2004 Web を 介 してできる 基 礎 認 知 心 理 学 実 験 演 習 ナカニシヤ 出 版 京 都 野 沢 晨 1986 パソコン BASIC 心 理 学 実 験 東 海 大 学 出 版 会 東 京 田 中 良 久 1975 BASIC 入 門 行 動 科 学 のためのコンピュータ プログラミング 入 門 東 京 大 学 出 版 会 東 京 吉 村 浩 一, 山 上 暁 1983 BASIC 入 門 ナカニシヤ 出 版 京 都 33