業務などでExcelを使用する際に、VBA (Visual Basic for Applications) が書けると便利ですね。簡単に使い方をまとめます。
グローバル変数はSubプロシージャ内からでも参照可能です。
Option Explicit ' DimまたはConstステートメントでしか変数/定数を宣言できなくする
' perlにおける"use strict"のようなもの
Dim globalVar As Integer ' グローバル変数の使用が可能 (既定値の指定はできません)
Const GLOBAL_CONST As Integer = 1024 ' 定数も使用可能
Sub MyMacro1()
' 何らかの処理
MsgBox(globalVar)
End Sub
Sub MyMacro2()
' 何らかの処理
MsgBox(GLOBAL_CONST)
End Sub
Option Explicit
Sub MyMacro()
Dim var As Integer ' 既定値の指定はできません
var = InputBox("好きな数値を入力してください")
If (-10 <= var And var < 0) Or (0 < var And var <= 10) Then
MsgBox ("[-10,0), (0,10]")
ElseIf var = 0 Then ' == ではなくて = です
MsgBox ("[0,0]")
ElseIf var mod 2 <> 0 Then ' != ではなくて <> です
MsgBox ("(-inf,-10), (10,inf) の奇数")
Else
MsgBox ("(-inf,-10), (10,inf) の偶数")
End If
End Sub
Option Explicit
Sub MyMacro()
Dim var As Integer ' 既定値の指定はできません
var = InputBox("好きな数値を入力してください")
Select Case var
Case 2
MsgBox("2")
Case 3, 4
MsgBox("3 or 4")
Case 5 To 15
MsgBox("5-15")
Case Is <= 1
MsgBox("less than or equal to 1")
Case Else
MsgBox("more than or equal to 15")
End Select
End Sub
"Exit For"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
For i = 0 To 5
MsgBox ("for1: " & i)
Next i
For i = 0 To 5 Step 2
MsgBox ("for2: " & i)
Next i
For i = 5 To 0 Step -2
MsgBox ("for3: " & i)
Next i
End Sub
"Exit For"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim myRange As Range
For Each myRange In Range("B2:D4") ' 矩形
myRange.value = "矩形"
Next myRange
End Sub
"Exit Do"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
i = 0
Do While i <> 5
MsgBox (i)
i = i+1
Loop
End Sub
"Exit Do"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
i = 0
Do
MsgBox(i)
i = i+1
Loop While i <> 5
End Sub
"Exit Do"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
i = 0
Do Until i = 5
MsgBox(i)
i = i+1
Loop
End Sub
Option Explicit
Function MyFunc1()
MsgBox("hi")
End Function
Function MyFunc2(a As Integer, b As Integer) As Integer
MyFunc2 = a + b ' 戻り値の指定方法
End Function
Sub MyMacro()
MyFunc1 ' MyFunc1() とするとエラー。()は不要
MsgBox(MyFunc2(1,2))
End Sub
Option Explicit
Sub MyMacro()
Dim intVal As Integer, intVal2 As Integer
Dim longVal As Long
Dim doubleVal As Double
Dim strVal As String
Dim dateVal As Date
Dim obj As Object 'オブジェクトへの*参照*を格納。
'なお、Object型は特殊であり代入にはSetを用いる必要がある (Set obj = 値)
Dim boolVal As Boolean
Dim byteVal As Byte
longval = 2^20 '1048576 (累乗)
doubleVal = 5/2 '2.5 (商)
intVal = 5\2 '2 (整数商)
intVal2 = 5 mod 2 '1 (余剰)
strVal = 1 & ": こんにちは、" & "世界" ' 1: こんにちは、世界 (文字列結合)
End Sub
今日の日付を返します。
Option Explicit
Sub MyMacro()
MsgBox(Date)
End Sub
現在時刻を返します。
Option Explicit
Sub MyMacro()
MsgBox(Time)
End Sub
[0.0,1.0] の乱数を返します。
Option Explicit
Sub MyMacro()
MsgBox(Rnd)
End Sub
文字列の長さを返します。
Option Explicit
Sub MyMacro()
MsgBox(Len("hello")) '5
MsgBox(Len("こんにちは")) '5
End Sub
小数点以下を切り捨てた結果を返します。
Option Explicit
Sub MyMacro()
MsgBox(Int(2.5))
End Sub
大文字に変換した結果を返します。
Option Explicit
Sub MyMacro()
MsgBox(UCase("日本語部分は不変abcde"))
End Sub
WorksheetFuncitonのメソッドを参照します。引数にはRangeオブジェクトを指定します。
Option Explicit
Sub MyMacro()
Dim i As Integer
For i = 1 To 10
Cells(i,1).Value = i
Next i
MsgBox(WorksheetFunction.Sum(Range("A1:A10"))) '10*11/2=55
End Sub
Option Explicit
Sub MyMacro()
Cells(1,1).Font.Color = vbBlue 'A1の文字色を変更 (行,列)
Range("B2").Cells(2,2).Font.Color = vbRed 'C3の文字色を変更 (行,列) (B2を基点として考える)
Range("B2").Offset(1,1).Font.Color = vbRed 'C3の文字色を変更 (行,列) (B2を基点として考える) (Cellsと異なり(0,0)は自分自身)
Range("B2").Offset(-1,-1).Font.Color = vbRed 'A1の文字色を変更 (行,列)
Range("A1").ClearContents 'RangeのままでももちろんOK (ClearContents: 設定されている値を削除する)
End Sub
With構文を用いると、異なる複数の操作を同じ対象に対して行う場合の記述がシンプルになります。
Option Explicit
Sub MyMacro()
With Range("A1")
.Value = 777
.Font.Color = vbRed
End With
End Sub
Option Explicit
Sub MyMacro()
Dim arr(5) As Integer
Dim i As Integer
For i=1 To 5
arr(i) = i*i
Next i
For i=1 To 5
MsgBox(arr(i))
Next i
End Sub
Option Explicit
Sub MyMacro()
Worksheets(1).Cells(1,1).Value = 1 '最初のシートのセルA1
Worksheets(1).Cells(1,2).Value = 10
End Sub
Option Explicit
Sub MyMacro()
Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = "コピー生成されたシート"
End Sub
Option Explicit
Sub MyMacro()
Cells(1,1).Value = 1
Cells(1,2).Value = 10
Cells(1,3).Formula = "=A" & 1 & "+B" & 1 'C1には計算結果として11が表示される
End Sub
Rangeで複数セルに対してFormulaを指定するとオートフィルのような結果が得られます。
Option Explicit
Sub MyMacro()
Cells(1,1).Value = 1
Cells(1,2).Value = 10
Range("D1:D10").Formula = "=A" & 1 & "+B" & 1 'オートフィルのようなもの
End Sub
四則演算だけでなく、ワークシート関数を用いたFormulaを指定することもできます。下記サンプルにもありますように、VBAではダブルクォーテーション1つと2つは別物であることに注意してください。他の言語ではダブルクォーテーションをエスケープするところですが、VBAではクアッドクォーテーション (?) のような記述をします。
Option Explicit
Sub MyMacro()
Cells(1,1).Value = 1
Cells(2,1).Formula = "=IF(A1 = 1, ""Yes"", ""No"")"
End Sub