
本文于2023年9月6日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
内容提要
设置用户窗体
循环设置连续编号并打印
大家好,我是冷水泡茶,昨天微信上有一朋友问我,编号递增可以做吗?

他的表格是这样的,下面还有一张一样的,只不过序号增加1号:

在我们分享过的【Excel VBA 凭证打印】一文中,我们把凭证按照凭证号逐条写入凭证打印模板,然后打印,凭证号也是不断变化的,不同的是,当下这个案例,编号是在上次编号的基础上递增。
感觉应该是不难,通过循环,把编号后面连续的数字递增,写入单元格,然后打印,再进行下一张......
昨天晚上按我自己的理解基本做好,但由于后面几位数字的编码规则理解有误,今天上午又调整、优化了一下,交差。
据说效果还不错,在征得他的同意后,我把这个案例在公众号分享给大家:
基本思路:
1、通过输入起始编号与结束编号,循环打印。
2、起始编号,我们可以读取当前表中的编号,加上1作为新的起始编号。
3、我们设置一个编号数量,根据起始编号加上编号数量,可以计算出结束编号的值。
4、由于编号中包含前缀,不是纯数字,我们可以把前缀提取出来,在打印的时候再与数字编号拼接成统一格式的完整编号。
5、我们设置一个用户窗体,把上述数据以文本框、标签、组合框等控件放置在用户窗体上:

VBA代码
1、在用户窗体,UserForm_Initialize窗体初始化:
Dim firstPart As StringDim ws As WorksheetPrivate Sub UserForm_Initialize() Dim lastNo As String Dim lastNumber As Integer On Error Resume Next Set ws = ThisWorkbook.ActiveSheet lastNo = ws.Range("D18") lastNumber = CInt(Right(lastNo, 5)) firstPart = Left(lastNo, 6) Me.TxbFirstPart = firstPart With Me.CmbYear .Clear .AddItem Year(Date) - 1 .AddItem Year(Date) .AddItem Year(Date) + 1 .Text = Year(Date) End With With Me.CmbNumbers For i = 2 To 100 Step 2 .AddItem i Next .Text = 100 End With Me.TxbBeginNo = lastNumber + 1 Me.LbEndNo = CInt(Me.TxbBeginNo) + CInt(Me.CmbNumbers) - 1End Sub
代码解析:
(1)定义一些变量。
(2)line8,读取最后一次完整编号lastNo。
(3)line9,取得编号的数字部分lastNumber,这里根据编号规则来,它是“年度”+5位数字。
(4)line10~11,取得编号的前缀部分,是6位文本,存入文本框,可以修改,但最好保持6位,否则下次再打印仍要修改。当然,最好是保持不变。
(5)line12~18,“年度”组合框赋值,设置当前年度加上前后年度,默认为当前年度。
(6)line19~24,打印号数,预置100个号码,默认100(因为本次他要打印100号),可以修改。由于每张纸打印两个号码,所以打印号数都为偶数,从2开始循环,设置步长为2,给组合框添加下拉列表。
(7)line25~26,设置起始编号为上次编号数字+1,再设置结束编号。
2、在用户窗体,CmdPrint_Click打印按钮:
Private Sub CmdPrint_Click() Application.ScreenUpdating = False On Error Resume Next Dim currNo As String Dim num As Integer num = CInt(Me.LbEndNo) - CInt(Me.TxbBeginNo) + 1 If num Mod 2 = 1 Then MsgBox "请增加号减少一个编号!" Exit Sub End If If Not wContinue("即将打印【" & Me.CmbYear & "】" & Me.TxbBeginNo & "-" & Me.LbEndNo & "号!确认单!" & Chr(10)) Then Exit Sub If Application.Dialogs(xlDialogPrinterSetup).Show = False Then Exit Sub End If With ws.PageSetup .Zoom = False .FitToPagesWide = 1 '//页宽是一页 .FitToPagesTall = 1 '//页高是1页 .PaperSize = xlPaperA4 '//纸张大小 End With For i = CInt(Me.TxbBeginNo) To CInt(Me.LbEndNo) k = k + 1 currNo = firstPart & Me.CmbYear & Format(i, "00000") Debug.Print currNo If k Mod 2 Then ws.Range("d3") = currNo Else ws.Range("D18") = currNo ws.PrintOut copies:=1 End If Next Application.ScreenUpdating = True Unload MeEnd Sub
代码解析:
(1)定义一些变量。
(2)line6~10,检查输入的打印编号数是不是偶数。这段代码是在前一版本的代码,后来调整了控件,目前也可以直接判断打印号数CmbNumbers是否为偶数。
(3)line11,给出一个确认提示,防止误操作。
(4)line12~14,显示选择打印机对话框。
(5)line15~20,设置页面为A4大小,1页。最好先在Excel界面,手工把页面设置为1页,以免格式错乱。
(6)line21~31,循环起始编号到结束编号,由于每页要打印两个号,所以这里特别处理一下,当循环到奇数次的时候,编号填在上半张编号位置,当循环至偶数次数的时候,编号填在下半张编号位置,并打印出来,这也是为何打印号数必须是偶数的原因,否则最后一号可能打印不出来。
3、在用户窗体,其他过程:
Private Sub CmbNumbers_Change() If Me.TxbBeginNo = "" Then Exit Sub Me.LbEndNo = CInt(Me.TxbBeginNo) + CInt(Me.CmbNumbers) - 1End SubPrivate Sub TxbBeginNo_Change() If Me.TxbBeginNo = "" Then Exit Sub If Me.CmbNumbers = "" Then Exit Sub Me.LbEndNo = CInt(Me.TxbBeginNo) + CInt(Me.CmbNumbers) - 1End SubPrivate Sub CmdExit_Click() Unload MeEnd SubFunction wContinue(Msg) As Boolean '确认继续函数 Dim Config As Long Config = vbYesNo + vbDefaultButton2 + vbQuestion Ans = MsgBox(Msg & Chr(10) & "是(Y)继续?" & Chr(10) _ & "否(N)返回!", Config, "请确认操作!") wContinue = Ans = vbYesEnd Function
代码解析:
(1)line1~4,打印号数change事件,计算结束编号。
(2)line6~10,起始编号change事件,计算结束编号。
(3)line12~14,退出按钮。
(4)line16~23,确认继续函数,这个函数我们分享过多次了,经常会用到。
来一个动画演示

~~~~~~End~~~~~~