如何用VBA查找A-Z列最后已用行后的首空行并写入文本框值
解决A-Z列范围内定位最后已用行后首个空行的VBA方案
你之前用CountA(A:A)只能基于A列判断空行,如果A列有空白但其他列(比如B-Z)还有数据,就会导致写入位置错误;而直接用CountA(A:Z)会统计整个区域的非空单元格总数,不是我们需要的最后行号,这里给你两个可靠的解决方案:
方法一:用Find方法精准定位(推荐)
这个方法会在A-Z列范围内从下往上查找最后一个非空单元格,不管哪一列有数据,都能准确找到最后已用行,还能处理整个区域为空的情况:
Private Sub CommandButton1_Click() Dim ws As Worksheet Set ws = Worksheets("Sheet") Dim lastRow As Long Dim newRow As Long ' 在A-Z列范围内反向查找最后一个非空单元格的行号 On Error Resume Next ' 处理A-Z列全为空的情况 lastRow = ws.Range("A:Z").Find(What:="*", _ After:=ws.Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row On Error GoTo 0 ' 确定首个空行:如果全为空则从第1行开始,否则最后已用行+1 newRow = IIf(lastRow = 0, 1, lastRow + 1) ' 写入文本框内容到对应列 ws.Cells(newRow, 2).Value = TVehicle.Value ws.Cells(newRow, 3).Value = TPlace.Value ws.Cells(newRow, 4).Value = TRange.Value ws.Cells(newRow, 5).Value = TOD.Value ws.Cells(newRow, 6).Value = TIC.Value ws.Cells(newRow, 7).Value = TEC.Value ' 继续添加其他文本框的写入代码... End Sub
代码说明
Find的SearchDirection:=xlPrevious参数是关键,从A1开始反向(从下往上)查找,确保找到的是A-Z列里最靠下的非空单元格。- 错误处理语句是为了防止A-Z列完全为空的情况,此时
Find会返回Nothing,lastRow会保持0,通过IIf把newRow设为1。
方法二:用UsedRange配合空行检查
如果习惯用UsedRange,需要额外检查最后一行是否全为空(因为UsedRange可能包含之前用过后来清空的行):
Private Sub CommandButton1_Click() Dim ws As Worksheet Set ws = Worksheets("Sheet") Dim lastRow As Long Dim newRow As Long ' 获取工作表已使用区域的最后一行 lastRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row ' 检查最后一行在A-Z列是否全为空,往上遍历直到找到有数据的行 Do While lastRow > 0 And Application.WorksheetFunction.CountA(ws.Range("A" & lastRow & ":Z" & lastRow)) = 0 lastRow = lastRow - 1 Loop newRow = lastRow + 1 ' 写入文本框内容 ws.Cells(newRow, 2).Value = TVehicle.Value ws.Cells(newRow, 3).Value = TPlace.Value ws.Cells(newRow, 4).Value = TRange.Value ws.Cells(newRow, 5).Value = TOD.Value ws.Cells(newRow, 6).Value = TIC.Value ws.Cells(newRow, 7).Value = TEC.Value ' 继续添加其他文本框的写入代码... End Sub
代码说明
UsedRange会返回工作表中所有被编辑过的区域,但有时候删除内容后它不会自动收缩,所以需要通过CountA检查每行是否全为空,循环往上找到真正的最后已用行。
内容的提问来源于stack exchange,提问作者MrAlex01
相关产品推荐
相关产品推荐

