如何遍历Query1工作表的已填充行并完成批量打印处理?
遍历Query1工作表数据并批量打印的VBA解决方案
要实现逐行处理Query1的所有数据、打印并清空Routing Card,核心是先确定Query1的有效行数,再用循环逐行执行原有逻辑。以下是修改后的代码和关键说明:
关键修改要点
- 获取有效行数:通过
Sheets("Query1").UsedRange.Rows.Count获取Query1已填充的总行数,适配OData刷新后行数变化的情况 - 动态行号替换:把原代码中固定的行号(如
D2)改成D & i,i为循环当前的行号,实现逐行引用 - 移除冗余的Select/Activate:直接通过工作表对象引用单元格,避免界面跳转,提升代码稳定性和效率
完整VBA代码
Sub PrintAllRoutingCards() Dim wsQuery As Worksheet Dim wsRouting As Worksheet Dim lastRow As Long Dim i As Long ' 定义工作表对象,避免重复查找 Set wsQuery = ThisWorkbook.Sheets("Query1") Set wsRouting = ThisWorkbook.Sheets("Routing Card") ' 获取Query1的最后一行(含表头,所以循环从第2行开始) lastRow = wsQuery.UsedRange.Rows.Count ' 遍历第2行到最后一行的所有数据 For i = 2 To lastRow ' 填充Routing Card数据,动态替换行号i wsRouting.Range("A2:A3").Formula = "=Query1!D" & i wsRouting.Range("A5:A6").Formula = "=Query1!B" & i wsRouting.Range("A8:A9").Formula = "=Query1!C" & i wsRouting.Range("A11:A12").Formula = "=Query1!J" & i wsRouting.Range("B11:B12").Formula = "=Query1!AE" & i wsRouting.Range("B1:C9").Formula = "=A5" wsRouting.Range("A15:C25").Formula = "=Query1!CH" & i ' 打印当前Routing Card wsRouting.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False ' 清空指定单元格 wsRouting.Range("A2:A3,A5:A6,A8:A9,A11:A12,B11:C12,B1:C9,A15:C25").ClearContents Next i ' 释放对象 Set wsQuery = Nothing Set wsRouting = Nothing End Sub
补充说明
- 如果Query1的表头不在第1行,需要调整循环的起始行(比如表头在第3行,就改成
For i = 4 To lastRow) UsedRange会包含所有曾经使用过的单元格,若需要更精准的有效数据行,可以用wsQuery.Cells(wsQuery.Rows.Count, "A").End(xlUp).Row,以A列最后一个非空单元格为准
内容的提问来源于stack exchange,提问作者stuart
相关产品推荐
相关产品推荐

