ワークシートを変数化する3つの手法 オブジェクト変数など

vbasheetvariableeyecatch

エクセルVBAでシートの変数化を行う方法にはいくつかの手法があります。
重要な3つの手法について説明を行います。オブジェクト変数、インデックス番号、シート名を使用します

こんにちは じゅんぱ店長 (@junpa33) です。

ワークシートを跨いでVBAプログラムを動作させる時、どのシートに対して編集・変更をするのかを指定しなければいけません。

固定の決まったシートに対しての変更ではなく、その都度、利用状況に合わせてシートが変わる時は、その時々に合わせたシート指定が必要です。

そのためには、ワークシートを変数化させて、その時々に合わせたシート指定を行うことが必要です。

ここでは、シートを変数化させるための3つの方法を説明します。

ワークシートを変数化させる3つの手法

vbasheetvariablep012

ワークシートを変数化させてVBAコードを作りたい(作らないといけない)場合が結構な頻度で出てきます。頻出の英単語なみです。

一番頻繁には、

VBA記述時に、 ” どのシートのセルを扱うのか? ” 「Worksheets(“Sheet1”).Range(“A1”)」の時の「Worksheets(“Sheet1”)」の部分を簡潔に記述するための方法

たとえば Set ws = Worksheets(“Sheet1”) ということで

Sheet1という名前のシートオブジェクトをwsという文字(オブジェクト変数)に置き換えます

With~End With という記述法もありますが、基本、入力キーを叩く回数が多くなり面倒に感じることも・・・

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する

この記事で説明する内容については、例えばこのような作成の要求への対策についてです。

  •  ワークシートを自動で生成させ、シート名を特定ルールで自動名付けしていて、生成されたシート名を知らないまま、そのシートを掴みたい(選択したい)場合 
  •  すべてのシート名を把握しないまま、必要なシート名だけを残してそれ以外を1枚づつ削除したい場合 
  •  その都度、任意のシート名でシートを作成し、同時にそのシートにデータを書き込んでいきたい場合 

これらは、日常の業務で普通にあるエクセル作業です。

けれども、これをVBAでマクロ化するには、「シートの変数化」というコード作成が必要になります。

ということで、今回はシートを変数化させる代表的な3つの手法を紹介していきます。

オブジェクト変数による変数化

インデックス番号による変数化

シート名による変数化

オブジェクト変数による変数化

オブジェクト変数とは、変数とするモノのデータ型が「Object型」であるものの総称です。

オブジェクトの一つであるワークシートを、オブジェクト変数として変数化します。

変数化の記述として、「Setステートメント」を使用します。

Setステートメント構文

Set オブジェクト変数 = ワークシートオブジェクト

また、変数を使用するときは、Set文の前に、変数の宣言(Dim)を行なわなければいけません。

Dim 変数の宣言

Dim オブジェクト変数 As オブジェクト型

オブジェクト変数を利用するに当たり、その宣言方法には、「ひとまとめで宣言」と「個別の種別で宣言」する2つの宣言方法があります。

「ひとまとめで宣言」すれば、どんなオブジェクトの種類でも有効です。

「個別の種別で宣言」とは、Workbook、Worksheet、Rangeなど、個別の種類のオブジェクトに限定してする宣言方法です。

実務的には、変数の宣言時(Dim)に、このオブジェクト変数はどういう内容なのかを明らかにするために、多くの場合は「個別の種類のオブジェクト名」で記述しています。

Objectの宣言方法オブジェクトの種別記述の方法
総称で宣言全オブジェクトDim 〇〇 As Object
個別で宣言ブックDim 〇〇 As Workbook
ワークシートDim 〇〇 As Worksheet
セルDim 〇〇 As Range
罫線Dim 〇〇 As Border
など

シートのオブジェクト変数 使用例

VBA
Sub シートの変数化1()
    Dim S1 As Worksheet
        Set S1 = Worksheets("Sheet1")
        S1.Range("B3") = "あいうえお"
End Sub
vbasheetvariablep001

インデックス番号による変数化

シートに付いているインデックス番号を利用してシートを変数化します。

ここで注意が必要なことは、インデックス番号は各シートに固有に付いている番号ではないということです。

ブックに存在するシート枚数の増減や、シートの配置移動によって、特定のシートのインデックス番号が変わります。

VBA
Sub シートの変数化2()
    Dim i As Integer
        i = 2
        MsgBox "インデックス番号2のシート名 " & Worksheets(i).Name
End Sub
vbasheetvariablep002
vbasheetvariablep003

シート名による変数化

シート名を変数にしてシートを変数化します。

注意が必要なことは、存在しないシート名を指定してしまうとエラーが発生することです。

VBA
Sub シートの変数化3()
    Dim ShN As String
        ShN = "Sheet3"
        Worksheets(ShN).Cells(3, 3).Value = "かきくけこ"
End Sub
vbasheetvariablep004

