我正在尝试使用VBA创建基于表单的界面。我遇到了一个我无法弄明白的问题。所以在我的代码中,我尝试创建一个新工作簿然后保存它。之后,它将扫描复选框,看看哪一个被选中。如果它被选中,它将创建一个新工作表并复制预制模板。用户将打开他们想要的另一个工作簿,它会将该工作簿中的信息复制到刚刚创建的工作簿中。以下是检索数据的代码:
Sub mil10_data()
Dim NewWB As Workbook
Dim thisWB As Workbook
Dim wb As Workbook
Dim Ret
Set thisWB = ThisWorkbook
Set NewWB = ActiveWorkbook
With NewWB
'Copy the pre-made template to new workbook
thisWB.Sheets("Data 10").Range("A1:AZ3000").Copy NewWB.Sheets(ActiveSheet.Name).Range("A1:AZ3000")
'Retriving the data
Ret = Application.GetOpenFilename("Excel Files (*.CSV), *.CSV", Title:="Select File To Be Opened")
If Ret = False Then Exit Sub
Set wb = Workbooks.Open(Ret)
**'This is where the error is show up
wb.Sheets(ActiveSheet.Name).Range("E21:E2136").Copy NewWB.Sheets(ActiveSheet.Name).Range("C2:C2117")**
wb.Close SaveChanges:=False
Set wb = Nothing
Set NewWB = Nothing
End With
End Sub
我认为可能是因为有三个工作簿打开,它不知道哪一个是活动工作簿,但事实并非如此。我使用MsgBox进行了测试,它显示了我想要的正确工作簿和工作名称。如果我将ActiveSheet.Name更改为实际的工作表名称,它可以工作,但我不想使用该方法。我有不同的工作表需要创建,所以我更喜欢使用ActiveSheet.Name。任何人都知道它为什么不起作用?我真的很感激帮助。谢谢!
答案 0 :(得分:1)
ActiveWorkbook
和ActiveSheet
是获取用户输入的笨拙方法。您应该在变量中保存您感兴趣的属性(尽快),然后直接停止引用它们。
在您的情况下,代码可能看起来像
Sub mil10_data()
Dim NewWB As Workbook
Dim thisWB As Workbook
Dim wb As Workbook
Dim Ret
Dim active_sheet_name As String
Set thisWB = ThisWorkbook
Set NewWB = ActiveWorkbook
Let active_sheet_name = Application.ActiveSheet.Name
With NewWB
'Copy the pre-made template to new workbook
thisWB.Sheets("Data 10").Range("A1:AZ3000").Copy NewWB.Sheets(active_sheet_name).Range("A1:AZ3000")
'Retrieving the data
Ret = Application.GetOpenFilename("Excel Files (*.CSV), *.CSV", Title:="Select File To Be Opened")
If Ret = False Then Exit Sub
Set wb = Workbooks.Open(Ret)
wb.Sheets(active_sheet_name).Range("E21:E2136").Copy NewWB.Sheets(active_sheet_name).Range("C2:C2117")
wb.Close SaveChanges:=False
Set wb = Nothing
Set NewWB = Nothing
End With
End Sub
如果仍然出现“下标超出范围”错误,则表示您在运行脚本之前未正确选择ActiveSheet
,或者工作簿中不存在该工作表wb