VBA 新規作成ブックとシート。アクティブ状態でやっておくこと

vbanameeyecatch

エクセルVBAで新規作成するブックとシートについて、まず最初のアクティブな状態の時にやっておくことがあります。

「新規作成=名前が無い」という事です。

これではコードでの操作が非常に不便な状態になります。

 

エクセルVBAで、アクティブセル、アクティブシート、アクティブブックという「現在参照中の・・・」というオブジェクトがあります。

今回の「VBA最速で理解」は、この「ActiveWorkbook」「ActiveSheet」「ActiveCell」の重要な使い方について説明します。

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

 

VBA 新規作成ブックとシート。
アクティブ状態でやっておくこと

 

最初に、「ActiveWorkbook」と「ThisWorkbook」とを区別しておきましょう。

簡単に言うと

「ActiveWorkbook」は「今、参照しているワークブック」のことで、

「ThisWorkbook」は「この操作中のVBAコードが記述されているワークブック」になります。

ですので、「ThisWorkbook」は対象のワークブックは、そのVBAを実行している間は変わりません。

対して「ActiveWorkbook」は今の参照の対象から外れるともうActiveWorkbookではなくなるということです。

これは「ActiveSheet」も「ActiveCell」同様です。

その様な性格の「Active・・・」ですが、ブックやシートを新規追加する時には特に重要な存在となります。

 

 

新規にブックを追加する時のActiveWorkbook

 

新しくブックを追加して、そこにデータや計算結果を落とし込み、最終的に本体ブックとは別名で保存する。

と、言うようなVBAコード組み立てる事もそれなりの頻度であるでしょう。

ワークブックを3つや4つ開きながらの作業になる事も多いと思います。

そういった場面で何が一番の問題かというと、「新規ブックには名前が無い」ということです。

VBAコードで「新規ブック」を呼び出そうとしても、「名前が無い」と呼び出すことも出来ません。

「 ActiveWorkbook でいいんじゃないの?」っていう話は通用しません。

それは、先ほど説明した「Active・・・」の性格のためです。

コードの進め方で、一旦フォーカスが外れて(アクティブでなくなって)しまえば、

もう新規作成のブックは「名前が無い」ので掴むことが出来なくなっています。

 

そこでこの対策としては、 ActiveWorkbookを使って新規のブック名を変数で特定化してしまう事です。

 

例題1

ブックを新規追加するコードの直下にSet 「変数」 = ActiveWorkbookのコードを配置します。

 

MEMO

Format関数の使い方についてはこの記事を参考にしてください。

エクセルVBA Format関数をテッパン関数にする!実務で頻度の高い書式と使用例

ActiveWorkbookコード
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」で行うことが出来ます。

実行結果

vbaname001

 

 

新規にシートを追加する時のActiveSheet

 

例題2

シートの場合も、シートの追加のコードの直下にSet 「変数」 = ActiveSheetのコードを配置します。

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・・・文」の置く位置の違いで狙い通りに変数に新規作成のシートが填まるかを調べてみました。

結果を見ると、「追加コードの直下」に置かないとダメということが分かります。

実行結果

vbaname002

 

 

Activecellを使ったコード1例

 

例題3

「 For Next 」と「 Offset 」を使って、ActiveCell が移動していきます。

状態が見えるようにセルに値を入力していきます。

ある特定のセルがアクティブになっている状態で、別の操作をしようとするときは、

Set 「変数」 = ActiveCellのコードを設置して取り出すことが出来ます。

 

MEMO

Offsetの使い方についてはこちらを参考にしてください。

エクセルVBA Offsetの使い方。セルや選択範囲を移動する

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

実行結果

vbaname003

 

 

アクティブ状態でやっておくこと まとめ

 

既に名前を付けて保存されているエクセルBOOKやシートを開いて、非表示になっているところを「 Activate 」で表示する。

そのオブジェクトを指定するのに「ActiveWorkbook」「ActiveSheet」「ActiveCell」を使うメインの使い方。

 

今回はそうではなく、新規作成のブックやシートに対しての使い方を説明しました。

名無しのブックや名無しのシートでは、それに対して操作することが難しくなります。

 

「新規作成時はアクティブ状態」というエクセルの特性を利用して、

「Set 「変数」 = Active・・・」で(変数で)マーキングしてしまいましょうということです。

 

短期間でエクセルVBAの独学習得を目指したいなら

 

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

 

このサイトでよく使うVBAのコードのトピックを纏めています。

「VBA最速理解」の記事一覧を開く

 

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

 

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