首页 > 解决方案 > 循环浏览工作表以查看工作表名称是否已被占用 - 循环中的 Len/Left 函数

问题描述

我在下面遇到问题。我的代码基本上是一个排序功能,它从另一个工作表中提取数据以便为用户提供正确的视图,但是如果用户两次选择相同的产品,我的代码会产生错误,因为信息表已经在工作簿中。

因此,我只是希望它选择工作表,如果工作表已经在工作簿中,而不是再次运行代码。

我的问题是,有时工作表名称会超过 31 个字符,这就是我使用 left/len 函数的原因。问题是它无法将现有的工作表名称识别为

Left(Myvalue & " Case Types", 31)

因此即使工作表已经存在也只运行代码并因此产生错误。使用 F8 浏览代码时,我可以看到名称应该相同。有什么建议么?

Dim S As Worksheet

Myvalue = activecell.Value

For Each S In ActiveWorkbook.Worksheets
    If S.Name = Left(Myvalue & " Case Types", 31) Then GoTo Sheetalreadyexist
Next S

'Create New Sheet
Set ws = Sheets.Add(after:=Sheets(Worksheets.Count))
    If Len(Myvalue & " Case Types") > 31 Then
    ws.Name = Left(Myvalue & " Case Types", 31)
    Else: ws.Name = Myvalue & " Case Types"
    End If

Sheetalreadyexist: sheets(Left(Myvalue & " Case Types", 31).select

标签: excelvbaloops

解决方案


我将使用以下函数来检查工作表是否存在

 Public Function sheetExists(SheetName As String, Optional wrkBook As Workbook) As Boolean

    If wrkBook Is Nothing Then
        Set wrkBook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    End If

    On Error GoTo EH

    sheetExists = False  ' Not really neccessary as this is the default

    Dim sht As Object

    For Each sht In wrkBook.Sheets
        If UCase(sht.Name) = UCase(SheetName) Then
            sheetExists = True
            Exit For
        End If
    Next sht

    Exit Function

EH:
    sheetExists = False
End Function

然后你的代码看起来像这样

Sub OP_Code()

    Dim S As Worksheet

    Myvalue = ActiveCell.Value

    If sheetExists(Left(Myvalue & " Case Types", 31)) Then
        Sheets(Left(Myvalue & " Case Types", 31)).Select
    Else
        'Create New Sheet
        Set ws = Sheets.Add(after:=Sheets(Worksheets.Count))
        If Len(Myvalue & " Case Types") > 31 Then
            ws.Name = Left(Myvalue & " Case Types", 31)
        Else: ws.Name = Myvalue & " Case Types"
        End If

    End If

End Sub

推荐阅读