You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:04