VBA设置变量时如何处理错误?

0 excel vba

我正在尝试制作一个宏来查看一个工作表中的标题,并查看另一个工作表中的标题以复制数据,但是并非所有的标题都在第二个工作表中,这导致了块变量未设置错误。我一直在尝试进行错误检查,以使其在为空时跳过该值,但它拒绝播放。TD和RawData是全局变量。我的代码如下:


Dim FromCol As Integer
Dim ToCol As Integer
Dim RawRows As Integer
Dim TDCols As Integer
Dim i As Integer
Dim element As Variant

'set variables
RawRows = (RawData.Cells.Find(What:="*", SearchDirection:=xlPrevious).Row) - 1
TDCols = TD.Cells(1, Columns.Count).End(xlToLeft).Column

Dim colArray(200) As String

For i = 2 To (TDCols + 1)
    colArray(i) = TD.Cells(1, i).Value
Next i

'Copy Data
For Each element In colArray
        FromCol = RawData.Range("1:1").Find(element, LookIn:=xlValues, lookat:=xlWhole).Column
        ToCol = TD.Range("1:1").Find(element, LookIn:=xlValues, lookat:=xlWhole).Column

        For i = 2 To (RawRows + 1)
            TD.Cells(i, ToCol).Value = RawData.Cells(i, FromCol).Value
        Next i
Next element

End Sub```


Run Code Online (Sandbox Code Playgroud)

Pro*_*ous 5

该错误是您使用方式的结果Find

当您这样做时...

RawRows = (RawData.Cells.Find(What:="*", SearchDirection:=xlPrevious).Row) - 1
Run Code Online (Sandbox Code Playgroud)

您正在直接读取所返回范围的行号Find。当没有匹配项时,这是一个问题,因为返回的范围是字面上的Nothing。您不可能一无所获。因此,您的错误。

为避免该错误,您必须Set将返回的范围返回到范围变量,测试该变量的Nothing,如果变量不是,则仅读取该行Nothing

Sub YourSub()
    Dim findInSheet As Worksheet
    Dim findResult As Range
    Dim rowNumber As Long
     [...]
    Set findResult = findInSheet.Range.Find( [...] )
    If Not findResult Is Nothing Then  'a match was found
        rowNumber = findResult.Row
         [...]
    Else  'a match was not found
       [...] 
    End If
     [...]
End Sub
Run Code Online (Sandbox Code Playgroud)