【问题标题】:Check if worksheet exists by name检查工作表是否按名称存在
【发布时间】:2018-04-19 22:54:08
【问题描述】:

我想验证工作表是否存在,如果不存在,则要求用户输入从存在的工作表中选择一个工作表。查看this previous post上的信息,我想出了一个返回布尔值的函数,如果结果为假,我会提示。

我遇到的问题是我输入的自定义工作表名称返回 false,但默认的“Sheet1”...返回 true。查看对象模型,我没有看到 Worksheets.Name.Value 列出的对象模型,查看项目资源管理器,我看到工作表被列为“表 1(宏变量)。

如何引用括号中的工作表名称,以便我的函数能够正常工作,或者如果无法使用工作表名称,是否有更好的解决方案?

这是我的代码

    Sub TestBed()
    Dim wb As Workbook, test As Boolean, debugStr As String, wsNames() As String
    Set wb = ThisWorkbook
    Debug.Print "List of sheets in this workbook"

    For i = 1 To wb.Worksheets.count
        ReDim Preserve wsNames(i - 1)
        wsNames(i - 1) = wb.Worksheets(i).Name
        debugStr = debugStr & wsNames(i - 1) & " | "
    Next i

    Debug.Print debugStr
    debugStr = ""

    For i = LBound(wsNames) To UBound(wsNames)
        test = ValidateWorksheetExists(wsNames(i), wb)
        debugStr = debugStr & wsNames(i) & " = " & test & " | "
    Next i

    Debug.Print debugStr
End Sub

Function ValidateWorksheetExists(sName As String, Optional wb As Workbook) As Boolean

If wb Is Nothing Then Set wb = ThisWorkbook

    With wb
        For i = 1 To .Worksheets.count
            If wb.Worksheets(i).Name = sName Then
                ValidateWorksheetExists = True
            Else
                ValidateWorksheetExists = False
            End If
        Next i
    End With
End Function

【问题讨论】:

  • 我很困惑,括号中的位是工作表名称。前面的位是代码名称。

标签: vba excel


【解决方案1】:

你需要在之后退出函数:

ValidateWorksheetExists = True

否则i 的下一次迭代将再次将其设置为False。

(可能还有其他错误)

【讨论】:

    【解决方案2】:

    虽然布尔变量(在本例中为 err 函数)在声明时默认为 False,但明确的做法是一种很好的做法...并且因为 ValidateWorksheetExists 以 ValidateWorksheetExists 开头strong>False,无需再次设置为False。这样做会恢复在 'i'

    的先前迭代中设置的可能 True 状态
    Function ValidateWorksheetExists(sName As String, Optional wb As Workbook) As Boolean
    
    If wb Is Nothing Then Set wb = ThisWorkbook
    
    ValidateWorksheetExists = False
    
        With wb
            For i = 1 To .Worksheets.count
                If wb.Worksheets(i).Name = sName Then
                    ValidateWorksheetExists = True
                End If
            Next i
        End With
    End Function
    

    【讨论】:

    • 感谢您将默认值设置为 false。我将真值覆盖为假。我假设一旦我为函数提供了返回值,该函数将停止处理迭代并退出。我对 VBA 进程如何从函数中逃脱既合乎逻辑又缺乏理解
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多