如果存在强制SHeet名称,请运行宏

时间:2017-10-27 11:41:27

标签: excel excel-vba vba

我有一个宏,它依赖于特定工作表名称'PRODUCTS45'问题,如果用户在不同工作表上运行宏,例如Sheet1它会抛出调试错误。 任何人都可以帮助我只在表'PRODUCTS45'存在时才进行宏运行,如果没有,则抛出msgbox强制表不存在。

    Option Explicit
    Sub FlagWord()
        Dim R As Range, WS As Worksheet
        Dim RE As Object
        Dim C As Range, D As Range
        Dim S As String
        Dim I As Long, J As Long

    S = InputBox("Enter desired word")

    'Current filled in range
    Set WS = Worksheets("SHEET")
'case sensitive sheet name and its required to run macro if this is not present macro should not run
    With WS
        Set R = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        Set R = R.Resize(columnsize:=.Cells(1, .Columns.Count).End(xlToLeft).Column)
    End With

    If Not S = "" Then

    'If S not present then add column
    With WS.Rows(1)
        Set C = .Find(what:=S, after:=.Cells(1, 1), LookIn:=xlValues, _
            lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:=False)
    End With

    'Add column if not already present
        If C Is Nothing Then
            Set R = R.Resize(columnsize:=R.Columns.Count + 1)
            R(1, R.Columns.Count) = S
        End If

    End If 'no new column if S is blank

    'do the word match
    'Clear the data area
    With R
        .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1).ClearContents
    End With

    'fill in the data
    'use regex to allow for easy word boundaries
    Set RE = CreateObject("vbscript.regexp")
    With RE
        .Global = False 'only need a single match
        .ignorecase = True
        For Each C In R.Columns(1).Offset(1, 0).Resize(R.Rows.Count - 1).Cells
            For Each D In R.Rows(1).Offset(0, 1).Resize(columnsize:=R.Columns.Count - 1).Cells
            .Pattern = "\b" & D.Text & "\b"
                If .test(C.Text) = True Then
                    R(C.Row, D.Column) = "YES"
                End If
            Next D
        Next C
    End With

    End Sub

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

Public Sub CheckForSheetBeforeCallingFlagWord()

Dim ws As Worksheet
Dim bolFound As Boolean

bolFound = False
For Each ws In ThisWorkbook.Worksheets
    If ws.Name = "PRODUCTS45" Then bolFound = True
Next ws
If bolFound = False Then
    MsgBox "Required sheet 'PRODUCTS45' not found." & Chr(10) & "Aborting..."
    Exit Sub
End If

Call flagword

End Sub

此过程检查是否存在所需的工作表。如果找不到,那么你会得到一个消息框,没有其他任何事情发生。如果找到工作表,则调用(并执行)其他过程。

答案 1 :(得分:0)

尝试引用不存在的工作表会引发错误。您可以使用错误处理程序来捕获它并提供所需的消息。

Sub myMacro()
    On Error GoTo sheetNotFound
    doStuff ThisWorkbook.Sheets("PRODUCTS45")
    Exit Sub
sheetNotFound:
    MsgBox "PRODUCTS45 not found"
End Sub

Sub doStuff(ws As Worksheet)
' remaining code goes here
End Sub