Excel VBA中不存在选项卡时的错误处理

时间:2018-08-03 09:47:12

标签: excel vba loops error-handling reference

`Range("P" & Sheetfind).NumberFormat = "dd mmmm yyyy"tb = Range("P" & Sheetfind).Text
Workbooks.Open Filename:="\\data\Hq\Work Returns\QC\" & Selection.Value & ".xlsx", ReadOnly:=True
Sheets(tb).Select
Workbooks(usersname & ".xlsx").Activate
Set WB2 = ActiveWorkbook
' Put stuff
Range("B2:d2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Prep sheet").Select
Range("B" & movedown).Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Sheetfind = Sheetfind + 1`

Hello Excel专家

如上所述,我提供了代码,该代码实际上打开了一个使用Excel单元格中指定的名称命名的文档,并找到了与单元格P1中的值具有相同名称的选项卡(因为Sheetfind为1,在之前的版本中已定义)代码)并从中获取数据。这里没有问题,工作正常。

我的问题是,如果该特定工作表不存在,则会发生错误,例如,如果代码正在查找“ 2018年7月14日”,并且该工作表不是由搜索对象创建的。在找到匹配项之前,我想不出一种方法来遍历P列中的日期范围。

我认为sheetfind +1可能会起作用,因为它会从“ p1”变为“ p2”,但是我不知道该怎么做。在这种情况下,P2为“ 2018年7月13日”。

任何建议都将受到高度赞赏-谢谢大家。

1 个答案:

答案 0 :(得分:0)

  

虽然我通常建议不要在任何可能的地方使用它,因为它   导致的不良编码习惯。”   抑制它” ,在某些情况下(通常是打开/检查   WorkbooksWorksheets等的可用性可以证明   确实有用)


On Error Resume Next 'or you can refer to a block: instead of Next

一起抑制错误,直到收到回调

On Error GoTo 0

将VBA切换为默认错误处理。
因此,将所有可能的东西包裹在里面可以抑制任何潜在的错误。


但是正如我所提到的,人们经常倾向于(过度)依靠错误抑制功能,而不是自己亲自进行适当的编码。

您应该问自己的正确的心态和问题是,我该如何解决这个问题而无需完全依赖错误处理?

在许多情况下(包括此情况),我们可以采取简单的方法来排除任何潜在的错误,或者我们可以实际进行一些适当的编码并以适当的方式解决问题!

  

现在我还不清楚,您从原始代码段中到底要做什么。我认为您正在尝试复制粘贴范围B2:D2(如果找到),但如果没有,只需在if条件内编辑代码

Function inArray(ByVal what As String, ByVal in_array As Variant) As Boolean
    inArray = (UBound(Filter(in_array, what)) > -1)
    ' returns true if found, otherwise false
End Function


Private Sub check_sheets()

    Dim lr As Long ' last (active) row
    lr = Sheets("default").Cells(Rows.Count, "P").End(xlUp).Row

    Dim sheetnames() As String ' create array for our sheets
    ReDim sheetnames(1 To ThisWorkbook.Sheets.Count) ' size allocation

    Dim i As Long
    For i = 1 To ThisWorkbook.Sheets.Count
        sheetnames(i) = Sheets(i).Name ' store sheetname inside array
    Next i

    Dim cell As Range ' looping through column P
    For Each cell In Sheets("default").Range("P1:P" & lr)
        If (inArray(cell.Value2, sheetnames) = True) Then
            ' worksheet found, do something...
            Sheets("default").Range("B2:D2").Copy
            Sheets(cell.Value2).Range("B2").PasteSpecial xlPasteValues
        Else
            ' worksheet not found, maybe do something...?
            MsgBox ("Sheet " & cell.Value2 & " not found!")
        End If
    Next cell

End Sub
  

此答案还假定具有工作表名称的列P在名为“ {default”的工作表中


总的来说,您可以看到我的答案有很多变量,但是不幸的是,如果没有明确指定问题,就会发生这种情况。
 无论哪种方式,无论您要实现什么,这个答案都应该足够了:)