我正在为我的同事创建一个宏。他们每天获取一个文件,并在一天结束时必须将某些信息复制到另一个工作簿。宏是为了处理复制。我希望有一个带有组合框弹出窗口的用户窗体,其中包含当前打开的工作簿列表,因此它知道要从中复制哪个文件。如何进行设置以便在那里进行选择以设置具有该选择的工作簿变量?
我要做的是:
Sub CopySub()
Dim wb As Workbook
UserForm1.Show
Set wb = Workbooks(ComboBox1.Value)
....Rest of Copy and Paste Code
以下是userform的代码:
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
答案 0 :(得分:0)
您的代码现在无法使用,因为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
要考虑的其他方法是让您的宏更快更容易运行的方法。如果表单上的唯一内容是用于选择工作簿的Combobox,用户将从键盘快捷键或菜单启动宏,请考虑让宏询问是否要在活动工作簿上运行宏。单击是以问题比单击下拉框,选择工作簿,然后单击确定要快得多。
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
答案 1 :(得分:0)
在进一步搜索之后,我找到了答案,并且与mischab指出的相同,我没有创建全局变量,因此我的userform无法与子例程进行通信。我通过声明一个具有整个工作簿范围的变量来解决这个问题:
Public wb1 As String
Sub CopySub()
Dim wbCAR As Workbook
UserForm1.Show
Set wbCAR = Workbooks(wb1)
....Rest of code
并将userform代码设置为:
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