エクセルVBAでシートの変数化を行う方法にはいくつかの手法があります。
重要な3つの手法について説明を行います。オブジェクト変数、インデックス番号、シート名を使用します。
こんにちは じゅんぱ店長 (@junpa33) です。
ワークシートを跨いでVBAプログラムを動作させる時、どのシートに対して編集・変更をするのかを指定しなければいけません。
固定の決まったシートに対しての変更ではなく、その都度、利用状況に合わせてシートが変わる時は、その時々に合わせたシート指定が必要です。
そのためには、ワークシートを変数化させて、その時々に合わせたシート指定を行うことが必要です。
ここでは、シートを変数化させるための3つの方法を説明します。
- シートの知識
- シートの存在を確認する2種類のコードと実務での例題
- シートクリアーを目的のメソッド別にVBA最速理解
- シートのコピーを最速に理解!VBAコードで異なる結果
- Excelシートを追加・挿入するAddメソッドの使い方
- シートの選択・指定方法とその意味。簡単でも軽視してはダメ
- エクセルシートの名付け・変更と取得そして一覧化するコード
- ワークシートのブック内移動と新規ブックへの移転を分かりやすく
- エクセルシートの並び順が思い通り!シート名一覧で自由自在
- Excelシートを保護する。 記述方法とプロテクトされない操作
- エクセルシートを削除する。Deleteの使い方と注意ポイント
- エクセルシートの非表示コードをパスワード管理するVBA
- ワークシートを変数化する3つの手法 オブジェクト変数など
コンテンツ
ワークシートを変数化させる3つの手法
ワークシートを変数化させてVBAコードを作りたい(作らないといけない)場合が結構な頻度で出てきます。頻出の英単語なみです。
一番頻繁には、
VBA記述時に、 ” どのシートのセルを扱うのか? ” 「Worksheets(“Sheet1”).Range(“A1”)」の時の「Worksheets(“Sheet1”)」の部分を簡潔に記述するための方法
たとえば Set ws = Worksheets(“Sheet1”) ということで
Sheet1という名前のシートオブジェクトをwsという文字(オブジェクト変数)に置き換えます
With~End With という記述法もありますが、基本、入力キーを叩く回数が多くなり面倒に感じることも・・・
この記事で説明する内容については、例えばこのような作成の要求への対策についてです。
これらは、日常の業務で普通にあるエクセル作業です。
けれども、これをVBAでマクロ化するには、「シートの変数化」というコード作成が必要になります。
ということで、今回はシートを変数化させる代表的な3つの手法を紹介していきます。
オブジェクト変数による変数化
オブジェクト変数とは、変数とするモノのデータ型が「Object型」であるものの総称です。
オブジェクトの一つであるワークシートを、オブジェクト変数として変数化します。
変数化の記述として、「Setステートメント」を使用します。
Set オブジェクト変数 = ワークシートオブジェクト
また、変数を使用するときは、Set文の前に、変数の宣言(Dim)を行なわなければいけません。
Dim オブジェクト変数 As オブジェクト型
オブジェクト変数を利用するに当たり、その宣言方法には、「ひとまとめで宣言」と「個別の種別で宣言」する2つの宣言方法があります。
「ひとまとめで宣言」すれば、どんなオブジェクトの種類でも有効です。
「個別の種別で宣言」とは、Workbook、Worksheet、Rangeなど、個別の種類のオブジェクトに限定してする宣言方法です。
実務的には、変数の宣言時(Dim)に、このオブジェクト変数はどういう内容なのかを明らかにするために、多くの場合は「個別の種類のオブジェクト名」で記述しています。
Objectの宣言方法 | オブジェクトの種別 | 記述の方法 |
---|---|---|
総称で宣言 | 全オブジェクト | Dim 〇〇 As Object |
個別で宣言 | ブック | Dim 〇〇 As Workbook |
ワークシート | Dim 〇〇 As Worksheet | |
セル | Dim 〇〇 As Range | |
罫線 | Dim 〇〇 As Border | |
など |
Sub シートの変数化1()
Dim S1 As Worksheet
Set S1 = Worksheets("Sheet1")
S1.Range("B3") = "あいうえお"
End Sub
インデックス番号による変数化
シートに付いているインデックス番号を利用してシートを変数化します。
ここで注意が必要なことは、インデックス番号は各シートに固有に付いている番号ではないということです。
ブックに存在するシート枚数の増減や、シートの配置移動によって、特定のシートのインデックス番号が変わります。
Sub シートの変数化2()
Dim i As Integer
i = 2
MsgBox "インデックス番号2のシート名 " & Worksheets(i).Name
End Sub
シート名による変数化
シート名を変数にしてシートを変数化します。
注意が必要なことは、存在しないシート名を指定してしまうとエラーが発生することです。
Sub シートの変数化3()
Dim ShN As String
ShN = "Sheet3"
Worksheets(ShN).Cells(3, 3).Value = "かきくけこ"
End Sub
ワークシートの変数化手法の使い分け例示
ワークシートの変数化方法の使い分けについて例示をします。
期待する結果に対してより適した ”シートの変数化方法” を探っていくことが必要です。
変数化例示1(オブジェクト変数を使う)
VBAプログラムを実行した年月日時分の名前のワークシートを新規作成し、同時に操作ログとしてSheet1のセルA列にその年月日時分を記録する。
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
このプログラムでは、シート名となる「プログラム実行時刻」を正確に把握することは難しくなります。特に連続に複数回実行する場合には、すべての「プログラム実行時刻」を正確に把握することはほぼ不可能でしょう。
1回のプログラム実行時に複数のシートを「実行時刻名」で作成し、その中で2度目に作成したシートのセルにデータを入力する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
変数化例示2(インデックス番号を使う)
変数化例示1で作成したエクセルシートを「Sheet1」だけを残して他のシートすべてを削除する。
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
先の例示1から「Sheet1」だけ残して他をシート削除しましたが、
このように削除を行う場合は、すべてのシートは削除できず、必ず1枚のシートは最低残さないといけません。しかも、残すシートは実在するシート名で指定しないといけません。
エクセルシートを削除する。Deleteの使い方と注意ポイント変数化例示3(シート名を使う)
指定したシート名を追加します。
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
追加するシート名が既に存在するのと同名で有るかどうかのチェックが必要です。
同名であってもコピペの時のように「✖✖✖ (2)」というシートが作成されということはありません。
シート名を変更して作成することが必要です。
シートの存在を確認する2種類のコードと実務での例題まとめ
シートを変数化させることで、マクロで行う作業を大幅に広げることが出来るようになります。
シートを変数化させる事、つまりは、その都度作業するシートを選択変更できるということです。
なので、シートの選択手法の違いでシートを変数化させるためのVBAコードも全く違ってきます。
適材適所、「今現在のVBAコード作成の流れからは、どの手法によるシート変数化がベターか?」
シートの変数化手法の選択肢も知識としてぜひ持っておきましょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。