我正在尝试制作一个宏来查看一个工作表中的标题,并查看另一个工作表中的标题以复制数据,但是并非所有的标题都在第二个工作表中,这导致了块变量未设置错误。我一直在尝试进行错误检查,以使其在为空时跳过该值,但它拒绝播放。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)
该错误是您使用方式的结果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)