VBA|基本①データ型,繰り返し,配列など
こんにちは。もぐもです。
VBAを基礎から見直す機会があったので投稿します。
そもそもVBAってなに
環境を整える
エクエルのオプションから開発タブを表示する設定に変更する。
Visual BasicあいこんからVisual Basic Editorを表示する。
挿入>標準モジュールに処理を書いていく
基本の文法
プロシージャ
関数のこと。
Sub~End Subで囲んだ内容が一つの処理として認識される。
プロシージャ名は日本語も使えるが,必ず文字始まりでなければいけない。
Sub プロシージャ名() End Sub
プロシージャ内部の書き方
Sub Test() '一行ずつ処理を書く Range("A1").Value = 100 Range("A2").Value = 200 '一行に複数の処理を書く場合は :(コロン) をつかう Range("A1").Value = 100: Range("A2").Value = 200 '複数行に分けるときは _(アンダーバー)をつかう Range("A1").Value = 100 Range("A2").Value _ = 200 End Sub
変数
Sub Test2() '変数の宣言 Dimを先頭に書くことで変数を宣言できる Dim name Dim age Dim level '格納するデータ型がバラバラでも,カンマで1行にまとめて宣言することもできる 'Dim name, age, level '変数の格納: =(イコール)を用いて値を格納する name = "もぐも" '文字列は "(ダブルクォーテーション) で囲む age = 28 level = 1 '変数の値をセルに表示する Range("A1").Value = name Range("A2").Value = age Range("A3").Value = level End Sub
データ型
公式文書:
データ型の概要 | Microsoft Docs
データ型の種類は以下の表のとおり。
データ型 | バイト数 | 値の範囲 |
Boolean | 2バイト | True/False |
Byte | 1バイト | 0 ~ 255 |
Collection | 不明 | 不明 |
Currency(通貨型) | 8バイト | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Date | 8バイト | 100 年 1 月 1 日 から 9999 年 12 月 31 日 |
Decimal | 14バイト | 公式サイト参照 |
Dictionary | 不明 | 不明 |
Double | 8バイト | ±double max ~ ±double min |
Integer | 2バイト | -32,768 ~ 32,767 |
Long | 4バイト | -2,147,483,648 ~ 2,147,483,647 |
LongLong | 8バイト | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
Object | 4バイト | 任意 |
Single | 4バイト | ±3.402823E+38 から ±-1.401298E-45 |
String(可変長) | 10バイト+文字列の長さ | 0~約 20 億 |
String(固定長) | 指定した文字列の長さ | 1 ~ 約 65,400 |
Variant(数値型) | 16バイト | 最大でDoubleの範囲までの任意の数値 |
Variant(文字列型) | 22 バイト + 文字列長 (64 ビット システムでは 24 バイト) | String(可変長)と同じ範囲 |
※ LongLong: 64ビットプラットフォームでのみ有効
※LongPtr,Typeは割愛した
数値型の場合,整数型はByte,Integer,Longがある。(64ビットではLongLongも利用可能)
浮動小数点の場合はSingle,Doubleがある。しかしこの2つのデータ型には有効桁数が決まっており計算を行えば桁落ちが発生したり,表現できない値が出てくる。正確な計算を強いられる場面ではCurrencyを用いると良い。
データ型を指定して変数を宣言
As を用いて変数のデータ型を指定できる。
Sub Test3() '変数の型を指定して宣言: As を用いる Dim name As String Dim age As Byte Dim level As Integer 'カンマで1行にまとめて宣言する場合 'Dim name As String, age As Byte, level As Integer End Sub
日付型
#で囲むか文字列として指定する
Dim x As Date x = "2020年10月12日" x = #2020年10月12日# x = #2020/10/12# x = #12/10/2020# x = #12:26:39 AM#
演算子
算術演算子
Sub Test() Dim x As Integer Dim y As Single x = 5 + 2 '足し算 = 7 x = 5 - 2 '引き算 = 3 x = 5 * 2 '掛け算 = 10 y = 5 / 2 '割り算 = 2.5 x = 5 \ 2 '割り算の商 = 2 x = 5 Mod 2 '割り算の余り = 1 x = 5 ^ 2 'べき乗 = 25 End Sub
比較演算子
結果はBoolean型で返ってくる。
C++やC#と違うのは等しい,等しくないの演算子の書き方。
Sub Test() Dim result As Boolean result = 8 < 5 'より小さい False result = 3 <= 5 '以下 True result = 8 > 5 'より大きい True result = 3 >= 8 '以上 False result = 3 = 8 '等しい False result = 3 <> 8 '等しくない True Range("A1").Value = 10 > 20 'セルA1にFALSEが表示される End Sub
論理演算子
Sub Test() Dim result As Boolean '論理積 And result = (3 < 5) And (2 < 5) '=True '論理和 Or result = (3 > 5) Or (2 > 5) '=Flase '論理否定 Not result = Not (3 < 5) '=False End Sub
文字の結合
& と +が使えるが,&のほうがケアレスミスが減るかも。
Sub Test() Dim hello As String Dim name As String Dim a As Integer Dim b As Integer hello = "こんにちは" name = "もぐも" a = 10 b = 12 Range("A1").Value = hello & name '=こんにちはもぐも Range("A2").Value = hello & a '=こんにちは10 Range("A3").Value = a & hello '=10こんにちは Range("A4").Value = a & b '=1012 Range("A5").Value = hello + name 'こんにちはもぐも 'Range("A6").Value = hello + a 'Error: 型が一致しません 'Range("A7").Value = a + hello 'Error: 型が一致しません Range("A8").Value = a + b '=22 End Sub
オブジェクト
- データ型の1つ
- ブックやシート,セルなどVBAで何か操作をしようとする対象となるもの
- 値の格納にはSetを先頭に書かなければならない
Sub Test() 'オブジェクト: VBAで何か操作しようとする対象となるもの 'オブジェクトの宣言 Dim app As Application 'アプリケーション Dim book As Workbook 'ブック Dim sheet As Worksheet 'シート Dim cell As Range 'セル Dim books As Workbooks '開いている全てのブック Dim sheets As Worksheets 'ブックに含まれる全てのワークシート '値を格納する: Setを使って格納すること Set cell = Range("A1") cell.Value = "cellにA1のセルを格納しました" 'オブジェクトのプロパティやメソッドは.(ドット)を用いて利用することが可能 cell.Value = "プロパティを変更" 'プロパティ値を変更 Dim test As String 'プロパティ値を取得 test = cell.Value cell.Delete 'メソッドを利用 End Sub
条件分岐
If と Select(C++やC#ではswitchに相当する) が使える。
Sub test() Dim cell As Range Set cell = Range("A1") '条件分岐①: If 条件式 Then ~ ElseIf 条件式 Then ~ Else ~ End If If (cell.Value = "") Then '空白なら cell.Value = "あ" ElseIf (cell.Value = "あ") Then cell.Value = "い" Else cell.Value = "う" End If '条件分岐②-1: Select Select Case cell.Value Case "" cell.Value = "あ" Case "あ" cell.Value = "い" Case Else cell.Value = "う" End Select '条件分岐②-2: 比較演算子の省略 Dim x As Integer x = 10 Select Case x Case Is > 20 cell.Value = "20より大きい" Case Is > 5 cell.Value = "5より大きい" Case Else cell.Value = "5以下の値です" End Select End Sub
繰り返し
Sub test() Dim sum As Integer '繰り返し①: Do While ... Loop Dim sum As Integer Dim x As Integer sum = 0 x = 1 Do While x <= 10 '条件式 xが10以下 がTrueなら繰り返す sum = sum + x x = x + 1 Loop '繰り返し②: Do Until ... Loop sum = 0 x = 1 Do Until x > 10 '条件式 xが10より大きい がFalseの場合は繰り返す sum = sum + x x = x + 1 Loop '繰り返し③: Do ... Loop While '処理を行った後に条件式の判定を行う。つまり必ず1度は繰り返し処理を行う。 sum = 0 x = 1 Do sum = sum + x x = x + 1 Loop While x <= 10 '条件式 xが10以下 がTrueなら繰り返す '繰り返し④: For a To b ~ Next sum = 0 For x = 1 To 10 sum = sum + x Next i Range("A1").Value = sum End Sub
配列
配列の宣言は
Dim 変数名(要素数-1) As データ型
と行う。
変数名(3 To 6)と宣言する方法もあるが,保守しやすいとは思わないので割愛する。
サンプル
Sub Test() '配列の宣言: 配列数10個 Dim collection(9) As Integer collection(0) = 1 collection(1) = 2 collection(2) = 3 collection(3) = 4 collection(4) = 5 collection(5) = 6 collection(6) = 7 collection(7) = 8 collection(8) = 9 collection(9) = 10 'collection(10) = 11 '要素数を超えたらエラーとなる Dim i As Integer For i = 0 To 9 Range("A1").Value = collection(i) Next i End Sub