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

时间:2018-11-19 10:34:48

标签: excel vba

我一直在业余时间从事一些工作。到目前为止,我已经陷入困境。基本上,我每周有六组数据(学校,假日,银行假日,星期六,星期日和节礼日)被复制到新工作簿上。例如

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

1 个答案:

答案 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")