初心者でも大丈夫!エクセルVBAで覚えておきたいこと

自作ツール

この記事はこのような人に向けて書いています。

  • エクセルVBAを使い初めて間もない人
  • エクセルVBAをこれからバリバリ使いたい人

こんにちは。ゆー です。

皆さん、エクセルのVBA(Visual Basic for Applications)は使ったことがありますか?

VBAはプログラミングの中でも最も易しいと言われているので、プログラミングの入門として覚えるのにも最適です。

VBAを使えるとエクセルで行う様々な作業を自動化したり、VBAに対応したアプリをプログラムで操作できたりしますよ!

しかし、いざVBAを使ってみようとしても

ネットで検索したサンプルコードを見ても、書いてある意味が理解できない・・・。

本格的にVBAの勉強をしようと意気込んでみたものの、一週間も続かなかった・・・。

こんなことになりがちです。

今回の記事では、私の経験からエクセルVBAを活用するためにおさえておきたいポイントを紹介いたします。

VBAとは

VBAとはMicrosoftが提供するプログラミング言語の一種です。

Excel、Access、WordやPowerPointなどにも搭載されていますが、また、Microsoft製品以外でもVBAと連携する機能をもつアプリケーションは多数あります。

すなわちVBAを使えるようになるということは、色々なアプリケーションをプログラムによって操作することができるようになるということです。

エクセルやワードの業務を自動化することもできるし、Adobe Acrobatと連携させてPDFファイルを操作する事例などもあります。

VBEditorについて

エクセルVBAは基本的にVBEditorという編集ソフトでプログラムを作成します。

慣れると別のエディター(編集ソフト)を使ったりする人もいます。

しかし、初心者のうちは基本のVBEditorで勉強し、さらなるステップアップとして他のエディターに挑戦するのオススメします。

開発タブの表示~VBEditorの起動

VBEditorはエクセルの開発タブから起動できますが、初期状態では表示されていませんので最初に以下の設定を行います。

  1. エクセルを起動
  2. ファイル→オプション→リボンのユーザー設定
  3. 右側ペインの “メインタブ” というセクションで、“開発ツール” にチェックして”OK”
  4. 開発タブが表示されているのを確認する
  5. Visual Basicをクリック
  6. VBEditorが起動します

ちなみに「Alt + F11」でもVBEditorを起動することができます。

オススメの設定

VBEditorは初期状態だと使いにくいので設定を変えましょう。

私のオススメ設定を紹介します。

  1. ツール→オプション でオプション画面を起動する
  2. 編集タブの”変数の宣言を強制する”にチェック
  3. “エディターの設定”タブで文字色を以下のように変更
    種類 前景 背景
    標準コード 黄色
    コメント
    キーワード 水色
    識別子
  4. 編集→イミディエイトウィンドウ でイミディエイトウィンドウを表示する

 

各ウィンドウの名称と役割

各ウィンドウの名称と役割を確認しておきましょう。

こういった用語を知っておけば、困ったときにも検索がしやすくなります。

名称 役割
プロジェクトエクスプローラー モジュールの構成を表示する。

新しいモジュールの追加なども行える。

コードウィンドウ コード(プログラムの文章)を記入する
プロパティウィンドウ モジュールの名称などを変更する
イミディエイトウィンドウ プログラム実行中の変数の値などを表示する。

VBAプロジェクト/モジュール/プロシージャ

エクセルVBAはVBAプロジェクトの下位にモジュール、さらにプロシージャという階層構造になっています。

どのモジュールのプロシージャにコードを作成するのかによって、挙動が変わったり、記載方法を変える必要が出たりしますので、まずは構造を把握しておきましょう。

VBAプロジェクト

VBAプロジェクトとはVBAにより作成されるプログラムの最も大きなかたまりです。

実質的にはVBAが記述されているエクセルファイル=一つのVBAプロジェクトと考えてOKです。

初心者のうちは特に意識する必要はありませんが、高度なプログラムではVBAプロジェクトから別のVBAプロジェクトを参照することもあるため、重要な概念です。

