エクセルVBAで新規作成するブックとシートについて、まず最初のアクティブな状態の時にやっておくことがあります。
「新規作成=名前が無い」という事です。
これではコードでの操作が非常に不便な状態になります。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAで、アクティブセル、アクティブシート、アクティブブックという「現在参照中の・・・」というオブジェクトがあります。
今回の「VBA最速で理解」は、この「ActiveWorkbook」「ActiveSheet」「ActiveCell」の重要な使い方について説明します。
- ブックの知識
- ブックの操作
- ワークブックを開くOpenメソッドの書き方 Excelマクロ
- VBA ブック名の取得法4つの解決策を詳しく解説
- VBA 開く,保存,閉じる,作成,削除 ブックの存在確認後のコード記述
- ファイルの保存に年月日+時刻を付けて管理する
- VBA 保存先フォルダをダイアログ指定で変数化
- 新規ブック5つの保存法。AddとSaveAsの使い方がわかる
- セル値を使いブック名として保存。統一フォームに有用
- VBA シートをブックから切り出し名付け保存する
- ブック名に作成者名を付加。 プロパティ変更とファイル保存
- 不要フォルダを削除する2種類のコードの作成
- 要らないファイルを自動削除するコードの作成
- ワークブックを閉じる12のパターン使い分け VBA最速理解
- ピンポイントでファイルを完全に削除するマクロ(コピペ可)
コンテンツ
新規作成ブックとシート。アクティブ状態でやっておくこと
最初に、「ActiveWorkbook」と「ThisWorkbook」とを区別しておきましょう。
簡単に言うと
- 「ActiveWorkbook」は「今、参照しているワークブック」
- 「ThisWorkbook」は「この操作中のVBAコードが記述されているワークブック」
になります。
ですので、「ThisWorkbook」は、対象のワークブックで、そのVBAを実行している間は変わりません。
対して「ActiveWorkbook」は、今の参照の対象から外れるともうActiveWorkbookではなくなるということです。
これは「ActiveSheet」も「ActiveCell」同様です。
その様な性格の「Active・・・」ですが、ブックやシートを新規追加する時には特に重要な存在となります。
新規にブックを追加する時のActiveWorkbook
新しくブックを追加して、そこにデータや計算結果を落とし込み、最終的に本体ブックとは別名で保存する。
と、言うようなVBAコード組み立てる事もそれなりの頻度であるでしょう。
ワークブックを3つや4つ開きながらの作業になる事も多いと思います。
そういった場面で何が一番の問題かというと、「新規ブックには名前が無い」ということです。
VBAコードで「新規ブック」を呼び出そうとしても、「名前が無い」と呼び出すことも出来ません。
「 ActiveWorkbook でいいんじゃないの?」っていう話は通用しません。
それは、先ほど説明した「Active・・・」の性格のためです。
コードの進め方で、一旦フォーカスが外れて(アクティブでなくなって)しまえば、
もう新規作成のブックは「名前が無い」ので掴むことが出来なくなっています。
そこでこの対策としては、 ActiveWorkbookを使って新規のブック名を変数で特定化してしまう事です。
ブックを新規追加するコードの直下に「Set 「変数」 = ActiveWorkbook」のコードを配置します。
Option Explicit
Sub Activeテスト1()
Dim Newbook As Workbook
Dim FN As String
Workbooks.Add
Set Newbook = ActiveWorkbook
'↓これ以降は、新規ブックからフォーカスが外れてもOK
Newbook.Worksheets(2).Activate
FN = Format(Now(), "yymmdd-hhmm")
Newbook.SaveAs Filename:=ThisWorkbook.Path & _
"\テストBOOK_" & FN & ".xlsx"
End Sub
これで新規で作成したブックは、「変数Newbook」を使えば、呼び出すことも、名前を付けることも出来ます。
新規作成ブックのシートを呼び出すのも「Newbook.Worksheets(1).Activate」で行うことが出来ます。
実行結果
新規にシートを追加する時のActiveSheet
シートの場合も、シートの追加のコードの直下に「Set 「変数」 = ActiveSheet」のコードを配置します。
Sub Activeテスト2()
Dim Ms As Worksheet
'宣言文の直下に「Set・・・」を配置
Set Ms = ActiveSheet
Debug.Print Ms.Name
ThisWorkbook.Worksheets.Add after:=Worksheets("Sheet3")
ActiveSheet.Name = "テストシート"
'追加コードの直下に「Set・・・」を配置
Set Ms = ActiveSheet
Debug.Print Ms.Name
End Sub
シートの場合は、ブック以上に頻繁にフォーカスが変わってしまう事が多いと思います。これで「変数Ms」で新規シートを掴むことが出来ます。
Debug.Print で「 Set・・・文」の置く位置の違いで狙い通りに変数に新規作成のシートが填まるかを調べてみました。
結果を見ると、「追加コードの直下」に置かないとダメということが分かります。
実行結果
Activecellを使ったコード1例
「 For Next 」と「 Offset 」を使って、ActiveCell が移動していきます。
状態が見えるようにセルに値を入力していきます。
ある特定のセルがアクティブになっている状態で、別の操作をしようとするときは、
「Set 「変数」 = ActiveCell」のコードを設置して取り出すことが出来ます。
Sub Activeテスト3()
Dim i As Long, V As Long
Dim Mc As Range
Cells(1, 1).Activate
For i = 1 To 10
ActiveCell.Value = i * 2
If i = 5 Then
Set Mc = ActiveCell
V = Mc.Value
Cells(i, 2) = V
End If
ActiveCell.Offset(1, 1).Activate
Next i
End Sub
実行結果
アクティブ状態でやっておくこと まとめ
既に名前を付けて保存されているエクセルBOOKやシートを開いて、非表示になっているところを「 Activate 」で表示する。
そのオブジェクトを指定するのに「ActiveWorkbook」「ActiveSheet」「ActiveCell」を使うメインの使い方。
今回はそうではなく、新規作成のブックやシートに対しての使い方を説明しました。
名無しのブックや名無しのシートでは、それに対して操作することが難しくなります。
「新規作成時はアクティブ状態」というエクセルの特性を利用して、
「Set 「変数」 = Active・・・」で(変数で)マーキングしてしまいましょうということです。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。