【问题标题】:VBA Macro to check if sheet name existsVBA宏检查工作表名称是否存在
【发布时间】:2018-12-05 14:14:00
【问题描述】:

我目前正在运行一个宏,它复制模板工作表、获取用户输入、重命名工作表并将用户输入放入工作表中。

除了检查工作表名称是否已存在的功能外,一切似乎都在工作。实际的“工作表已存在”有效,但是,在提示我此错误之前,它出于某种原因复制了 TEMPLATE 工作表。

这里是实际宏的代码(受影响的区域是:Sheets("TEMPLATE").Copy After:=Sheets("TEMPLATE"))

'============================================================================
'Button to load new GSA Form
'============================================================================
Private Sub CommandButton1_Click()

Const cstrTitle As String = "Create a new GSA worksheet"
Const cstrPrompt As String = "Enter the GSA number for the new worksheet"
Dim projName As String
Dim projAddress As String
Dim projDate As Date
Dim strInput As Variant                                     'Input value from user (GSA Number)
Dim strDefault As String: strDefault = ""                   'Sets default value for inputbox
Dim strInputErrorMessage As String                          'Error message
Dim booValidateOK As Boolean: booValidateOK = False
On Error GoTo HandleError

Do
    strInput = ActiveSheet.Range("C9").Value
    projName = ActiveSheet.Range("C6").Value
    projAddress = ActiveSheet.Range("C7").Value
    projDate = ActiveSheet.Range("C8").Value

    If Len(strInput) = 0 Then GoTo HandleExit
    GoSub ValidateInput
    If Not booValidateOK Then
        If vbCancel = MsgBox(strInputErrorMessage & "Retry?", vbExclamation + vbOKCancel) Then GoTo HandleExit
    End If
Loop While Not booValidateOK

Sheets("TEMPLATE").Copy After:=Sheets("TEMPLATE")                          'Copy Template Sheet, places the copy after the template sheet
ActiveSheet.Name = strInput                                                 'Renames the new sheet to the user's input

ActiveSheet.Range("C5").Value = projName                                    'Inputs Project Name to new sheet
ActiveSheet.Range("C6").Value = projAddress                                 'Inputs Project Address to new sheet
ActiveSheet.Range("C7").Value = projDate                                    'Inputs Project Date to new sheet
ActiveSheet.Range("C8").Value = strInput                                    'Inputs GSA # to new sheet

ThisWorkbook.Worksheets("MASTER").Range("C6").Value = ""   'name'           'Deletes inputs from MASTER sheet
ThisWorkbook.Worksheets("MASTER").Range("C7").Value = ""   'address'
ThisWorkbook.Worksheets("MASTER").Range("C8").Value = ""   'date'
ThisWorkbook.Worksheets("MASTER").Range("C9").Value = ""   'gsa #'



HandleExit:
Exit Sub
HandleError:
MsgBox Err.Description
Resume HandleExit

ValidateInput:
If SheetExists(strSheetName:=strInput) Then
    strInputErrorMessage = "Sheet already exists. "
Else
    booValidateOK = True
End If
Return
End Sub

这是检查工作表是否已存在的函数

Public Function SheetExists(strSheetName As Variant, Optional wbWorkbook As Workbook) As Boolean
If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook           'or ThisWorkbook - whichever appropriate
Dim obj As Object
On Error GoTo HandleError
Set obj = wbWorkbook.Sheets(strSheetName)
SheetExists = True
Exit Function
HandleError:
 SheetExists = False
End Function

【问题讨论】:

  • 我假设计划是从InputBox 获取strInput,而您还没有添加该功能?因为用户没有办法真正重试......
  • 对不起,我没有指定。 strInput 取自工作表中的单元格
  • 我看到了。我的观点是,如果工作表存在或单元格为空白,您永远不会让用户选择更改该值 - 那为什么要循环?

标签: vba excel


【解决方案1】:

试试这个:

Function sheetExists(sheetToFind As String) As Boolean
    sheetExists = False
    For Each sheet In Worksheets
        If sheetToFind = sheet.name Then
            sheetExists = True
            Exit Function
        End If
    Next sheet
End Function

并像这样使用:

if sheetExists("TEMPLATE") = true then
  'your code
else
  'code
end if

Excel VBA If WorkSheet("wsName") Exists

【讨论】:

  • 调试时,它会通过for循环,但它从未设置“SheetExists = True”
  • 我建议使用 StrComp 和 1 作为最后一个参数,以避免在比较时区分大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多