サイトについて      連絡先   検索

VBA 入門

はじめに

Excel VBA の実行方法や構文などについてまとめて紹介します。

バージョン 2010 以降に対応しています。・2007 へ2003 へ

VBA を開発する手順や開発環境については「使い方」をご覧ください。

マクロの記録

VBA のコードを編集しないでマクロを実行するには、「マクロの記録」を使用します。

開発タブをクリックして [マクロの記録] をクリックします。

6

マクロ名などを必要があれば変更し [OK] をクリックします。

7

マクロの記録が開始されたので Excel を操作します。ここではセルに文字列と数値を入力します。

8

マクロの記録を終了するときは、[記録終了] をクリックします。

9

VBA コードの作成

VBE のプロジェクト ウィンドウからコードを書きたいファイルをダブルクリックします。

32

Sub で作成された関数を実行できます。

Sub TestSub()
    
End Sub

Public Sub TestSub2

End Sub

VBA・マクロの実行

Excel から実行する

開発タブをクリックして [マクロ] をクリックします。

12

VBE から実行する

編集しているコードのキャレットがある位置の関数が実行されます。次の画像では TipsA 関数にキャレットがあるのでこの関数が実行されます。

33

関数以外にキャレットがあるときは、次のマクロの選択画面が表示されます。

マクロの選択

上記の方法を行うと、実行したいマクロを選択する画面が表示されます。

マクロ名から実行したいマクロをクリックして [実行] をクリックします。

15

Excel から実行したときは、選択中のシートに対して実行されます。

VBE から実行したときは、シートに書いたコードはそのシートに対して実行されます。標準モジュールに書いたコードや記録したマクロは Excel で選択中のシートに対して実行されます。

ボタンから実行する

開発タブをクリックして [挿入] をクリックし ActiveX コントロールの [コマンド ボタン] をクリックします。

40

ドラッグしてボタンを貼り付けます。

41

ボタンをダブルクリックします。ここに記載したコードが実行されます。

42

ツールバーの [デザイン モードの終了] をクリックします。

43

ボタンをクリックして実行します。

44

コンパイル

VBA コード全体の構文チェックを行います。一度コンパイルすると、コードを編集するまでコンパイルできません。

VBE の「デバッグ」をクリックして [VBAProject のコンパイル] をクリックします。

16

関数の作成

戻り値がない関数

Sub 関数名()
    
End Sub

戻り値を返す関数:関数名に入れた値が戻り値になります。

Function 関数名() As String
    関数名 = "これが戻り値"
End Function

コメント

' を付けた後ろがコメントになります。

Sub Tips()
    ' コメントです。
    Dim found As String ' ここからコメントです。
End Sub

変数の宣言

変数の宣言と初期化は一行にできません。

Dim 変数名 As String
変数名 = "Tips"

Object 型の代入には Set を付けます。Range などのクラスが Object 型です。

Dim 変数名 As Object
Set 変数名 = Range("A1")

定数

Const 定数名 As Integer = 100

スコープ

関数や変数を参照可能な範囲です。Public、Private、Dim があります。

' 全てのシートや標準モジュールから参照可能
Public found1 As String

' このコードを記載しているシートや標準モジュール内で参照可能
Private found2 As String

' スコープを省略した関数は Public になります。
Sub Tips 
    ' Tips 関数内でのみ参照可能
    Dim found3 As String

    ' Sheet1 の変数 Public found1 As String を他のシートなどから参照するには
    found3 = Sheet1.found1
    
    ' 標準モジュール の変数 Public found1 As String を他のシートなどから参照するには
    found3 = found1
End Sub

配列

静的配列

宣言後に配列の要素数を変更できません。

' 静的(0 ~ 3) の 4 つの要素数を持ちます。
Dim 静的(3) As Integer

' 静的(1 ~ 3) の 3 つの要素数を持ちます。
Dim 静的(1 To 3) As Integer

動的配列

宣言後に配列の要素数を変更できます。

' まだ要素数はありません。
Dim 動的() As Integer

' 他の配列を変数にいれられます。
Dim tips(3) As Integer
動的 = tips

' 配列の要素数を変更
Redim Preserve 動的(3) ' Dim tips(3) As Integer と要素数が同じになります。

配列操作

Dim tips(3) As Integer
Dim i As Integer
i = UBound(tips) ' 配列の最大インデックスを返します。 i = 3
i = LBound(tips) ' 配列の最小インデックスを返します。 i = 0

' UBound などはループの値に使用できます。
For i = LBound(tips) To UBound(tips)
    ' i の値が 0 ~ 3 まで変化します。
Next

データ型

型名 データ型 値の例や範囲
String文字列型"文字列"
Booleanブール型True または False
Byteバイト型0 ~ 255 の正の整数
Integer整数型-32,768 ~ 32,767 の整数
Long長整数型-2,147,483,648 ~ 2,147,483,647 の整数
Single単精度浮動小数点型負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:1.401298E-45 ~ 3.402823E38
Double倍精度浮動小数点型負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:4.94065645841247E-324 ~ 1.79769313486232E308
Currency通貨型-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Date日付型西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻
Objectオブジェクト型オブジェクト参照するデータ型 (Range やクラスなど)
Variantバリアント型なんでも (多様は禁物)
Typeユーザー定義型Type で定義した型、いわゆる構造体

演算子

算術演算子

演算子 演算名 使用例 結果
+足し算1 + 23
-引き算2 - 11
*掛け算2 * 36
/割り算7 / 23.5
\割り算の商7 \ 23
Mod割り算の余り7 Mod 21
^べき乗2 ^ 38
&文字結合"Tips" & "found""Tipsfound"

