Excel VBA运行一个宏,该宏运行从下拉列表中选择的其他宏

Excel 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

我在业余时间一直在做一些工作。我已经走了这么远,现在被卡住了。基本上,我有六组数据(学校、假日、银行假日、周六、周日和节礼日),每周都会复制到新的工作手册上。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
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相同,它只是跳过行而不运行任何东西,几乎忽略了数据验证