如何修改VBA循环打印PDF代码,实现周六跳过PNB银行记录打印?
循环导出PDF的VBA代码修改方案
以下是满足需求的修改后代码,核心逻辑已针对周六的特殊规则进行调整:
Sub PrintPDF() Dim WSDATA As Worksheet Dim WSFormat As Worksheet Dim LastRow As Long Dim Batch As String Dim fname As Variant Dim exportRange As Range Dim i As Long Dim Code As String Dim Bank As String Dim SDate As String Dim isSaturday As Boolean Dim hasNonPNB As Boolean Set WSDATA = ThisWorkbook.Sheets("Data") Set WSFormat = ThisWorkbook.Sheets("DV Format") Set exportRange = WSFormat.Range("$A$1:$AD$50") Path = WSDATA.Range("C3").Value Batch = WSDATA.Range("C2").Value LastRow = WSDATA.Range("B" & Rows.Count).End(xlUp).Row '判断当前是否为周六(VBA中Weekday默认周日为1,周六对应6) isSaturday = (Weekday(Date) = 6) '提前检查是否存在非PNB的有效记录(B列非空) hasNonPNB = False If isSaturday Then For i = 5 To LastRow If WSDATA.Range("B" & i) <> "" And WSDATA.Range("G" & i) <> "PNB" Then hasNonPNB = True Exit For End If Next i '如果周六且所有有效记录银行都是PNB,直接退出 If Not hasNonPNB Then Exit Sub End If End If For i = 5 To LastRow Code = WSDATA.Range("B" & i) If Code <> "" Then Bank = WSDATA.Range("G" & i) '周六且当前记录银行为PNB,跳过导出 If isSaturday And Bank = "PNB" Then GoTo NextRecord End If fname = Code & " " & Bank SDate = WSDATA.Range("D" & i).Value If SDate = "" Then SDate = UCase(Format((Date - 1), "MMMMDD.YYYY")) Else SDate = Replace(Replace(UCase(SDate), " ", ""), ",", ".") End If '填充格式表数据 WSFormat.Range("W16").Value = WSDATA.Range("C" & i).Value WSFormat.Range("B16").Value = WSDATA.Range("E" & i).Value WSFormat.Range("B12").Value = WSDATA.Range("F" & i).Value WSFormat.Range("M13").Value = Bank WSFormat.Range("N12").Value = WSDATA.Range("H" & i).Value WSFormat.Range("R13").Value = WSDATA.Range("I" & i).Value WSFormat.Range("Z13").Value = WSDATA.Range("J" & i).Value WSFormat.Range("E8").Value = WSDATA.Range("K" & i).Value WSFormat.Range("E9").Value = WSDATA.Range("L" & i).Value WSFormat.Range("W8").Value = WSDATA.Range("C1").Value '导出PDF exportRange.ExportAsFixedFormat Type:=xlTypePDF, IgnorePrintAreas:=False, _ Filename:=Path & fname & " " & SDate & "-" & Batch, OpenAfterPublish:=False End If NextRecord: Next i End Sub
关键逻辑说明
- 周六判断:用
Weekday(Date) = 6识别当前日期是否为周六(VBA默认周日为一周第1天) - 全PNB记录检查:在循环导出前先遍历所有有效记录,若周六且所有非空编码的记录银行都是PNB,直接终止程序
- 单条记录跳过:周六时,遇到B列有编码且G列银行为PNB的记录,通过
GoTo跳过后续导出流程 - 变量声明优化:补充了所有未声明的变量,避免隐式类型转换问题
内容的提问来源于stack exchange,提问作者Domingo Ballesil Jr
相关产品推荐
相关产品推荐

