Excel VBA运行一个宏,该宏运行从下拉列表中选择的其他宏
我在业余时间一直在做一些工作。我已经走了这么远,现在被卡住了。基本上,我有六组数据(学校、假日、银行假日、周六、周日和节礼日),每周都会复制到新的工作手册上。e、 gExcel VBA运行一个宏,该宏运行从下拉列表中选择的其他宏,excel,vba,Excel,Vba,我在业余时间一直在做一些工作。我已经走了这么远,现在被卡住了。基本上,我有六组数据(学校、假日、银行假日、周六、周日和节礼日),每周都会复制到新的工作手册上。e、 g 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 Wedne
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
其想法是,每周六晚上,主管选择下周每天所需的数据(通过数据验证单元格),然后单击按钮,宏运行。如图所示:
我已经设置了6个宏来复制数据,我正在尝试设置一个主宏,该宏在单击“创建VAS”按钮时运行。到目前为止,当我使用Application.run(参见星期日代码)进行测试时,我可以让它工作,但只要我使用If或If-Else,它就会运行,但只运行列表中的第一个宏。例如,星期天可以将数据复制到新工作簿中,但星期一会重命名工作表,然后始终复制学校数据(列表中的第一个选项),然后跳过下一步。我想我的星期一下拉列表选择有问题。我需要运行Create VAS宏,然后运行所选宏,然后返回到其本身所在的位置,并继续运行其自身(如果可能的话)
我一直在教自己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
以下代码将
School
视为变量名,而不是值:
If macroNameMon = School Then
Application.Run "CreateSchool"
考虑将其更改为
If macroNameMon = "School" Then
CreateSchool '<-- this will call Sub CreateSchool() no need for Application.Run
还要注意,您混淆了变量名。将
Dim macroName mon声明为字符串,但随后使用macroName=Range(“C6”).Value
我建议激活选项显式
:在VBA编辑器中,转到工具›选项›以避免错误的变量名称
也要去掉所有这些。选择语句:
而不是
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet4").Select
Sheets("Sheet4").name = "Wednesday"
最好使用类似
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Wednesday"
所以你会得到这样的结果:
如果您的创建…
过程只做复制,我建议您使用以下方法:
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")
以下代码将School
视为变量名,而不是值:
If macroNameMon = School Then
Application.Run "CreateSchool"
考虑将其更改为
If macroNameMon = "School" Then
CreateSchool '<-- this will call Sub CreateSchool() no need for Application.Run
还要注意,您混淆了变量名。将Dim macroName mon声明为字符串,但随后使用macroName=Range(“C6”).Value
我建议激活选项显式
:在VBA编辑器中,转到工具›选项›以避免错误的变量名称
也要去掉所有这些。选择语句:
而不是
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet4").Select
Sheets("Sheet4").name = "Wednesday"
最好使用类似
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Wednesday"
所以你会得到这样的结果:
如果您的创建…
过程只做复制,我建议您使用以下方法:
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")
请避免使用选择。一旦你摆脱了这些,编码就变得容易多了。School
是一个变量名吗?如果macronammon=School,则在中将其用作一个。整个If..ElseIf
块可以替换为一个。我还认为您的六个宏可能是一个,但传递给它的参数不同-这六个宏相似吗?请。。。。避免使用选择。一旦你摆脱了这些,编码就变得容易多了。School
是一个变量名吗?如果macronammon=School,则在中将其用作一个。整个If..ElseIf
块可以替换为一个。我还认为您的六个宏可能是一个,但传递给它的参数不同-六个宏相似吗?感谢您的快速回复,当我更改代码并使用F8运行宏时,如果不运行任何宏,它只会跳过每个宏,然后在粘贴命令上出现1004错误(我猜是因为它没有要粘贴的内容)@Tom是的,在粘贴之前需要复制一些内容。看一看我的最终编辑,在那里你可以看到一些改进。所以我读了关于.select的文章,多亏了你的建议和一些谷歌搜索,我设法摆脱了它们!我的代码现在更干净了,但仍然不起作用。case的作用与IF-ELSE相同,它只是跳过行而不运行任何东西,几乎忽略了单元格C6中的数据验证。在突出显示C6的情况下,我单击数据验证,输入我想要的选项并仔细检查所有拼写,然后检查代码中的拼写,所有拼写都匹配。。。我遗漏了什么吗?使用上面的示例,我已经全部输入了(我从不复制和粘贴,输入它会让我思考代码实际在做什么&因此希望我能学到!)您警告语法错误的地方就是我遇到问题的地方。CreateSchool是这样的:Sub CreateSchool()窗口(“VAS New.xlsm”)。激活工作表(“School”)。范围(“A1:N52”)。复制窗口(“VAS.xlsm”)。激活结束子宏主宏选择要运行的子宏,子宏复制正确的数据,然后返回新工作簿,主宏粘贴到正确的工作表上。是吗?@Tom如果你的创建…
过程只做。复制,那么我建议省略它们,并将该范围存储在一个变量中,你可以用来复制。查看我的编辑。感谢您的快速回复,当我更改代码并使用F8运行宏时,如果没有运行任何宏,它只会跳过每个宏,然后在“粘贴”命令上出现1004错误(我猜是因为它没有要粘贴的内容)@Tom是的,您需要复制一些内容才能粘贴它。看一看我的最终编辑,在那里你可以看到一些改进。所以我读了关于.select的文章,多亏了你的建议和一些谷歌搜索,我设法摆脱了它们!我的代码现在更干净了,但仍然不起作用。case的作用与IF-ELSE相同,它只是跳过行而不运行任何东西,几乎忽略了数据验证