モジュール

モジュールはVBAプロジェクトの中でコードを作成する場所です。

用途に応じて、コードを作成する場所に向き不向きがあります。

基本的には標準モジュールにコードを作成すると覚えておきましょう。

プロシージャ

プロシージャとはプログラムを実行する最小単位です。

Sub プロシージャ、Function プロシージャ、Property プロシージャという3種のプロシージャがありますが、Property プロシージャは高度なプログラミングで使用するので、説明を省略します。


Subプロシージャの記入例

Sub プロシージャ名()
    '処理内容
End Sub

Functionプロシージャの記入例

Function プロシージャ名()
    '処理内容
End Function

Sub プロシージャ名() ~ End Sub が一つのSubプロシージャ、Functionプロシージャ名() ~ End Functionが一つのFunctionプロシージャです。

2つのプロシージャの違いは値を返すか返さないかによります。

プロシージャ

例えば下記のプログラムを見てみましょう。

' Subプロシージャの例
Sub ShowMessage()
    MsgBox "Hello, this is a Sub procedure!"
End Sub

' Functionプロシージャの例
Function AddNumbers(number1 As Double, number2 As Double) As Double
    ' 2つの数値を足し合わせて結果を返す
    AddNumbers = number1 + number2
End Function

' メインプロシージャ
Sub Main()
    ' Subプロシージャの呼び出し
    Call ShowMessage
    
    ' Functionプロシージャの呼び出しと結果の表示
    Dim result As Double
    result = AddNumbers(5.5, 3.2)
    MsgBox "The sum is: " & result
End Sub

ShowMessageプロシージャはメッセージを表示するだけですが、AddNumbersプロシージャは引数として与えられた5.5と3.2の合計値を返しています。

VBAの構成要素

VBAコードはステートメント、関数、オブジェクトのプロパティ/メソッド、変数や定数などで構成されています。

何がステートメントで何がプロパティなのか、最初のうちは厳密に区別できなくても、それぞれの使い方がわかっていれば大丈夫です。

以下に一つずつ説明していきましょう。

ステートメント

プログラム内で特定の動作を実行する命令や文がステートメントです。

ステートメントの例

  • Sub: Subプロシージャを宣言するステートメント
  • Dim: 変数の宣言を行うためのステートメント。変数に値を格納するには”=”を使う。
  • If: 条件分岐(もしも〇〇の場合✕✕する)を行うためのステートメント

これらのステートメントを使用した例が以下になります。

Sub StatementExample()
    ' 変数xの値を設定
    Dim x As Integer
    x = 4
    
    ' Ifステートメントを使用して条件分岐
    If x > 5 Then
        ' 条件が真の場合の処理
        MsgBox "変数xは5より大きいです。"
    ElseIf x = 5 Then
        ' この条件が真の場合の処理
        MsgBox "変数xは5です。"
    Else
        ' 条件が偽の場合の処理
        MsgBox "変数xは5より小さいです。"
    End If
    
End Sub

関数(VBA関数、ワークシート関数、Functionプロシージャ)

関数とは「引数を受け取り」「処理を行い」「戻り値を返す」文言です。

VBAで使う関数は以下の3つがあります。

Functionプロシージャはプロシージャの項で説明しましたが、関数の一種でもあります。関数プロシージャとも言い、いわば自分で作ることのできる関数です。

ワークシート関数はWorksheetFunction オブジェクトのメソッドなので次の項で説明します。

この項ではVBA関数について、具体例を挙げて説明します。

VBA関数の例

  • Left: 文字列の左から数えて指定した数の文字を返す関数。
  • Date: 現在の日付を返す関数。

VBA関数はVBAのプログラム内で直接呼び出して使用できる関数です。

Left関数は引数として文字列と整数を受け取り、文字列の左から指定された数だけ文字を抜き出し、抜き出した文字列を返します。

また、Date関数のように見かけ上は引数を受け取らずに戻り値を返す関数もあります。