比較演算子

演算子 演算名 使用例 結果
=等しい1 = 2False
<>等しくない1 <> 2True
>大きい1 > 2False
<小さい1 < 2True
>=以上1 >= 2False
<=以下1 <= 2True

論理演算子

演算子 演算名 使用例 結果
And論理積True And FalseFalse
Or論理和True Or FalseTrue
Not論理否定Not True Or FalseFalse
Xor排他的論理和True Xor FalseTrue

For 文

For To

配列にインデックスを使用して参照するときなどに使用します。

Dim i As Integer
Dim list(3) As Integer
For i = 0 To 3
    ' i の値が 0 ~ 3 まで変化します。
    list(i) = 10
Next

For Each

コレクションの要素を全て参照できます。

Dim cell As Object
For Each cell In Range("A1", "A3")
    ' セル A1 ~ A3 に "A" を設定します。
    cell.Value = "A"
Next

If 文

条件が一致したときに If の中のコードが実行されます。

Dim i As Integer
If i = 0 Then
    ' ここが実行されます。
End If

条件が一致しないときは Else の中のコードが実行されます。

Dim i As Integer
If i = 1 Then
    ' 実行されません。
Else
    ' ここが実行されます。
End If

複数の条件があるときは ElseIf を使用します。ElseIf はいくらでも追加できます。

Dim i As Integer
If i = 1 Then
    ' 実行されません。
ElseIf i = 2 Then
    ' 実行されません。
ElseIf i = 0 Then
    ' ここが実行されます。
Else
    ' 実行されません。
End If

Select 文

条件が複数あるときは Select 文を使用すると可読性があがります。

Dim i As Integer
Select Case i
    Case 1
        ' 実行されません。
    Case 0
        ' ここが実行されます。
    Case Else
        ' 実行されません。
End Select

With 文

同じオブジェクトを何度も参照するときは With 文を使用してオブジェクト名を省略できます。

コードの高速化も少しだけ期待できます。

' 通常のコード
Dim cell As Range
Set cell = Range("A1")
cell.Value = "あ"
cell.Font.Color = RGB(255, 0, 0)
cell.Interior.Color = RGB(255, 255, 0)

' With を使ったコード
Dim cell As Range
Set cell = Range("A1")
With cell
    .Value = "あ"
    .Font.Color = RGB(255, 0, 0)
    .Interior.Color = RGB(255, 255, 0)
End With

イベント

プロジェクト ウィンドウからイベントを取得したいシートまたは ThisWorkbook をダブルクリックします。

17

(General) をクリックして [Worksheet] をクリックします。

18

(Declarations) をクリックして取得したいイベントを選択します。

19

イベントが発生したときに作成されたコードが実行されます。

20

構造体

関連する値をまとめるときに使用します。

' 宣言  コードの上に記載します。
Private Type Size
    Width As Integer
    Height As Integer
End Type

Sub Tips
    ' 初期化
    Dim s As Size
    s.Width = 100
    s.Height = 200
End Sub

クラス

関連する値をまとめて、その値を使用した関数が必要なときに使用します。

クラスの追加

VBE の「挿入」をクリックして [クラス モジュール] をクリックします。

23

クラスが追加されます。

24

定義

フィールド変数や関数を作成できます。

Public FirstName As String
Public LastName As String

Public Function MyName() As String
    MyName = FirstName & LastName
End Function

使用例

クラスを使用するには必ず New を使用してインスタンス化する必要があります。クラスは Object 型なので代入には Set を使用します。

Sub Tips
    ' インスタンス化
    Dim c As クラス名
    Set c = New クラス名

    ' 初期化
    c.FirstName = "Tips"
    c.LastName = "found"

    ' 関数の呼び出し
    Dim userName As String
    userName = c.MyName 
    Debug.Print(userName) ' "Tipsfound"
End Sub

標準モジュール

標準モジュールに書いたコードは他の標準モジュールやシートから参照できます。同じ関数を使いまわしたいときに、標準モジュールを使用します。

標準モジュールの追加

VBE の「挿入」をクリックして [標準モジュール] をクリックします。

21

標準モジュールが追加されます。

22

コードの参照

' Public で宣言したものは他の標準モジュールやシートから参照できます。
Public Tips As String

Public Sub Found
    
End Sub

エラー処理

On Error Resume Next

エラーの発生を無視して処理を続行します。

Sub Tips
On Error Resume Next

    Dim list(2) As Integer
    Dim num As Integer
    
    num = list(3) ' インデックスエラーが発生する

    Debug.Print (num) ' ここからの処理も行われる num の値は 0 のまま変化なし
End Sub

On Error Go To

エラーが発生したときに指定の行ラベルへ移動します。

行ラベルは ラベル名: のように : を後ろに付けます。

Sub Tips
On Error GoTo Cacth ' エラーが発生したら Cacth へ移動する

    Dim list(2) As Integer
    Dim num As Integer

    num = list(3) ' インデックスエラーが発生する

    Debug.Print (num) ' ここからの処理は実行されない
    Exit Sub ' エラーが発生ないとき Cacth 以降の処理を行わないように、ここで処理を抜ける

Cacth: ' エラーが発生したらここから処理を続行する
    Err.Description ' ここでエラー処理を行う
End Sub

ヘルプ

インストール

Excel をインストール時にヘルプもインストールされています。

ヘルプの表示

わからないキーワードがあればそこをクリックして F1 キーを入力します。

30

そのキーワードのヘルプが表示されます。

31

関連ページ