• 検索結果がありません。

MS-ExcelVBA 基礎 (Visual Basic for Application)

N/A
N/A
Protected

Academic year: 2021

シェア "MS-ExcelVBA 基礎 (Visual Basic for Application)"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

MS-ExcelVBA 基礎

(Visual Basic for Application)

1. 主な仕様一覧 (1) データ型(主なもの) 型 型名 型宣言文字 長さ 内容 整数型 Integer % 2 バイト -32,768 ~ 32,767 長整数型 Long & 4 バイト -2,147,483,648 ~ 2,147,483,647 単 精 度 浮 動 小 数 点 数 型

Single ! 4 バイト 負値: -3.402823E38 ~ -1.401298E-45 正値: 1.401298E-45 ~ 3.402823E38 倍 精 度 浮 動 小 数 点 数

Double # 8 バイト 負値: -1.79769313486231E308 ~ -4.94065645841247E-324 正値: 4.94065645841247E-324 ~ 1.79769313486232E308 文字列型 String $ 可変長の場合,約 2GB(231)バイト

オブジェクト型 Object 4 バイト オブジェクトを参照するためのアドレス バイト型 Byte 1 バイト 0~255 の正の数値

ブール型 Boolean 2 バイト True(真)または False(偽)

(2) プロシジャの構成 Sub プロシジャ名() 変数の型宣言 .... 処理 ... End Sub (3) 注釈(コメント) ' シングルクォーテーション(')のあとは注釈とみなされる (4) 型宣言 Dim 変数名 As 型名 (5) 名前付け規則 - 名前の先頭は文字でなければならない。 - 名前にはスペース,ピリオド (.),カンマ(,),感嘆符 (!),ハイフン(-),アットマーク(@), アンパサント(&),ドル記号($),ナンバ記号(#)などの特殊文字を使うことはできない。 ただし,アンダースコア(_)を使用することができる。 - 変数名には,データ型を示す型宣言文字(%,&,!,#,$)が使用できる。 - 名前は 255 文字 (半角の場合) 以内でなければならない。 - 通常,Visual Basic の関数,ステートメント,およびメソッドと同じ名前を使うことはできない。 (6) 演算子 & 文字列の連結 * 乗算 + 加算 - 減算 / 除算 \ 商

(2)

(7) If...Then (1) If 条件式 Then 処理 End If (8) 論理演算子 And 論理積 Or 論理和 (9) 比較演算子 > >= < <= <> = (10) If...Then (2) If 条件式 Then 処理 1 Else 処理 2 End If (11) If...Then (3) If 条件式 1 Then 処理 1 ElseIf 条件式 2 処理 2 ElseIf 条件式 3 処理 3 Else 処理 4 End If (12) Do While...Loop Do While 条件式 処理 Loop Do...Loop から抜け出すときは, Exit Do を用いる。 (13) For...Next For 変数 = 初期値 To 終値 Step 増分値 処理 Next 変数(For に対応する変数) For...Next から抜け出すときは, Exit For を用いる。

(3)

(14) 文字列定数 Dim str As String str = "string" (15) 次行への継続(アンダースコア) 文 1 _ 文 2 (16) 配列宣言 Dim ix(2,3) As Integer

(17) セル参照の設定とセルの値の参照 Dim p As Object Dim s As String Dim x As Double Set p = Worksheets("シート名").Range("セル範囲") s = p.Cells(1, 1).Text ’ 文字列として参照する x = p.Cells(2, 1).Value ’ 数値として参照する (18) セル参照の設定とセルへの値の設定 Dim p As Object Set p = Worksheets("シート名").Range("セル範囲") p.Cells(1, 1).Value = ”string” ’ 文字列として設定する p.Cells(2, 1).Value = 123.67 ’ 数値として設定する

(4)

2. 例題による演習 2.1 準備 (1) 指定された URL からサンプル・ファイルをダウンロードして保存しなさい。 (2) Excel を起動してサンプル・ファイルを開く。 (3) Alt + F11 とキー操作して VBA を起動する。 (4) 新しいプロシジャを作成する ① 「挿入」→「標準モジュール」 ② 次のプログラムを入力しなさい。これはメッセージボックスで"Hello, world!"と返してくる プログラムである。MsgBox 関数を使用する例である。 ---(この罫線は記入しない) Sub ex01()

MsgBox ("Hello, world!") End Sub ---(この罫線は記入しない) (5) 実行ボタン をクリックして実行する。(注)中止するときは■ボタンをクリックする。 以下,例題ごとに(4)(5)を繰り返しす。 2.2 例題 ex02 セルの値の足し算(1) C 列の 2 つの値を足して,その結果を 3 行目のセル(C10)に書き込むプログラムを作成しなさい。左端の 行番号は入力しなくてよい。 1 2 3 4 5 6 Sub ex02() Dim p As Object Set p = Worksheets("a").Range("C8:C10")

p.Cells(3, 1).Value = p.Cells(1, 1).Value + p.Cells(2, 1).Value MsgBox ("終わりました") End Sub 1. プロシジャの始まり。ex02 はプロシジャ名。()は必須。 プロシジャは一般に次の構成からなる。 Sub プロシジャ名() 変数の型宣言 .... 処理 ... End Sub 2. p をオブジェクト変数として宣言する。 セル範囲を指し示すオブジェクトとして使用するため。 3. p にワークシート"a"のセル範囲"C8:E10"を設定する。 4. セルの値を参照して足し算をする。結果をセルに書き込む。 ここで,セル範囲の最も左上のセル位置を(1,1)と表す。 Cells(1,1)は,セル範囲の 1 行 1 列目のセルを指す。 Cells(2,1)は,セル範囲の 2 行 1 列目のセルを指す。 Cells(3,1)は,セル範囲の 3 行 1 列目のセルを指す。 Value は,セル内の値を指す。 つまり p.Cells(i,j).Value は,「セル範囲 p の,i 行 j 列目のセルの値」という意味。 実は,セル範囲の指定を"C8"とだけしてもよい。結果は同じである。要するに,最も左上のセル位置 さえ指定すればよい。Cells(i,j)はそこからの相対位置のセルを指すことになる。 6. プロシジャの終わり。

(5)

ex03 セルの値の足し算(2) 上の応用として,1 行目の 2 つのセルの値を横に足して,結果を 1 行 3 列目(E8)に書き込むプログラムを 作成しなさい。 1 2 3 4 5 6 Sub ex03() Dim p As Object Set p = Worksheets("a").Range("C8") ? MsgBox ("終わりました") End Sub ex04 If...Then によるカテゴライズ 3 人について,170cm 以上を"高い",170cm 未満を"ふつう"とカテゴライズするプログラムを作成しなさ い。結果を E 列に書き込みなさい。 1 2 3 4 5 6 7 8 9 10 Sub ex04() Dim p As Object Set p = Worksheets("a").Range("D17") '...太郎

If p.Cells(1, 1).Value >= 170 Then p.Cells(1, 2).Value = "高い" Else p.Cells(1, 2).Value = "ふつう" End If '...花子 ? '...一郎 ? MsgBox ("終わりました") End Sub 次の構文は,If...Then による判断と分岐の例である。上のプログラムは,構文 2 に当たる。 (構文 1) 条件式が True ならば,処理を実行する。ジャンプ命令がなければ End If の次へ進む。 条件式が False ならば,End If の次へ進む。 If 条件式 Then 処理 End If (構文 2) 条件式が True ならば,処理 1 を実行する。ジャンプ命令がなければ End If の次へ進む。

条件式が False ならば,Else の次へ進み処理 2 を実行する。ジャンプ命令がなければ End If の次へ進む。 If 条件式 Then 処理 1 Else 処理 2 End If (構文 3) 条件式 1 が True ならば,処理 1 を実行する。ジャンプ命令がなければ End If の次へ進む。

(6)

条件式 2 が False ならば,次の ElseIf へ進む。

条件式 3 が True ならば,処理 3 を実行する。ジャンプ命令がなければ End If の次へ進む。

条件式 3 が False ならば,Else の次の処理 4 を実行する。ジャンプ命令がなければ End If の次へ進む。 If 条件式 1 Then 処理 1 ElseIf 条件式 2 処理 2 ElseIf 条件式 3 処理 3 Else 処理 4 End If ex05 For...Next による繰り返し 8 人について,170cm 以上を"高い",170cm 未満を"ふつう"とカテゴライズするプログラムを作成しなさ い。 1 2 3 4 5 6 7 8 9 10 11 12 13 Sub ex05() Dim p As Object Dim i As Integer Set p = Worksheets("a").Range("D24") For i = 1 To 8

If p.Cells(i, 1).Value >= 170 Then p.Cells(i, 2).Value = "高い" Else ? End If Next i MsgBox ("終わりました") End Sub 2. p をオブジェクト変数として宣言する。 3. i を整数型の変数として宣言する。 4. p にワークシート"a"のセル範囲"D24"を設定する。 5~11. インデックスや添え字の値が規則的に変化して,同種の処理を繰り返すとき,For...Next 構文を使用 する。次のような構文である。 For 変数 = 初期値 To 終値 Step 増分値 処理 Next 変数 これは,次の意味である。 変数(添え字など)の値を初期値に設定して 1 回処理を実行する。 次に変数の値を増分値だけ増やした値に変えて再度処理を実行する。 同じく変数の値を増分値だけ増やした値に変えて再度処理を実行する。 これを繰り返す。 変数を増分値だけ増やした値が終値を超えたら,処理を実行しないで Next の次へ進む。 Next の後の変数はなくてもよい。 Step のあとの増分値が 1 のときは省略してよい。 この例では,変数 i を 1 から 8 まで 1 つずつ変えて,6 行~10 行の処理を 8 回繰り返している。 なお,For...Next は入れ子の構文にして使用できる。 ex06 Do While...Loop による繰り返し 与えられた 10 進数を 2 進数に変換するプログラムを作成しなさい。 1 2 3 4 Sub ex06()

Dim shou, i As Integer Dim p As Object

(7)

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 '... p にセル範囲"D36"を設定する。 Set p = Worksheets("a").Range("D36") '... 与えられた 10 進数を shou に設定する。 shou = p.Cells(1, 0).Value

'... 行カウンタ i に 1 を設定する(1 行目の意味)。 i = 1 '... shou が正である限り繰り返す Do While shou > 0 '... shou を 2 で割った余りを(i,2)に設定する。 p.Cells(i, 2).Value = shou Mod 2

'... shou を 2 で割った商を(i,1)に設定する。 p.Cells(i, 1).Value = ?

'... 上で求めた商を shou に設定し直す shou = p.Cells(i, 1).Value

'... 行カウンタ i を 1 つ増やす i = i + 1 Loop MsgBox ("終わりました") End Sub 10 進数 shou を 2 進数に変換する方法は,次の通りである。 (1) shou を 2 で割った余りを,2 進数の右端から左へ向けて並べる。 (2) shou を 2 で割った商を,shou の値に設定し直す。 (3) 上の(1)(2)を繰り返す。 (4) shou>0 でなくなったら(つまり shou の値が 0 になったら),ストップする。 このプログラムでは次のようにして実現している。 3. 変数 shou,i を Integer(整数型)として宣言する。 4. 変数 p をオブジェクト変数として宣言する。 10. 13. Do While...Loop へ入る前の初期設定をしている。 Do While...Loop は次の構文をしている。 Do While 条件式 処理 Loop 条件式が True ならば,1 回処理を実行する。そのあと再び条件式をみる。True ならば再び処理を実行 する。こうして,条件式が True の間処理を実行し続ける。条件式が False になったら,処理を実行し ないで,Loop の次に進む。 処理の過程で条件式を変更するような仕組みを組み込んでおくことが大事なポイントとなる。 16~30. 上に書いた(1)(2)(3)(4)の処理に該当することを繰り返している。 25. 再度処理の繰り返しに入る準備として,shou に商の値を設定している。 28. 同じく処理の繰り返しに入る準備として,i に次の出力行の値を設定している。 ex07 並べ替え(整列,sort)(1)

(8)

保存しておくものとする。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Sub ex07() '... 必要な変数の型宣言 Dim i, j, tmp As Integer Dim p As Object '... p にセル範囲"D53"を設定する。 Set p = Worksheets("a").Range("D53") '... 基準の行を表す i を 1 から 99 まで 1 つずつ変えながら実行する For i = 1 To 99 '... 比較対象の行を表す j を i+1 から 100 まで 1 つずつ変えながら実行する For j = ? '... 基準の i 行目の数より j 行目の数が小さいならば If p.Cells(i, 1).Value > p.Cells(j, 1).Value Then

'... i 行目の数と j 行目の数とを入れ替える tmp = p.Cells(i, 1).Value

p.Cells(i, 1).Value = p.Cells(j, 1).Value p.Cells(j, 1).Value = ? End If Next j Next i MsgBox ("終わりました") End Sub ex08 並べ替え(整列,sort)(2) 上のプログラムのように,セルからの読み込みと,セルへの書き込みとを頻繁に行う方法は時間がかかる。 そこで,はじめにセルから配列にすべての数値を読み込んで,配列内で整列を実施し,その結果をセルに 書き出すようなプログラムに改良しなさい。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Sub ex08() '... 必要な変数と配列の型宣言 Dim i, j, tmp As Integer Dim p As Object

Dim ia(100) As Integer '... p にセル範囲"D53"を設定する。 Set p = Worksheets("a").Range("C157") '... 配列 ia にもとの数を読み込む For i = 1 To 100

ia(i) = p.Cells(i, 1).Value Next i

'... 基準の行を表す i を 1 から 99 まで 1 つずつ変えながら実行する For i = 1 To 99

(9)

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 '... 比較対象の行を表す j を i+1 から 100 まで 1 つずつ変えながら実行する For j = i + 1 To 100 '... 基準の i 行目の数より j 行目の数が小さいならば If ia(i) > ia(j) Then

'... i 行目の数と j 行目の数とを入れ替える tmp = ? ? = ? ? = tmp End If Next j Next i '... 配列 ia の数を書き出す For i = 1 To 100

p.Cells(i, 2).Value = ia(i) Next i MsgBox ("終わりました") End Sub 以上

参照

関連したドキュメント

健康人の基本的条件として,快食,快眠ならび に快便の三原則が必須と言われている.しかし

Maurer )は,ゴルダンと私が以前 に証明した不変式論の有限性定理を,普通の不変式論

Maurer )は,ゴルダンと私が以前 に証明した不変式論の有限性定理を,普通の不変式論

複合地区GMTコーディネーター就任の検討対象となるライオンは、本役職の資格条件を満たしてい

2021年9月以降受験のTOEFL iBTまたはIELTS(Academicモジュール)にて希望大学の要件を 満たしていること。ただし、協定校が要件を設定していない場合はTOEFL

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

・条例第 37 条・第 62 条において、軽微なものなど規則で定める変更については、届出が不要とされ、その具 体的な要件が規則に定められている(規則第

基準の電力は,原則として次のいずれかを基準として決定するも