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

如上所述,我的问题是如何定义这些工作簿(Primary、ABC 等),以便可以在我的模块中使用它们,就像上面的示例一样。

在我的模块中使用时,我可以写吗

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

还是我需要做 Workbooks("Primary").Sheets(....)....

也许我应该 Dim Primary as String 并那样做?

谢谢!

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 ABCpublic 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

为了证明你的观点,一旦你SetABC工作Primary簿添加Debug.Print ABC.Name一行来打印出名称。如果没有任何问题,则Immediate Window使用CTRL+打开,G您将看到打印出的工作簿名称。


另一种方法是通过字符串参数将工作簿名称发送到代码模块子。您必须在将工作簿名称作为字符串参数的代码模块中创建一个 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 回答