【问题标题】:Set Workbook Variable from Userform Combobox从用户窗体组合框中设置工作簿变量
【发布时间】:2012-03-27 15:13:48
【问题描述】:

我正在为我的同事创建一个宏。他们每天都会收到一个文件,并且在一天结束时必须将某些信息复制到另一个工作簿中。宏是负责复制的。我想要一个带有组合框弹出窗口的用户表单,其中包含当前打开的工作簿列表,以便它知道要从哪个文件复制。如何设置它以便在那里进行的选择设置具有该选择的工作簿变量?

我想做的是:

Sub CopySub()

Dim wb As Workbook

UserForm1.Show

Set wb = Workbooks(ComboBox1.Value)
....Rest of Copy and Paste Code

下面是用户表单的代码:

Private Sub OK_Click()
'Take user selection and continue copy and paste code
UserForm1.Hide
End Sub

Private Sub Cancel_Click()
'Cancel everything, end all code
End
End Sub


Private Sub UserForm_Activate()

  'Populate list box with names of open workbooks.

  Dim wb As Workbook

  For Each wb In Workbooks

    ComboBox1.AddItem wb.Name

  Next wb

End Sub

【问题讨论】:

    标签: excel vba userform


    【解决方案1】:

    您的代码现在不起作用,因为CopySub 不知道ComboBox1 是什么\在哪里。此外,如果用户单击表单的 X 关闭它而不是按取消按钮或单击确定按钮而不选择工作簿,CopySub 将继续运行。

    有几种不同的方法可以获取表单信息。当前代码最简单的方法是正确引用 ComboBox1 并添加一个简单的测试。

    Sub CopySub()
       Dim wb As Workbook
    
       UserForm1.Show
       If UserForm1.ComboBox1.Value = "" Then
          Exit Sub
       End If
    
       Set wb = Workbooks(UserForm1.ComboBox1.Value)
       ' rest of code goes here
    
    End Sub
    

    其他需要考虑的是如何让您的宏更快、更容易运行。如果表单上唯一的东西是用于选择工作簿的组合框,并且用户将从键盘快捷方式或菜单启动宏,请考虑让宏询问他们是否要在活动工作簿上运行宏。对问题单击“是”比单击下拉框、选择工作簿,然后单击“确定”要快得多。

    Sub CopySub()
       Dim wb As Workbook
    
       If MsgBox("Do you want to run the macro on '" & ActiveWorkbook.Name & "'?", vbQuestion + vbYesNo) = vbYes Then
          Set wb = ActiveWorkbook
       Else
          UserForm1.Show
          If UserForm1.ComboBox1.Value = "" Then
             Exit Sub
          End If
          Set wb = Workbooks(UserForm1.ComboBox1.Value)
       End If
    
       ' rest of code goes here
    
    End Sub
    

    【讨论】:

    • 感谢您的回复,我实际上已经解决了您所说的问题,我需要一个全局变量。我的修复将在下面。我必须创建此步骤来请求工作簿,因为要从中运行宏的工作簿将是活动工作簿,但我需要一种方法让用户选择要从中复制的工作簿。
    • 我会在 8 小时后发布我的答案 :)
    • @riotburn,我猜可能是这样,但以防万一,我想我会继续提及它。 :-)
    【解决方案2】:

    经过进一步搜索,我找到了答案,与 mischab 指出的相同,我没有创建全局变量,因此我的用户窗体无法与子例程进行通信。我通过声明一个具有整个工作簿范围的变量来解决这个问题:

    Public wb1 As String
    
    Sub CopySub()
    
    Dim wbCAR As Workbook
    
    UserForm1.Show
    
    Set wbCAR = Workbooks(wb1)
    ....Rest of code
    

    并将用户表单代码设置为:

    Private Sub OK_Click()
    wb1 = ComboBox1.Value
    UserForm1.Hide
    End Sub
    
    Private Sub Cancel_Click()
    Unload Me
    End
    End Sub
    
    
    Private Sub UserForm_Activate()
    
      'Populate list box with names of open workbooks.
      Dim wb As Workbook
      For Each wb In Workbooks
        ComboBox1.AddItem wb.Name
      Next wb
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2021-08-07
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多