目次
サーバレスアーキテクチャの構築を得意とする雑食系エンジニア
業務などでExcelを使用する際に、VBA (Visual Basic for Applications) が書けると便利ですね。簡単に使い方をまとめます。
開発準備 (2007の場合)
- エクセルファイルを新規作成
- スタートボタン
- Excelのオプション
- 基本設定
- [開発] タブをリボンに表示する
- OK
- 開発タブ
- VisualBasic
- IDEが起動
- プロジェクトエクスプローラで右クリック
- 挿入→標準モジュール
プログラムの基本構造
グローバル変数は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
条件分岐
If-Else
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
Case
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
ループ処理
For
"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
ForEach
"Exit For"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim myRange As Range
For Each myRange In Range("B2:D4") ' 矩形
myRange.value = "矩形"
Next myRange
End Sub
While
"Exit Do"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
i = 0
Do While i <> 5
MsgBox (i)
i = i+1
Loop
End Sub
Do-While
"Exit Do"でループを抜けられます。
Option Explicit
Sub MyMacro()
Dim i As Integer
i = 0
Do
MsgBox(i)
i = i+1
Loop While i <> 5
End Sub
Until
"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
既に定義されている便利な関数の紹介
Date
今日の日付を返します。
Option Explicit
Sub MyMacro()
MsgBox(Date)
End Sub
Time
現在時刻を返します。
Option Explicit
Sub MyMacro()
MsgBox(Time)
End Sub
Rnd
[0.0,1.0] の乱数を返します。
Option Explicit
Sub MyMacro()
MsgBox(Rnd)
End Sub
Len
文字列の長さを返します。
Option Explicit
Sub MyMacro()
MsgBox(Len("hello")) '5
MsgBox(Len("こんにちは")) '5
End Sub
Int
小数点以下を切り捨てた結果を返します。
Option Explicit
Sub MyMacro()
MsgBox(Int(2.5))
End Sub
UCase
大文字に変換した結果を返します。
Option Explicit
Sub MyMacro()
MsgBox(UCase("日本語部分は不変abcde"))
End Sub
ワークシート関数 (一般ユーザが使用するSUMなどの関数)
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
数式の入力
サンプル1
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
サンプル2
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
サンプル3
四則演算だけでなく、ワークシート関数を用いた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
その他
- 挿入した図形上で右クリックしマクロを登録することで、作成したマクロをクリック実行できるようになります
- エクセル起動時、画面左下のアイコンからマクロを記録できます
- マクロありの状態でファイルを保存するためには、「マクロ有効ブック (.xlsm)」を選択して保存します
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。