我想验证工作表是否存在,如果不存在,则要求用户输入从存在的工作表中选择工作表。查看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
答案 0 :(得分:2)
您需要在以下之后立即退出该功能:
ValidateWorksheetExists = True
否则i
的下一次迭代会再次将其设置为False
。
(可能还有其他错误)
答案 1 :(得分:0)
虽然布尔变量(在这种情况下是错误的函数)在声明时默认为 False ,但最好是明确的......并且因为 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