2024年5月13日月曜日

別のブックを開いて、そこからデータを引っ張ってくる手法をよく使いますが、それなりに工夫が必要だな ー オブジェクト変数(VBAマクロ) 

         
もし、複数ブックを開き、各々にある複数シートをVBAで操作するとします。
もちろんマクロを書いたブックは、コードだけを利用するプログラムなのです。

 Workbooks("ブック名").Worksheets(”シート名”).Range("A1")

基本的には、上のようなコードであれば、ブックとシートを特定できるのです。
ただ、記述が冗長になるし、変数を使って特定できれば記述は簡単になるんだ。

なので、開いているブックを特定するため、オブジェクトの変数を設定したい。
それと、操作したブック名にタイムスタンプをつけて、フィル名が変わるかも。

これを加味して工夫してみたのが、次のようなコードになり意外に役立ちます。
このコードの工夫ですが、Instr関数とオブジェクト変数の”Set”の使い方です。

Sub sample()
Dim wb As Workbook, wb1 As Object, wb2 As Object
  For Each wb In Workbooks
    If InStr(wb.Name, "ファイル名の先頭文字一部") = 1 Then Set wb1 = wb
    If InStr(wb.Name, "ファイル名の先頭文字一部") = 1 Then Set wb2 = wb
  Next wb
    Debug.Print wb1.Name
      Debug.Print wb2.Name
End Sub

それに、マクロ例文で、If文中で”Set”を定義づけても、特に問題はありません。
ちゃんと動作しますが、ネットの例文では、こういう書法の仕方がないんだな。

次に、InStr関数は、文字列の中に指定した文字列があるかどうかを判別します。
含まれていれば、何文字目かにあるか数値を表すので、この例では先頭の意味。

含まれていなければ、”0”になりますが、使い道のある関数なのでよく使います。
これでブックは特定できましたが、ワークシートも同じく変数で定義づけ可能。 

Option Explicit
Dim wb As Workbook, wb1 As Workbook, wb2 As Workbook
Dim ws As Worksheet, ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet

Sub sample() '二つの開いているブックに変数で定義
  For Each wb In Workbooks
    If InStr(wb.Name, "UsrFrm") = 1 Then Set wb1 = wb
    If InStr(wb.Name, "ShuffleExcel") = 1 Then Set wb2 = wb
  Next wb
    Debug.Print wb1.Name
      Debug.Print wb2.Name
End Sub

Sub sample2() '定義された一つのブックの各シートに変数で定義
  For Each ws In wb1.Worksheets
    If ws.Name = "Sheet1" Then Set ws1 = ws
    If ws.Name = "Sheet2" Then Set ws2 = ws
    If ws.Name = "Sheet3" Then Set ws3 = ws
  Next ws
End Sub

Sub sample3() '定義された一つのブックの各シートに変数で定義
  wb1.Activate
    ws3.Activate
      Range("A1").Select
End Sub

上の構文は、プロシージャ共通の変数に設定するため、モジュール先頭で記述。
変数が各プロシージャへ渡り継がれて行き、最後にセル範囲を首得しています。

ところで、”Set”で定義するオブジェクト変数には、包含関係が存在しています。
上位のVariant型から、Object型、 特定のオブジェクト型へ固有の指定になる。

まあ、最低限、Workbook、Worksheet、Range、3つは覚えておきましょう。
もし、型の指定が難しかったら、ObjectもVariantでも構わないとは思います。

というわけで、コードはあくまでもサンプルに過ぎなくて実用には工夫が必要。
ネットで紹介したコードを見ても、教科書的なサンプルコードが多いだけなので、その組み合わせを工夫することで、自分にとって実用的なコードが見いだされるというわけなのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