繁体   English   中英

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

[英]Error handling when tab doesn't exist in Excel VBA

`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`

你好Excel专家

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

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

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

任何建议都将不胜感激-谢谢大家。

虽然我通常建议不要在任何可能的情况下使用它,因为它会导致不良的编码习惯,例如“什么时候不起作用,只需抑制它” ,但在某些情况下(通常会在打开/检查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 ”的工作表中


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM