如何用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




