打印后自动保存到另外一个表中?
关于通过Excel模板填写数据,打印后自动保存到另外一个表中,并清空本模板数据的问题,可以通过VBA写程序来实现,但是,这种需求基本都要求个性化定制开发,因此,通常 不会有详细的教程。因此,如果你希望实现类似的功能,建议如下:
1、花点儿钱请人完成并帮忙跟进维护(出问题及时解决,以及以后不断改进);
2、自己学VBA,然后上网找一些近似的案例来参考,然后根据自己的需要进行开发。
对于以上提及的第2点,我曾用VBA开发的一个库存信息管理系统的案例供参考。功能包括开单发货、收货入账、库存查询、调整改单等,如下图所示:
其中您提及的按Excel模板填写数据,打印后自动保存到另外一个表中,并清空本模板数据的问题,跟其中的“开单发货”或“收货入账”功能十分类似,以其中“开单发货”为例进行说明。
具体模板及功能按钮设计如下图所示:
其中橙色空格为可填写位置,同行相关内容会自动带出,填写完毕后,单击“打单发货”,会连接打印机打印该单据,然后,将相应的数据写入到收发货表里,如下图所示:
其中,“打单发货”功能的核心代码如下:
Sub 开单发货()
' 将发货单数据添加到收发货表并打印单据
' On Error GoTo ErrProcess
Call UnlockWorksheet(DecisionSupport)
Call UnlockWorksheet(InOutData)
'===================================判断发货单信息是否已完整================================
'
If Range("B3").Value = "" Then
MsgBox "亲,未选择客户,你到底要把货发给谁呢?", vbOKOnly, "订单信息不完整"
Range("B3").Select
Exit Sub
ElseIf Range("E3").Value = "" Then
MsgBox "亲,不填写订单日期会导致做账不准的哦。", vbOKOnly, "订单信息不完整"
Range("E3").Select
Exit Sub
Else '判断产品信息是否完整
Dim rowOfGoods As Integer
'判断产品信息中的第一行(row(5))是否完整
rowOfGoods = 5
If Application.WorksheetFunction.CountA(Range("A" & rowOfGoods & ":H" & rowOfGoods)) <= 3 Then
MsgBox "亲,订单必须包含至少一个产品信息,并且应从第5行起按顺序填写的哦!", vbOKOnly, "订单信息不完整"
Range("B" & rowOfGoods).Select
Exit Sub
Else
If Range("B" & rowOfGoods).Value = "" Or Range("C" & rowOfGoods).Value = "" Or Range("D" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行产品信息不完整,应包含【系列、名称、颜色】的哦!", vbOKOnly, "订单信息不完整"
Range("B" & rowOfGoods).Select
Exit Sub
ElseIf Range("F" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行未输入产品数量哦!", vbOKOnly, "订单信息不完整"
Range("F" & rowOfGoods).Select
Exit Sub
ElseIf Range("G" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行未输入产品价格哦!", vbOKOnly, "订单信息不完整"
Range("G" & rowOfGoods).Select
Exit Sub
End If
End If
'判断产品信息中的其他行(row(6-13))如果有信息的话是否完整
For rowOfGoods = 6 To 13
If Application.WorksheetFunction.CountA(Range("A" & rowOfGoods & ":H" & rowOfGoods)) > 3 And Application.WorksheetFunction.CountA(Range("A" & rowOfGoods - 1 & ":H" & rowOfGoods - 1)) > 3 Then
If Range("B" & rowOfGoods).Value = "" Or Range("C" & rowOfGoods).Value = "" Or Range("D" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行产品信息不完整,应包含【系列、名称、颜色】的哦!", vbOKOnly, "订单信息不完整"
Range("B" & rowOfGoods).Select
Exit Sub
ElseIf Range("F" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行未输入产品数量哦!", vbOKOnly, "订单信息不完整"
Range("F" & rowOfGoods).Select
Exit Sub
ElseIf Range("G" & rowOfGoods).Value = "" Then
MsgBox "亲,第" & rowOfGoods & "行未输入产品价格哦!", vbOKOnly, "订单信息不完整"
Range("G" & rowOfGoods).Select
Exit Sub
End If
'中间有空行的提示
ElseIf Application.WorksheetFunction.CountA(Range("A" & rowOfGoods & ":H" & rowOfGoods)) > 3 And Application.WorksheetFunction.CountA(Range("A" & rowOfGoods - 1 & ":H" & rowOfGoods - 1)) <= 3 Then
MsgBox "亲,第" & rowOfGoods - 1 & "行产品信息为空,会给客户很不好的印象的哦!", vbOKOnly, "订单信息不规范"
Exit Sub
End If
Next
End If
'===================================自动生成发货单订单编号================================
'发货单订单编号格式: "F"+"yyyymmdd"+三位序列号,如2012年3月1日第2张发货单,订单编号为:F20120301002
'订单编号由系统自动生成,其中所用"yyyymmdd"不一定与订单日期一致,由此可体现单据是否当天完成等情况
Dim orderNumber As String
Dim yearOfDate As String
Dim monthOfDate As String
Dim dayOfDate As String
Dim lastOrderDate As Date
Dim lastOrderNumber As Integer
'取得制单当天年月日
yearOfDate = Str(Year(Date))
yearOfDate = Right(yearOfDate, 4)
monthOfDate = Str(Month(Date))
If Len(monthOfDate) = 2 Then
monthOfDate = "0" & Right(monthOfDate, 1)
Else
monthOfDate = Right(monthOfDate, 2)
End If
dayOfDate = Str(Day(Date))
If Len(dayOfDate) = 2 Then
dayOfDate = "0" & Right(dayOfDate, 1)
Else
dayOfDate = Right(dayOfDate, 2)
End If
'生成订单编号前段
orderNumber = "F" & orderNumber & yearOfDate & monthOfDate & dayOfDate
lastOrderDate = DecisionSupport.Range("J3").Value
lastOrderNumber = DecisionSupport.Range("K3").Value
'判断前期所用订单编号情况,并将新的订单编号情况更新到最后订单编号记录(决策信息表中的J3:K3中)
If lastOrderDate = Date Then
lastOrderNumber = lastOrderNumber + 1
If lastOrderNumber < 10 Then
orderNumber = orderNumber & "00" & lastOrderNumber
ElseIf lastOrderNumber < 100 Then
orderNumber = orderNumber & "0" & lastOrderNumber
Else
orderNumber = orderNumber & lastOrderNumber
End If
DecisionSupport.Range("K3").Value = lastOrderNumber
Else
DecisionSupport.Range("J3").Value = Date
DecisionSupport.Range("K3").Value = 1
orderNumber = orderNumber & "001"
End If
'将订单编号填写到发货单中一并打印
Bill.Range("H3").Value = orderNumber
Bill.Range("I15").Value = getOperatorName()
'设置屏幕不更新,加快程序执行速度
Application.ScreenUpdating = False
'==============================================清除发货单提醒颜色============================================
Call 清除发货单提醒颜色
'==================================================打印发货单================================================
'要求预先设置好默认打印机
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
'=========================================导入发货数据到收发货汇总表=========================================
'=== 为避免打印出错时数据已导入,因此改为在打印后再导入数据 ===
Dim startRowNumber As Integer
Dim OrderItems As Integer
Dim i As Integer
startRowNumber = Application.WorksheetFunction.CountA(InOutData.Range("G:G"))
OrderItems = Application.WorksheetFunction.CountA(Bill.Range("C5:C13"))
For i = 1 To OrderItems
InOutData.Range("C" & startRowNumber + i).Value = getOperatorName()
InOutData.Range("D" & startRowNumber + i).Value = Bill.Range("E3").Value
InOutData.Range("E" & startRowNumber + i).Value = Bill.Range("H3").Value
InOutData.Range("F" & startRowNumber + i).Value = Bill.Range("B" & 4 + i).Value
InOutData.Range("G" & startRowNumber + i).Value = Bill.Range("C" & 4 + i).Value
InOutData.Range("H" & startRowNumber + i).Value = Bill.Range("D" & 4 + i).Value
InOutData.Range("I" & startRowNumber + i).Value = Bill.Range("B3").Value
InOutData.Range("J" & startRowNumber + i).Value = "发货"
InOutData.Range("K" & startRowNumber + i).Value = -Bill.Range("F" & 4 + i).Value
InOutData.Range("L" & startRowNumber + i).Value = Bill.Range("G" & 4 + i).Value
Next i
'================================================清除发货单内容==============================================
'
Call 清除发货单内容
'==============================================恢复发货单提醒颜色=============================================
'
Call 恢复发货单提醒颜色
'恢复选定单元格到选择客户位置(B3),并设置程序屏幕为可更新
Range("B3").Select
Application.ScreenUpdating = True
Call LockWorksheet(DecisionSupport)
Call LockWorksheet(InOutData)
Exit Sub
'ErrProcess:
' MsgBox "系统【开单发货功能】发生错误,请与系统开发人员联系。" , vbOKOnly, "程序错误"
' Call 清除发货单内容
' Call 恢复发货单提醒颜色
End Sub
其中包含多个数据校验和调用相关清空数据、恢复背景颜色等过程,可根据实际需要自行编写。
总的来说,类似VBA的应用可以做到非常灵活,但是,基本都需要按照自己的需要进行单独的开发。一般建议如果自身没有开发能力,尽可能找有技术的人员帮忙开发和持续跟进运维。
更多精彩内容,尽在【Excel到PowerBI】我是大海,微软认证Excel专家,企业签约Power BI顾问让我们一起学习,共同进步!