【问题标题】:Check sheet name and run the code related to the sheet检查工作表名称并运行与工作表相关的代码
【发布时间】:2021-06-18 14:58:35
【问题描述】:

我正在寻找一个代码来检查最初的工作表名称,如 A、B、C。如果工作表 A 存在,那么它应该运行转到 A1 的代码:否则它应该转到 B 并检查工作表 B 是否存在,如果工作表 B 存在,那么它应该在 B1 下面运行代码,工作表 C 也一样。

例如:

For I = 1 to worksheets.count 
    If Sheets(i).Name = "A" Then 
       GoTo A1 
    Else 
       GoTo B 
    End If 
Next I

【问题讨论】:

  • 不要使用GoTo,这会创建意大利面条式代码。相反,也许为 A、B 和 C 创建一个单独的子例程,然后根据您现有的循环调用每个子例程并检查工作表的 .Name
  • 请提出替代方案
  • 你能帮我写代码吗
  • 当我尝试上面的代码时,它根本没有检查工作表名称,它直接进入第一行,然后是 Else 并在 Else 下执行语句

标签: excel vba


【解决方案1】:

我认为可以使用 ElseIfSelect Case 来解决。 请尝试以下两种情况。

Dim i As Integer

For i = 1 To Worksheets.Count
    Select Case Sheets(i).Name
        Case "A"
            ' Coding for "GoTo A1"
        Case "B"
            ' Coding for "GoTo B1"
        Case "C"
            ' Coding for "GoTo C1"
        ...
    End Select
Next i

或者

Dim i As Integer

For i = 1 To Worksheets.Count
    If Sheets(i).Name = "A" Then
        ' Coding for "GoTo A1"
    ElseIf Sheets(i).Name = "B" Then
        ' Coding for "GoTo B1"
    ElseIf Sheets(i).Name = "C" Then
        ' Coding for "GoTo C1"
    Else
    ...
    End If
Next i

【讨论】:

    【解决方案2】:

    如果您想要在每张工作表上运行特定的宏,并且希望同时触发所有这些宏运行,您可以像这样组织它:

    Sub Main()
        Call SheetA_Macro
        Call SheetB_Macro
        Call SheetC_Macro
    End Sub
    

    如果您有很多工作表,您可以通过将它们命名为相同的东西并将它们放入工作表的代码模块来自动调用这些宏,这样您就可以这样调用它们:

    Sub Main()
        Dim Sht As Worksheet
        For Each Sht In ThisWorkbook.Worksheets
            Call ThisWorkbook.Sheets(Sht.Name).MySheetSpecificMacro
        Next Sht
    End Sub
    

    如果您有一个未知的工作表,并且您只想调用该特定工作表宏,那么您将希望像上面那样做,但没有循环。

    Call ThisWorkbook.Sheets(MyUnknownSheetObject.Name).MySheetSpecificMacro
    

    请记住,宏必须放在工作表的代码模块中,并且都应该命名相同。

    【讨论】:

    • 顺便说一句,如果我执行Sht.Macro 而不是当我执行Sheets(Sht.Name).Macro 时,有人可以详细说明为什么编译器会抱怨“找不到方法或数据成员”吗?
    • 如果表 B 不存在怎么办,我的代码将如何跳过它并调用表 C
    • 如果您的工作表数量未知,那么我建议使用For Each Sht in ThisWorkbook.Worksheets,因为这样可以确保代码只查看您拥有的工作表。
    【解决方案3】:

    工作表相关代码

    • 将工作表名称列表写入数组。
    • 遍历数组,尝试使用WorksheetExists 函数查找现有工作表。
    • 继续现有的工作表(如果有)。
    Option Explicit
    
    Sub ApplyToFirstFound()
        
        Const wsNamesList As String = "A,B,C"
        
        Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
        
        Dim wsNames() As String: wsNames = Split(wsNamesList, ",")
        
        Dim wsName As String
        Dim n As Long
        
        For n = 0 To UBound(wsNames)
            If WorksheetExists(wb, wsNames(n)) Then
                wsName = wsNames(n)
                Exit For
            End If
        Next n
        
        ' You could continue with...
    
        If n > UBound(wsNames) Then
            MsgBox "No worksheet exists.", vbCritical, "ApplyToFirstFound"
            Exit Sub
        End If
        MsgBox "The first found worksheet is named '" & wsName & "'.", _
            vbInformation, "ApplyToFirstFound"
        ' ... continue...
        
        ' ... or with a different code for each worksheet (I've used the same.).
        
        Select Case wsName
        Case "A"
            MsgBox "Applying to '" & wsName & "'.", _
                vbInformation, "ApplyToFirstFound"
        Case "B"
            MsgBox "Applying to '" & wsName & "'.", _
                vbInformation, "ApplyToFirstFound"
        Case "C"
            MsgBox "Applying to '" & wsName & "'.", _
                vbInformation, "ApplyToFirstFound"
        Case Else
            MsgBox "No worksheet exists.", vbCritical, "ApplyToFirstFound"
        End Select
        
    End Sub
    
    Function WorksheetExists( _
        ByVal wb As Workbook, _
        ByVal WorksheetName As String) _
    As Boolean
        On Error GoTo ClearError
        Dim ws As Worksheet: Set ws = wb.Worksheets(WorksheetName)
        WorksheetExists = Not ws Is Nothing
        Exit Function
    ClearError:
        Resume Next
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多