1

このフォーラムと他のフォーラムの両方で同様の質問が提起されているのを見て、これを投稿する前に考えられるすべての組み合わせを試しました. また、ユーザーフォームに関するいくつかの教科書やより技術的なサイトを参照しましたが、正しく理解できないようです。

モジュールで参照したいユーザーフォームで変数を作成します。それらをグローバルとしてラベル付けし、ユーザーフォームとモジュールの両方、ユーザーフォームのみ、モジュールのみ、および他のいくつかの組み合わせで定義しようとしましたが、正しくありませんでした。

これは私が今持っているものであり、私が読んだすべてのものは正しいはずです:

*ユーザーフォームの宣言セクション:

 Dim ABC as Workbook
 Dim Primary as Workbook

※ユーザーフォームのコマンドボタン部分に

For j = 0 To (ListBox1.ListCount - 1)
    If ListBox1.List(j) Like "ABC" Then
        Set ABC = Workbooks(ListBox1.List(j))
        ABC.Activate
        Exit For
    End If
Next

For i = 0 To (ListBox1.ListCount - 1)
    If ListBox1.List(i) Like "Aggregate" Then
        Set Primary = Workbooks(ListBox1.List(i))
        Primary.Activate
        Exit For
    End If
Next 

*これは、さらにいくつかの変数についても続き、それぞれが異なる文字でインデックス付けされています。

モジュールでは、次のようなものがあります。

        Primary.Sheets("Summary").Range("A5:H40").CopyPicture Appearance:=xlScreen, Format:=xlPicture

上記のように、私の質問は、上記の例のように、これらのワークブック (プライマリ、ABC など) をモジュールで使用できるように定義する方法です。

そして、私のモジュールで使用するとき、私はただ書くことができますか

Primary.Sheets(.......)....

または、 Workbooks("Primary").Sheets(....).... を実行する必要がありますか?

たぶん、プライマリを文字列として薄暗くして、そのようにする必要がありますか?

ありがとう!

4

1 に答える 1

2

上部の通常のモジュール ( Option Explicitの下、最初のSubの上) に、これらの数行を貼り付けます。

Public Primary As Workbook
Public ABC As Workbook

Sub Main()

    UserForm1.Show

    If Not ABC is Nothing Then
        ABC.Sheets(1).Range("A1") = "activated ABC workbooks sheet 1"
    End If

    If Not Primary Is Nothing Then
        Primary.Sheets(1).Range("B1") = "activated primary workbook sheet 1"
    End If
    Unload UserForm1

End Sub

Primary and ABC両方を as として宣言public workbook objectsすると、VBA プロジェクトのどこからでもアクセスできます。これは、 でアクセスできることを意味しますModules, Classes, and Userforms

パブリック/グローバル変数を宣言する場合は、ユーザーフォーム オブジェクトではなく、通常のモジュール オブジェクトを常に使用する必要があります。プライベート フィールドのみを持つことができます。

今、あなたのUserform1

Private Sub CommandButton1_Click()

    Dim j As Long

    For j = 0 To (ListBox1.ListCount - 1)
        If ListBox1.List(j) Like "ABC" Then
            Set ABC = Workbooks(ListBox1.List(j))
            ABC.Activate
            Exit For
        End If
    Next

    For j = 0 To (ListBox1.ListCount - 1)
        If ListBox1.List(j) Like "Aggregate" Then
            Set Primary = Workbooks(ListBox1.List(j))
            Primary.Activate
            Exit For
        End If
    Next

End Sub

ポイントを証明するために、ワークブックを作成したら、名前を出力する行を追加しSetます。何も問題がなければ+で開くと、ワークブック名​​が出力されます。ABCPrimaryDebug.Print ABC.NameImmediate WindowCTRLG


もう 1 つの方法は、ワークブック名​​を文字列パラメーターを介してコード モジュール サブルーチンに送信することです。ワークブック名​​を文字列パラメーターとして受け取るコード モジュールで Sub を作成する必要があります。だから、まだあなたの*UserForm1*

For j = 0 To (ListBox1.ListCount - 1)
    If ListBox1.List(j) Like "ABC" Then
        MySubInCodeModule Workbooks(ListBox1.List(j))
        Exit For
    End If
Next

次に、コードモジュールで

Sub MySubInCodeModule(wbName As String)

    Dim wb As Workbook
    Set wb = Workbooks(wbName)

    wb.Sheets(1).Range("A1") = "activate workbook: " & wb.Name
    wb.Sheets(1).Range("B1") = "active sheet: " & wb.ActiveSheet.Name

    'closing the active workbook
    wb.Close
    Set wb = Nothing
End Sub

これが理にかなっていることを願っています:)それを説明する別の方法さえ考えられません。

于 2013-09-23T15:17:07.423 に答える