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

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

你好Excel专家

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

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

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

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

最佳答案

While I generally advise against using this whenever possible, as it leads to bad coding habits of "when something doesn't work, simply supress it", there are some cases (usually with opening/checking availability of Workbooks, Worksheets, etc when it can prove actually useful)


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

一起抑制错误,直到收到回调
On Error GoTo 0

将VBA切换为默认错误处理。
因此,将整个容器包装在其中可以抑制任何潜在的错误。

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

您应该问自己的正确的心态和问题是,如何在不完全依赖错误处理的情况下解决此问题?

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

Now I found it unclear, what exactly you're trying to do from your original code snippet. I presumed that you're trying to copy-paste range B2:D2 if found, but if not, just edit the code inside the if condition


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

This answer also presumes that the column P with sheetnames is in a Worksheet called "default"



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

关于excel - Excel VBA中不存在选项卡时的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51669860/

相关文章:

vba - 如何在VBA中调用另一个函数内的函数?

r - 为什么 write.xlsx2 不存储不同的电子表格?

vba - VBA 声明波动性的工作原理

c# - 通过 Open XML 将数据导出到支持宏的 Excel

excel - VBA在集合中按值获取键

vba - VBA sleep 不起作用

java - 为什么我的循环坏了? [20][6] 的二维数组

带有for循环的Java搜索数组找不到所有结果

python - 行追加不适用于循环

c# - NPOI:创建一个包含两个不同大小字符串的单元格