VBA代码优化请求:将卡号的三行数据合并为单行并解决输出空白行问题
解决Access卡号多行数据合并为单行的VBA问题
老哥,你这段VBA代码的问题出在循环变量的手动修改上——你在For循环里手动给i加了两次值,而Next i本身还会自动让i加1,相当于每次循环跳过了好几个行,这就导致输出出现空白行。给你两个靠谱的解决方案,保证每个卡号的三行数据稳稳合并成一行:
方案一:修正原代码的循环逻辑
核心是不要直接修改循环的i,用一个独立的变量来控制目标工作表的行号,避免循环变量混乱:
Sub ConsolidateData_Fixed() Dim targetRow As Integer ' 控制目标表的行号 targetRow = 2 ' 从第2行开始输出 ' 每3行源数据对应1行目标数据,所以循环步长设为3 For i = 2 To 19 Step 3 ' 第一行数据:A-D列 Sheet3.Range("A" & targetRow) = Sheet2.Range("A" & i) Sheet3.Range("B" & targetRow) = Sheet2.Range("B" & i) Sheet3.Range("C" & targetRow) = Sheet2.Range("C" & i) Sheet3.Range("D" & targetRow) = Sheet2.Range("D" & i) ' 第二行数据:E-G列 Sheet3.Range("E" & targetRow) = Sheet2.Range("B" & i + 1) Sheet3.Range("F" & targetRow) = Sheet2.Range("C" & i + 1) Sheet3.Range("G" & targetRow) = Sheet2.Range("D" & i + 1) ' 第三行数据:H-J列 Sheet3.Range("H" & targetRow) = Sheet2.Range("B" & i + 2) Sheet3.Range("I" & targetRow) = Sheet2.Range("C" & i + 2) Sheet3.Range("J" & targetRow) = Sheet2.Range("D" & i + 2) targetRow = targetRow + 1 ' 目标行下移一行 Next i End Sub
方案二:更健壮的通用写法(适合大量数据)
如果你的数据行数不是固定的19行,或者以后可能有变化,这个写法更灵活,会自动识别源数据的最后一行:
Sub ConsolidateData_General() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRow As Long, targetRow As Long Dim i As Long ' 定义源表和目标表 Set wsSource = ThisWorkbook.Sheets("Sheet2") Set wsTarget = ThisWorkbook.Sheets("Sheet3") ' 获取源数据最后一行 lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row targetRow = 2 ' 目标表起始行 ' 每3行处理一次 For i = 2 To lastRow Step 3 ' 第一行核心数据(卡号) wsTarget.Cells(targetRow, "A").Value = wsSource.Cells(i, "A").Value ' 合并三行的B-D列到目标行的B-J列 wsTarget.Range(wsTarget.Cells(targetRow, "B"), wsTarget.Cells(targetRow, "D")).Value = _ wsSource.Range(wsSource.Cells(i, "B"), wsSource.Cells(i, "D")).Value wsTarget.Range(wsTarget.Cells(targetRow, "E"), wsTarget.Cells(targetRow, "G")).Value = _ wsSource.Range(wsSource.Cells(i + 1, "B"), wsSource.Cells(i + 1, "D")).Value wsTarget.Range(wsTarget.Cells(targetRow, "H"), wsTarget.Cells(targetRow, "J")).Value = _ wsSource.Range(wsSource.Cells(i + 2, "B"), wsSource.Cells(i + 2, "D")).Value targetRow = targetRow + 1 Next i End Sub
两个方案的核心逻辑:
- 用
Step 3让循环每次跳过3行源数据,刚好对应一个卡号的三行条目 - 用独立的
targetRow变量控制目标表的输出位置,避免和循环变量i冲突 - 方案二还自动识别源数据的最后一行,不用手动写死循环范围,适用性更强
内容的提问来源于stack exchange,提问作者npgadmin
相关产品推荐
相关产品推荐

