VBA中使用Range与数组函数时如何排除数据区域首行?
问题原因
你遇到的问题是CurrentRegion的特性导致的:CurrentRegion会返回指定单元格所属的整个连续数据区域,和你初始选中的Range起始位置无关,只要AD列第一行和第二行数据是连续的,返回的区域就会自动包含首行内容,所以你读取的数组里默认就带了第一行数据。
解决方案
提供两种修改思路,你可以按需选择:
方案1:遍历数组时跳过首行(修改量最小)
直接调整数组循环的起始下标,从第二行开始遍历即可,只需要修改循环行的代码:
把For i = LBound(arr) To UBound(arr)
改成For i = LBound(arr) + 1 To UBound(arr)
即可,其他代码不需要改动。
方案2:读取数组时直接排除首行
先拿到完整的连续区域,再偏移一行后再赋值给数组,这样数组本身就不包含首行内容,修改读取数组的代码:
' 先拿到完整连续区域 Dim dataRng As Range Set dataRng = TB.Range("AD2:AK2").CurrentRegion ' 偏移1行去掉首行,再读取到数组 arr = dataRng.Offset(1).Resize(dataRng.Rows.Count - 1).Value2
这个方案的好处是后续遍历不需要调整下标,数组本身就只有你需要的内容。
修改后的完整代码示例(采用方案1)
Function copyTBdata() Dim TB As Worksheet, fd As Worksheet Set TB = ThisWorkbook.Worksheets("TB") Set fd = ThisWorkbook.Worksheets("FD") Dim arr As Variant arr = TB.Range("AD2:AK2").CurrentRegion.Value2 Dim i As Long, J As Long Dim row As Long, column As Long row = 240 ' 起始下标加1,跳过首行内容 For i = LBound(arr) + 1 To UBound(arr) If arr(i, 2) <> "NULL" Then ' 逐列复制内容 For J = LBound(arr, 2) To UBound(arr, 2) fd.Cells(row, J).Value2 = arr(i, J) Next J ' 输出行下移 row = row + 1 End If Next i End Function
内容的提问来源于stack exchange,提问作者Don Nalaka
相关产品推荐
相关产品推荐

