我正在尝试制作一个宏来查看一张纸中的标题和另一张纸中的标题以复制数据,但并非所有标题都在第二张纸上,这会导致块变量未设置错误。我一直在尝试考虑错误检查,让它在空时跳过该值,但它拒绝播放。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```
该错误是您使用Find
的方式造成的。
当你这样做时...
RawRows = (RawData.Cells.Find(What:="*", SearchDirection:=xlPrevious).Row) - 1
您直接读取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