こんにちは。もぐもです。
VBAを基礎から見直す機会があったので投稿します。
基本の文法
プロシージャ
関数のこと。
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 name
Dim age
Dim 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()
Dim name As String
Dim age As Byte
Dim 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
x = 5 - 2
x = 5 * 2
y = 5 / 2
x = 5 \ 2
x = 5 Mod 2
x = 5 ^ 2
End Sub
結果はBoolean型で返ってくる。
C++やC#と違うのは等しい,等しくないの演算子の書き方。
Sub Test()
Dim result As Boolean
result = 8 < 5
result = 3 <= 5
result = 8 > 5
result = 3 >= 8
result = 3 = 8
result = 3 <> 8
Range("A1").Value = 10 > 20
End Sub
Sub Test()
Dim result As Boolean
result = (3 < 5) And (2 < 5)
result = (3 > 5) Or (2 > 5)
result = Not (3 < 5)
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
Range("A3").Value = a & hello
Range("A4").Value = a & b
Range("A5").Value = hello + name
Range("A8").Value = a + b
End Sub
オブジェクト
- データ型の1つ
- ブックやシート,セルなどVBAで何か操作をしようとする対象となるもの
- 値の格納にはSetを先頭に書かなければならない
Sub Test()
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 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 (cell.Value = "") Then
cell.Value = "あ"
ElseIf (cell.Value = "あ") Then
cell.Value = "い"
Else
cell.Value = "う"
End If
Select Case cell.Value
Case ""
cell.Value = "あ"
Case "あ"
cell.Value = "い"
Case Else
cell.Value = "う"
End Select
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
Dim sum As Integer
Dim x As Integer
sum = 0
x = 1
Do While x <= 10
sum = sum + x
x = x + 1
Loop
sum = 0
x = 1
Do Until x > 10
sum = sum + x
x = x + 1
Loop
sum = 0
x = 1
Do
sum = sum + x
x = x + 1
Loop While x <= 10
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()
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
Dim i As Integer
For i = 0 To 9
Range("A1").Value = collection(i)
Next i
End Sub