打印后自动保存到另外一个表中

笔记2024-02-123 人已阅来源:网络

打印后自动保存到另外一个表中?

关于通过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顾问让我们一起学习,共同进步!