【问题标题】:VBA run a macro that runs other macros chosen from a drop downlistVBA 运行一个宏,该宏运行从下拉列表中选择的其他宏
【发布时间】:2018-11-19 20:44:55
【问题描述】:

我在空闲时间一直在做一些工作。我已经走了这么远,现在卡住了。基本上我有六组数据(学校、假期、银行假期、周六、周日和节礼日),每周都会被复制到一本新的工作簿上。例如

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,它就会运行,但只运行列表中的第一个宏。例如,周日工作正常并将数据复制到新工作簿,但周一重命名工作表,然后总是复制学校数据(列表中的第一个选项),然后跳到下一步。我想我的星期一下拉选择有问题。我需要运行 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

【问题讨论】:

  • 请....避免使用SELECTHow to avoid using Select。一旦摆脱了这些,编码就会变得容易得多。
  • School 是变量名吗?您将其用作If macroNameMon = School Then 中的一个。整个If..ElseIf 块可以替换为Select Case
  • 我还认为您的六个宏可能是一个,但传递给它的参数不同 - 这六个宏是否相似?

标签: excel vba


【解决方案1】:

以下代码将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 编辑器中转到 ToolsOptionsRequire 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")

【讨论】:

  • 感谢您的快速回复,当我更改代码并使用 F8 运行宏时,它只会跳过每个不运行任何宏的 IF,然后在粘贴命令上出现 1004 错误(我猜是因为它没有什么要粘贴的)
  • @Tom 是的,您需要先复制一些内容,然后才能粘贴。看看我的最终编辑,你可以看到一些改进。
  • 所以我阅读了.select,感谢您的建议和一些谷歌搜索,设法摆脱了它们!我的代码现在更干净了,但仍然无法正常工作。 case 的作用与 IF ELSE 相同,它只是跳过行而不运行任何东西,几乎如果它忽略了单元格 C6 中的数据验证。突出显示 C6 后,我单击数据验证,输入我想要的选项并仔细检查所有拼写,然后检查代码中的拼写,一切都匹配......我错过了什么吗?
  • 使用上面的示例,我已经全部输入(我从不复制和粘贴,输入它让我思考代码实际在做什么,因此希望我能学到!)你警告过的地方关于语法错误是我有问题的地方。 CreateSchool 是这样的: Sub CreateSchool() Windows("VAS New.xlsm").Activate Sheets("School").Range("A1:N52").Copy Windows("VAS.xlsm").Activate End Sub 主宏选择要运行的子宏,子宏复制正确的数据然后返回到新工作簿,主宏粘贴在正确的工作表上。对吗?
  • @Tom 如果您的Create… 过程仅执行.Copy,那么我建议您忽略它们并将该范围存储在一个可用于复制的变量中。查看我的编辑。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多