ExcelVBA入門
[履歴] [最終更新] (2013/09/16 09:44:19)
最近の投稿
注目の記事

概要

業務などでExcelを使用する際に、VBA (Visual Basic for Applications) が書けると便利ですね。簡単に使い方をまとめます。

開発準備 (2007の場合)

  1. エクセルファイルを新規作成
  2. スタートボタン
  3. Excelのオプション
  4. 基本設定
  5. [開発] タブをリボンに表示する
  6. OK
  7. 開発タブ
  8. VisualBasic
  9. IDEが起動
  10. プロジェクトエクスプローラで右クリック
  11. 挿入→標準モジュール

プログラムの基本構造

グローバル変数は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)」を選択して保存します
関連ページ
    概要 どうしてもエクセルを自動作成しなければならない場合、VBAを書いてもいいのですがRubyでも簡単なものであれば対応可能です。 使用するライブラリ 「axlsx」というGEMパッケージを使用します。以下のコマンドでインストールしておいてください。 gem install axlsx ドキュメント https://github.com/randym/axlsx/blob/maste