我一直在业余时间从事一些工作。到目前为止,我已经陷入困境。基本上,我每周有六组数据(学校,假日,银行假日,星期六,星期日和节礼日)被复制到新工作簿上。例如
Sunday = choice of Sunday or Boxing day
Monday = choice of school or holiday or bank holiday or boxing day
Tuesday = choice of school or holiday or boxing day
Wednesday = choice of school or holiday or boxing day
Thursday = choice of school or holiday or boxing day
Friday = choice of school or holiday or boxing day
Saturday = choice of Saturday or boxing day
这样的想法是,主管在每个星期六晚上选择下周每一天(通过数据验证单元)所需的数据,然后单击一个按钮,宏就会运行。查看图片:View of drop-down lists
我已经设置了6个宏来复制数据,并且我试图设置一个主宏,该宏在单击“创建VAS”按钮时运行。到目前为止,当我使用Application.run测试时,它可以正常工作(请参见星期日代码),但是一旦使用If或If Else,它就可以运行,但只运行列表中的第一个宏。例如,星期日工作正常,并将数据复制到新工作簿中,但是星期一重命名工作表,然后始终复制学校数据(列表中的第一个选项),然后跳到下一步。我想我的星期一下拉列表选择有问题。我需要运行“创建VAS宏”,然后运行所选的宏,然后返回其自身所在的位置并在可能的情况下继续运行其自身?
我一直在通过使用本网站和Internet上的论坛和帖子自学VBA,并且一直在逐渐好转,但这确实使我陷入困境,我们将不胜感激!
Sub CreateVAS()
'Step 1 - Create VAS Workbook
Workbooks.Add
ActiveWorkbook.SaveAs filename:= _
"C:\Users\Tom\Desktop\VAS.xlsm", FileFormat:= _
xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
'Step 2 - Create Sunday
Sheets("Sheet1").Select
Sheets("Sheet1").name = "Sunday"
Application.Run "CreateSunday"
'Step 3 - Create Monday
Sheets("Sheet2").Select
Sheets("Sheet2").name = "Monday"
Dim macroNameMon As String
macroName = Range("C6").Value
If macroNameMon = School Then
Application.Run "CreateSchool"
ElseIf macroNameMon = Holiday Then
Application.Run "CreateHoliday"
ElseIf macroNameMon = BankHoliday Then
Application.Run "CreateBH"
ElseIf macroNameMon = Boxing Then
Application.Run "CreateBoxing"
End If
Windows("VAS.xlsm").Activate
Sheets("Monday").Paste Destination:=Range("A1")
'Step 4 - Create Tuesday
Sheets("Sheet3").Select
Sheets("Sheet3").name = "Tuesday"
Dim macroNameTue As String
macroName = Range("C8").Value
If macroNameTue = School Then
Application.Run "CreateSchool"
ElseIf macroNameTue = Holiday Then
Application.Run "CreateHoliday"
ElseIf macroNameTue = BankHoliday Then
Application.Run "CreateBH"
ElseIf macroNameTue = Boxing Then
Application.Run "CreateBoxing"
End If
Windows("VAS.xlsm").Activate
Sheets("Tuesday").Paste Destination:=Range("A1")
'Step 5 - Create Wednesday
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet4").Select
Sheets("Sheet4").name = "Wednesday"
'Step 6 - Create Thursday
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet5").Select
Sheets("Sheet5").name = "Thursday"
'Step 7 - Create Friday
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet6").Select
Sheets("Sheet6").name = "Friday"
'Step 7 - Create Saturday
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet7").Select
Sheets("Sheet7").name = "Saturday"
Application.Run "CreateSaturday"
'Step 10 - Save all changes
Windows("VAS.xlsm").Activate
ActiveWorkbook.Save
MsgBox "VAS Sheet created. Please rename and place in correct folder."
ActiveWindow.Close
答案 0 :(得分:2)
以下代码将School
视为变量名而不是值:
If macroNameMon = School Then
Application.Run "CreateSchool"
考虑将其更改为
If macroNameMon = "School" Then
CreateSchool '<-- this will call Sub CreateSchool() no need for Application.Run
请注意,您可以使用Select Case
,它比使用多个If … Then … ElseIf …
更容易:
Select Case macroNameMon
Case "School": CreateSchool
Case "Holiday": CreateHoliday
Case "BankHoliday": CreateBH
Case "Boxing": CreateBoxing
End Select
还请注意,您混合使用了变量名。您声明Dim macroNameMon As String
,然后使用macroName = Range("C6").Value
。
我建议激活Option Explicit
:在VBA编辑器中,转到工具› 选项› Require Variable Declaration 避免使用错误的变量名。
还要摆脱所有这些.Select
语句:How to avoid using Select in Excel VBA。
代替
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet4").Select
Sheets("Sheet4").name = "Wednesday"
最好使用类似的东西
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Wednesday"
Option Explicit
Sub CreateVAS()
Dim NewWb As Workbook
'Step 1 - Create VAS Workbook
Set NewWb = Workbooks.Add 'remember the new workbook in a variable so we can easily access it
NewWb.SaveAs Filename:="C:\Users\Tom\Desktop\VAS.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
CreateBackup:=False
'remove all sheets some Excels don't add 3 sheets but only 1. Therefore delete all to not run into odd issues.
Dim i As Long
Application.DisplayAlerts = False
For i = NewWb.Sheets.Count To 2 Step -1
NewWb.Sheets(i).Delete
Next i
Application.DisplayAlerts = True
'Step 2 - Create Sunday
NewWb.Worksheets(1).Name = "Sunday" 'name first sheet
CreateSunday
'Step 3 - Create Monday
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Monday"
Dim macroNameMon As String
macroNameMon = ThisWokrbook.Worksheet("YourSheet").Range("C6").Value 'specify your workbook and sheet
Select Case macroNameMon
Case "School": CreateSchool
Case "Holiday": CreateHoliday
Case "BankHoliday": CreateBH
Case "Boxing": CreateBoxing
End Select
'the following syntax is wrong
'NewWb.Worksheets("Monday").Paste Destination:=Range("A1")
'it should be something like
ThisWorkbook.Worksheets("yoursource").Range("A1").Copy Destination:=NewWb.Worksheets("Monday").Range("A1")
'Step 4 - Create Tuesday
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Tuesday"
Dim macroNameTue As String
macroNameTue = ThisWokrbook.Worksheet("YourSheet").Range("C8").Value 'specify your workbook and sheet
Select Case macroNameMon
Case "School": CreateSchool
Case "Holiday": CreateHoliday
Case "BankHoliday": CreateBH
Case "Boxing": CreateBoxing
End Select
ThisWorkbook.Worksheets("yoursource").Range("A1").Copy Destination:=NewWb.Worksheets("Tuesday").Range("A1")
'Step 5 - Create Wednesday till Saturday
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Wednesday"
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Thursday"
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Friday"
NewWb.Worksheets.Add(After:=NewWb.Sheets(NewWb.Sheets.Count)).Name = "Saturday"
CreateSaturday
'Step 10 - Save all changes
NewWb.Save
MsgBox "VAS Sheet created. Please rename and place in correct folder."
NewWb.Close
End Sub
如果您的Create…
过程仅做复制操作,我建议使用以下内容:
Dim macroNameMon As String
macroNameMon = ThisWokrbook.Worksheet("YourSheet").Range("C6").Value 'specify your workbook and sheet
Dim SourceRange As Range
Select Case macroNameMon
Case "School": Set SourceRange = Thisworkbook.Worksheets("School").Range("A1:N52")
'… and so on
End Select
SourceRange.Copy Destination:=NewWb.Worksheets("Monday").Range("A1")