MS-ExcelVBA 基礎 (Visual Basic for Application). 主な仕様一覧 () データ型 ( 主なもの ) 型型名型宣言文字長さ内容整数型 Integer % バイト -, ~, 長整数型 Long & バイト -,,, ~,,, 単精度浮動小数点数型倍精度浮動小数点数型 Single! バイト負値 : -.0E ~ -.0E- 正値 :.0E- ~.0E Double # バイト負値 : -.E0 ~ -.0E- 正値 :.0E- ~.E0 文字列型 String $ 可変長の場合, 約 GB( ) バイト オブジェクト型 Object バイトオブジェクトを参照するためのアドレス バイト型 Byte バイト 0~ の正の数値 ブール型 Boolean バイト True( 真 ) または False( 偽 ) () プロシジャの構成 Sub プロシジャ名 () 変数の型宣言... 処理... () 注釈 ( コメント ) ' シングルクォーテーション (') のあとは注釈とみなされる () 型宣言 Dim 変数名 As 型名 () 名前付け規則 - 名前の先頭は文字でなければならない - 名前にはスペース, ピリオド (.), カンマ (,), 感嘆符 (!), ハイフン (-), アットマーク (@), アンパサント (&), ドル記号 ($), ナンバ記号 (#) などの特殊文字を使うことはできない ただし, アンダースコア (_) を使用することができる - 変数名には, データ型を示す型宣言文字 (%,&,!,#,$) が使用できる - 名前は 文字 ( 半角の場合 ) 以内でなければならない - 通常,Visual Basic の関数, ステートメント, およびメソッドと同じ名前を使うことはできない () 演算子 & 文字列の連結 * 乗算 + 加算 - 減算 / 除算 \ 商 ^ べき乗 Mod 剰余
() If...Then () If 条件式 Then 処理 () 論理演算子 And 論理積 Or 論理和 > >= < <= <> = () 比較演算子 (0) If...Then () If 条件式 Then 処理 処理 () If...Then () If 条件式 Then 処理 If 条件式 処理 If 条件式 処理 処理 () Do While...Loop Do While 条件式処理 Loop Do...Loop から抜け出すときは, Exit Do を用いる () For...Next For 変数 = 初期値 To 終値 Step 増分値処理 Next 変数 (For に対応する変数 ) For...Next から抜け出すときは, Exit For を用いる
() 文字列定数 Dim str As String str = "string" () 次行への継続 ( アンダースコア ) 文 _ 文 () 配列宣言 Dim ix(,) As Integer () セル参照の設定とセルの値の参照 Dim s As String Dim x As Double Set p = Worksheets(" シート名 ").Range(" セル範囲 ") s = p.cells(, ).Text 文字列として参照する x = p.cells(, ).Value 数値として参照する () セル参照の設定とセルへの値の設定 Set p = Worksheets(" シート名 ").Range(" セル範囲 ") p.cells(, ).Value = string 文字列として設定する p.cells(, ).Value =. 数値として設定する
. 例題による演習. 準備 () 指定された URL からサンプル ファイルをダウンロードして保存しなさい () Excel を起動してサンプル ファイルを開く () Alt + F とキー操作して VBA を起動する () 新しいプロシジャを作成する 挿入 標準モジュール 次のプログラムを入力しなさい これはメッセージボックスで "Hello, world!" と返してくるプログラムである MsgBox 関数を使用する例である -------------------------------( この罫線は記入しない ) Sub ex0() MsgBox ("Hello, world!") -------------------------------( この罫線は記入しない ) () 実行ボタンをクリックして実行する ( 注 ) 中止するときは ボタンをクリックする 以下, 例題ごとに ()() を繰り返しす. 例題 ex0 セルの値の足し算 () C 列の つの値を足して, その結果を 行目のセル (C0) に書き込むプログラムを作成しなさい 左端の行番号は入力しなくてよい Sub ex0() Set p = Worksheets("a").Range("C:C0") p.cells(, ).Value = p.cells(, ).Value + p.cells(, ).Value. プロシジャの始まり ex0 はプロシジャ名 () は必須 プロシジャは一般に次の構成からなる Sub プロシジャ名 () 変数の型宣言... 処理.... p をオブジェクト変数として宣言する セル範囲を指し示すオブジェクトとして使用するため. p にワークシート "a" のセル範囲 "C:E0" を設定する. セルの値を参照して足し算をする 結果をセルに書き込む ここで, セル範囲の最も左上のセル位置を (,) と表す Cells(,) は, セル範囲の 行 列目のセルを指す Cells(,) は, セル範囲の 行 列目のセルを指す Cells(,) は, セル範囲の 行 列目のセルを指す Value は, セル内の値を指す つまり p.cells(i,j).value は, セル範囲 p の,i 行 j 列目のセルの値 という意味 実は, セル範囲の指定を "C" とだけしてもよい 結果は同じである 要するに, 最も左上のセル位置さえ指定すればよい Cells(i,j) はそこからの相対位置のセルを指すことになる. プロシジャの終わり
ex0 セルの値の足し算 () 上の応用として, 行目の つのセルの値を横に足して, 結果を 行 列目 (E) に書き込むプログラムを作成しなさい Sub ex0() Set p = Worksheets("a").Range("C")? ex0 If...Then によるカテゴライズ 人について,0cm 以上を " 高い ",0cm 未満を " ふつう " とカテゴライズするプログラムを作成しなさい 結果を E 列に書き込みなさい 0 Sub ex0() Set p = Worksheets("a").Range("D") '... 太郎 If p.cells(, ).Value >= 0 Then p.cells(, ).Value = " 高い " p.cells(, ).Value = " ふつう " '... 花子? '... 一郎? 次の構文は,If...Then による判断と分岐の例である 上のプログラムは, 構文 に当たる ( 構文 ) 条件式が True ならば, 処理を実行する ジャンプ命令がなければ の次へ進む 条件式が False ならば, の次へ進む If 条件式 Then 処理 ( 構文 ) 条件式が True ならば, 処理 を実行する ジャンプ命令がなければ の次へ進む 条件式が False ならば, の次へ進み処理 を実行する ジャンプ命令がなければ の次へ進む If 条件式 Then 処理 処理 ( 構文 ) 条件式 が True ならば, 処理 を実行する ジャンプ命令がなければ の次へ進む 条件式 が False ならば, 次の If へ進む 条件式 が True ならば, 処理 を実行する ジャンプ命令がなければ の次へ進む
条件式 が False ならば, 次の If へ進む 条件式 が True ならば, 処理 を実行する ジャンプ命令がなければ の次へ進む 条件式 が False ならば, の次の処理 を実行する ジャンプ命令がなければ の次へ進む If 条件式 Then 処理 If 条件式 処理 If 条件式 処理 処理 ex0 For...Next による繰り返し 人について,0cm 以上を " 高い ",0cm 未満を " ふつう " とカテゴライズするプログラムを作成しなさい 0 Sub ex0() Dim i As Integer Set p = Worksheets("a").Range("D") For i = To If p.cells(i, ).Value >= 0 Then p.cells(i, ).Value = " 高い "?. p をオブジェクト変数として宣言する. i を整数型の変数として宣言する. p にワークシート "a" のセル範囲 "D" を設定する ~. インデックスや添え字の値が規則的に変化して, 同種の処理を繰り返すとき,For...Next 構文を使用する 次のような構文である For 変数 = 初期値 To 終値 Step 増分値処理 Next 変数これは, 次の意味である 変数 ( 添え字など ) の値を初期値に設定して 回処理を実行する 次に変数の値を増分値だけ増やした値に変えて再度処理を実行する 同じく変数の値を増分値だけ増やした値に変えて再度処理を実行する これを繰り返す 変数を増分値だけ増やした値が終値を超えたら, 処理を実行しないで Next の次へ進む Next の後の変数はなくてもよい Step のあとの増分値が のときは省略してよい この例では, 変数 i を から まで つずつ変えて, 行 ~0 行の処理を 回繰り返している なお,For...Next は入れ子の構文にして使用できる ex0 Do While...Loop による繰り返し与えられた 0 進数を 進数に変換するプログラムを作成しなさい Sub ex0() Dim shou, i As Integer
0 0 0 '... p にセル範囲 "D" を設定する Set p = Worksheets("a").Range("D") '... 与えられた 0 進数を shou に設定する shou = p.cells(, 0).Value '... 行カウンタ i に を設定する ( 行目の意味 ) i = '... shou が正である限り繰り返す Do While shou > 0 '... shou を で割った余りを (i,) に設定する p.cells(i, ).Value = shou Mod '... shou を で割った商を (i,) に設定する p.cells(i, ).Value =? '... 上で求めた商を shou に設定し直す shou = p.cells(i, ).Value '... 行カウンタ i を つ増やす i = i + Loop 0 進数 shou を 進数に変換する方法は, 次の通りである () shou を で割った余りを, 進数の右端から左へ向けて並べる () shou を で割った商を,shou の値に設定し直す () 上の ()() を繰り返す () shou>0 でなくなったら ( つまり shou の値が 0 になったら ), ストップする このプログラムでは次のようにして実現している. 変数 shou,i を Integer( 整数型 ) として宣言する. 変数 p をオブジェクト変数として宣言する 0.. Do While...Loop へ入る前の初期設定をしている Do While...Loop は次の構文をしている Do While 条件式処理 Loop 条件式が True ならば, 回処理を実行する そのあと再び条件式をみる True ならば再び処理を実行する こうして, 条件式が True の間処理を実行し続ける 条件式が False になったら, 処理を実行しないで,Loop の次に進む 処理の過程で条件式を変更するような仕組みを組み込んでおくことが大事なポイントとなる ~0. 上に書いた ()()()() の処理に該当することを繰り返している. 再度処理の繰り返しに入る準備として,shou に商の値を設定している. 同じく処理の繰り返しに入る準備として,i に次の出力行の値を設定している ex0 並べ替え ( 整列,sort)() 00 個の整数を小さいものから順に並べるプログラムを作成しなさい 方法は基本選択法である なお,C 列の数をあらかじめ D 列にコピーした数を用いて並べ替えを実行しなさい C 列の数はそのまま
保存しておくものとする 0 0 0 Sub ex0() '... 必要な変数の型宣言 Dim i, j, tmp As Integer '... p にセル範囲 "D" を設定する Set p = Worksheets("a").Range("D") '... 基準の行を表す i を から まで つずつ変えながら実行する For i = To '... 比較対象の行を表す j を i+ から 00 まで つずつ変えながら実行する For j =? '... 基準の i 行目の数より j 行目の数が小さいならば If p.cells(i, ).Value > p.cells(j, ).Value Then '... i 行目の数と j 行目の数とを入れ替える tmp = p.cells(i, ).Value p.cells(i, ).Value = p.cells(j, ).Value p.cells(j, ).Value =? Next j ex0 並べ替え ( 整列,sort)() 上のプログラムのように, セルからの読み込みと, セルへの書き込みとを頻繁に行う方法は時間がかかる そこで, はじめにセルから配列にすべての数値を読み込んで, 配列内で整列を実施し, その結果をセルに書き出すようなプログラムに改良しなさい 0 Sub ex0() '... 必要な変数と配列の型宣言 Dim i, j, tmp As Integer Dim ia(00) As Integer '... p にセル範囲 "D" を設定する Set p = Worksheets("a").Range("C") '... 配列 ia にもとの数を読み込む For i = To 00 ia(i) = p.cells(i, ).Value '... 基準の行を表す i を から まで つずつ変えながら実行する For i = To
0 0 0 '... 比較対象の行を表す j を i+ から 00 まで つずつ変えながら実行する For j = i + To 00 '... 基準の i 行目の数より j 行目の数が小さいならば If ia(i) > ia(j) Then '... i 行目の数と j 行目の数とを入れ替える tmp =?? =?? = tmp Next j '... 配列 ia の数を書き出す For i = To 00 p.cells(i, ).Value = ia(i) 以上