Sub VBAFunctionExample()
    ' Left関数を使って文字列から最初の5文字を取得
    Dim originalString As String
    Dim leftResult As String
    
    originalString = "Hello, World!"
    leftResult = Left(originalString, 5)
    
    ' 結果を表示
    MsgBox "Left関数の結果: " & leftResult

    ' Date関数を使って現在の日付を取得
    Dim currentDate As Date
    currentDate = Date
    
    ' 結果を表示
    MsgBox "現在の日付: " & currentDate
End Sub

オブジェクトのメソッド/プロパティ

エクセルVBAはエクセルの機能を操作することができます。

また、冒頭でも述べた通り、その他のアプリケーションも操作することができます。

そのようなVBA以外のプログラムを操作するためにアクセスするのがオブジェクトです。

例えばエクセルに備わっているオブジェクトには以下が挙げられます。

エクセルのオブジェクトの例

  • Worksheet オブジェクト: エクセルのワークシートを表すオブジェクト。シート上のセルやデータへのアクセスができる。
  • WorksheetFunction オブジェクト:  エクセルの関数が格納されているオブジェクト。
  • Range オブジェクト: セルやセルの範囲を表すオブジェクト。データの読み取りや書き込み、セルのフォーマットの変更など、セルに関する操作に使用する。

メソッド

メソッドは、オブジェクトが実行できるアクションや操作です。

例えばセルのコピーや貼り付けはRange オブジェクトのメソッドで実行できます。

Range オブジェクトのメソッド例

Sub CopyAndPasteSpecial()
    ' セルA1の値をコピーする
    Range("A1").Copy

    ' セルB1に数式を貼り付ける
    Range("B1").PasteSpecial Paste:=xlPasteFormulas

    ' セルC1に値を貼り付ける
    Range("C1").PasteSpecial Paste:=xlPasteValues

    ' メッセージボックスで結果を表示
    MsgBox "セルA1の値をB1に数式として貼り付けました。" & vbCrLf & _
        "セルA1の値をC1に値として貼り付けました。"
End Sub

また、前の段落で述べたワークシート関数はWorksheetFunction オブジェクトのメソッドです。

ワークシート関数はエクセルでセルに入力して使う関数、例えばSUM関数やAVERAGE関数です。

ワークシート関数はVBAでも呼び出して使用することができます。

WorksheetFunction オブジェクトのメソッド(ワークシート関数)の例

Sub SumAvgExample()

    ' セル範囲 A1:A10 の値の合計を計算し、メッセージボックスで表示
    Dim total As Double
    total = WorksheetFunction.Sum(Range("A1:A10"))
    MsgBox "合計値は: " & total

    ' セル範囲 B1:B10 の値の平均を計算し、メッセージボックスで表示
    Dim avg As Double
    avg = WorksheetFunction.Average(Range("B1:B10"))
    MsgBox "平均値は: " & avg

End Sub

プロパティ

プロパティは、オブジェクトの特定の属性や設定値のことです。

例えばRange オブジェクトの場合、フォントの色やセルの値などがプロパティです。

プロパティは変更できるものとできないものがあります。

変更できるものはプロパティに値を格納することで変更します。

プロパティの例

  • Range.Value: セルや範囲の値を取得または設定する。
  • Range.Font: セル内のテキストのフォント関連の設定を取得または設定する。
  • Range.Formula: セルに設定された数式を取得または設定する。
Sub SetPropertyExample()
    ' セルA1に値を設定する
    Range("A1").value = "Hello, Excel!"

    ' セルA1のフォントの色を変更する
    Range("A1").Font.Color = RGB(255, 0, 0) ' 赤色
    
    Dim Str As String
    Str = "=A1  from VBA"

    ' セルB1に数式を設定する
    Range("B1").Formula = "=A1 & A7"

    ' メッセージボックスで結果を表示
    MsgBox "セルA1の値: " & Range("A1").value & _
           "  セルA1のフォント色: " & Range("A1").Font.Color & _
           "  セルB1の数式: " & Range("B1").Formula
End Sub

変数/定数

変数と定数はプログラムでデータを格納し、操作するための要素です。