ワークシートの変数化手法の使い分け例示

vbasheetvariablep013

ワークシートの変数化方法の使い分けについて例示をします。

期待する結果に対してより適した ”シートの変数化方法” を探っていくことが必要です。

変数化例示1(オブジェクト変数を使う)

VBAプログラムを実行した年月日時分の名前のワークシートを新規作成し、同時に操作ログとしてSheet1のセルA列にその年月日時分を記録する。

VBA
Sub シートの変数化4()
    Dim NSheet As Worksheet
    Dim 年月日, 時刻 As String
    Dim R As Long
        Worksheets.Add After:=Worksheets(Worksheets.Count)
        Set NSheet = ActiveSheet
        年月日 = Format(Date, "yymmdd")
        時刻 = Format(Now, "hhnn")
        NSheet.Name = 年月日 & "_" & 時刻
        With Worksheets("Sheet1")
            .Cells(1, 1) = "操作ログ"
            R = .Cells(Rows.Count, 1).End(xlUp).Row
            .Cells(R + 1, 1) = NSheet.Name
        End With
End Sub
vbasheetvariablep005
vbasheetvariablep006

このプログラムでは、シート名となる「プログラム実行時刻」を正確に把握することは難しくなります。特に連続に複数回実行する場合には、すべての「プログラム実行時刻」を正確に把握することはほぼ不可能でしょう。

1回の実行で連続で新規シートを複数枚増やしたい場合

1回のプログラム実行時に複数のシートを「実行時刻名」で作成し、その中で2度目に作成したシートのセルにデータを入力するVBAコードです。作成するシート名が重複するので、シート名にカウンター番号を付けます。

複数のシートを連続で作成してもカウンター番号で各シートを個別に呼び出すことが可能です。

VBA
Sub シートの変数化4改()
    Dim NSheet() As Worksheet
    Dim 年月日, 時刻 As String
    Dim R, t As Long
    ReDim NSheet(3)
        For t = 1 To 3
            Worksheets.Add after:=Worksheets(Worksheets.Count)
            Set NSheet(t) = ActiveSheet
            年月日 = Format(Date, "yymmdd")
            時刻 = Format(Now, "hhnn")
            NSheet(t).Name = 年月日 & "_" & 時刻 & "-" & t
            With Worksheets("Sheet1")
                .Cells(1, 1) = "操作ログ"
                R = .Cells(Rows.Count, 1).End(xlUp).Row
                .Cells(R + 1, 1) = NSheet(t).Name
            End With
        Next t
        NSheet(2).Cells(5, 5) = "終了しました!"
End Sub
vbasheetvariablep010
vbasheetvariablep011
vbaaddeyecatch Excelシートを追加・挿入するAddメソッドの使い方

変数化例示2(インデックス番号を使う)

変数化例示1で作成したエクセルシートを「Sheet1」だけを残して他のシートすべてを削除する。

VBA
Sub シートの変数化5()
    Dim s As Long
        Application.DisplayAlerts = False
        For s = Worksheets.Count To 1 Step -1
            If Worksheets(s).Name <> "Sheet1" Then
                Worksheets(s).Delete
            End If
        Next s
        Application.DisplayAlerts = True
End Sub
vbasheetvariablep007

先の例示1から「Sheet1」だけ残して他をシート削除しましたが、

このように削除を行う場合は、すべてのシートは削除できず、必ず1枚のシートは最低残さないといけません。しかも、残すシートは実在するシート名で指定しないといけません。

vbasheetdeleteeyecatch エクセルシートを削除する。Deleteの使い方と注意ポイント

変数化例示3(シート名を使う)

指定したシート名を追加します。

VBA
Sub シートの変数化6()
    Dim ShName As Variant
        ShName = Application.InputBox("シート名を入力してください。", _
                            Title:="シート名設定", Type:=2)
    Dim Flag As Boolean
    Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
            If ws.Name = ShName Then
                Flag = True
                MsgBox "同名のシートがあります。"
                Exit Sub
            End If
        Next
        Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = ShName
End Sub
vbasheetvariablep008
vbasheetvariablep009

追加するシート名が既に存在するのと同名で有るかどうかのチェックが必要です。

同名であってもコピペの時のように「✖✖✖ (2)」というシートが作成されということはありません。

シート名を変更して作成することが必要です。

sheetexistanceeyecatch シートの存在を確認する2種類のコードと実務での例題

まとめ

vbasheetvariablep014

シートを変数化させることで、マクロで行う作業を大幅に広げることが出来るようになります。

シートを変数化させる事、つまりは、その都度作業するシートを選択変更できるということです。

なので、シートの選択手法の違いでシートを変数化させるためのVBAコードも全く違ってきます。

適材適所、「今現在のVBAコード作成の流れからは、どの手法によるシート変数化がベターか?」

シートの変数化手法の選択肢も知識としてぜひ持っておきましょう。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min