You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Excel VBA获取指定工作表每列的最后使用行号?

解决VBA获取多列最后行号后无法正确批量赋值的问题

嘿,我一眼就瞅到问题所在了——你遍历列获取最后行号的逻辑完全没问题,卡壳的地方在最后给单元格区域赋值的步骤

问题根源

VBA里的一维数组默认是「行方向」的,如果你直接把它赋值给B2:B18这种列方向的单元格区域,Excel会把数组元素横向填充(比如填到B2、C2...而不是B2、B3...),这就是为啥你只看到第一列的行号显示出来。另外还有个小细节:你遍历了18列,但B2:B18只有17个单元格,最后一个列的行号会被漏掉。

修正后的完整代码

Sub GetLastRowsPerColumn()
    Dim lastRow As Long
    Dim iCntr As Integer
    Dim arr2(18) As Long ' 明确指定数组类型为长整型,避免变体类型的潜在问题
    
    ' 遍历1到18列,逐个获取每列的最后使用行号
    For iCntr = 1 To 18
        With ActiveSheet
            lastRow = .Cells(.Rows.Count, iCntr).End(xlUp).Row
        End With
        arr2(iCntr - 1) = lastRow ' 数组索引从0开始,所以用iCntr-1对应
    Next iCntr
    
    ' 关键:用Transpose转置数组,把行方向数组转成列方向,再赋值给目标区域
    ' 同时修正目标区域为B2:B19,对应18个单元格
    Worksheets("Sheet1").Range("B2:B19").Value = WorksheetFunction.Transpose(arr2)
End Sub

核心修正点

  • 数组转置:通过WorksheetFunction.Transpose(arr2)把一维行数组转换成列数组,这样Excel就能按纵向填充到B列的单元格里。
  • 修正目标区域范围:把B2:B18改成B2:B19,保证18个单元格对应18列的行号结果,不会丢失最后一列的数据。
  • 明确数组类型:给arr2指定As Long,避免默认变体类型可能带来的性能或类型匹配问题。

额外小优化(可选)

如果以后需要处理的列数不固定,可以把固定的18换成动态获取的列数,比如:

Dim totalColumns As Integer
totalColumns = ActiveSheet.UsedRange.Columns.Count ' 获取当前工作表已使用的列数
ReDim arr2(totalColumns - 1) As Long ' 动态调整数组长度
For iCntr = 1 To totalColumns
    ' ... 其余逻辑不变
Next iCntr

内容的提问来源于stack exchange,提问作者Myna

火山引擎 最新活动