変「数」、定「数」と言われますが、格納されるデータは数以外にも文字列だったり、日付だったりすることもあります。

変数

変数にはプログラムの状況に応じて好きな値を格納することができます。

変数はDimステートメントで宣言し、”=”で値を格納します

Sub VariableValue_1()

    Dim num As Long
    num = 10
    MsgBox "変数に格納した値: " & num

End Sub

値の格納に”=”記号を使っていますが、これは数学的の等号記号とは違って左辺と右辺が等しいという意味ではなく、あくまで左辺に値を入れるという意味です

例えば以下のように書くことも可能です。

Sub VariableValue_2()

    Dim num As Long
    
    num = 10
    MsgBox "変数に格納した値: " & num
    
    num = 20 + 30
    MsgBox "変数に格納した値: " & num
    
    num = num + 5
    MsgBox "変数に格納した値: " & num

End Sub

変数の型

変数の型はたくさんの種類がありますが、まずは以下の型があることをおさえておけばよいでしょう。

型名 データ型 値値
Integer 整数 -32,768 ~ 32,767 の整数
Long 長整数 -2,147,483,648 ~ 2,147,483,647 の整数
Double 小数 負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:4.94065645841247E-324 ~ 1.79769313486232E308
String 文字列 “文字列”
可変長:最大で約 20 億 (2^31) 文字
固定長:1 ~ 約 64 K (2^16) の文字
Date 日付 西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻
Boolean ブール True または False
Object オブジェクト 他のアプリケーションから提供されるデータや機能など
Variant バリアント すべて

詳しく知りたい方はMicrosoftのVBAリファレンス等をご確認ください。

配列変数

変数の中でも特に、複数のデータを一つの変数に格納できる配列変数というものがあります。

例えば、10から50までの10の倍数の数値を格納する変数があるとしましょう。

通常の変数では、以下のように1つずつ変数を用意する必要があります。

Dim num1 As Integer
Dim num2 As Integer
Dim num3 As Integer
Dim num4 As Integer
Dim num5 As Integer

num1 = 10
num2 = 20
num3 = 30
num4 = 40
num5 = 50

しかし、配列を使うと、これをもっと効率的に記述できます。

Dim num(1 To 5) As Integer

num(1) = 10
num(2) = 20
num(3) = 30
num(4) = 40
num(5) = 50

定数

定数はプログラム内で変更されない値を表します。

定数はConstステートメントで宣言します。

例えば円周率や税率など、一度定義したら変更することのない値は定数にしておくことで違う値を格納することを防ぎます。

下の例ではPIという定数に3.14159という値を格納した後に、3という値に書き換えようとしてもエラーになる例です。

Sub ConstantValue()

    Const PI As Double = 3.14159
    MsgBox "定数の値: " & PI

'    PI = 3 'これはエラーになる
    
End Sub

定数には円周率や税率など、一度定義したら変更することのないデータを格納するのに便利です。

コメント

コメントとはプログラム内で実行されない文字列です。

他の開発者や自分自身に対して、コードの理解や保守を容易にするために用いられます。

文頭に「’」をつけるとその文章はコメントになります。

例えば、変数や定数の目的を説明したり…

 
' シートの合計行数 
Dim totalRows As Integer 

' 初期化処理 
totalRows = WorksheetFunction.CountA(Sheets("Sheet1").Columns(1)) 

注意事項を残しておいたり…

' 注意: この処理はデータの検証を行っていないため、
' 不正なデータが存在する場合には予期せぬ結果が発生する可能性があります。

コードの変更履歴を残すなど…

' v1.0 - 初版
' v1.1 - バグ修正
' v2.0 - 新機能の追加

さまざまな目的でコメントを記入します。

 

たくさん述べてしまいましたが、一度に全部を覚える必要があるわけではありません。

試行錯誤しながらまた見返せば良いのです。

自分でVBAプログラムを作成する際に思い返して、「このコードにはこういう意味があるんだな」と納得しながら学習していくことが上達の近道です!

ゆー

この記事を書いた人

ゆー

console.log("postID: 14344");console.log("カウント: 1371");