ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 行业案例 > 财会金融 > 浙江省国家税务局外销机打发票自动打印系统

浙江省国家税务局外销机打发票自动打印系统

作者:绿色风 分类:财会金融 时间:2022-08-18 浏览:152
楼主
yjzstar
1、登陆界面:

 
2、机打外销发票实际模板:(由于是扫描件,所以有些模糊,请大家见谅!)

 
3、打印系统效果及操作展示:

 

注:系统登陆密码每个用户都为111
07 10版外销开票系统.zip
03版外销开票系统.zip
2楼
yjzstar
【制作流程】
一、基础表格简介
1、开票数据表
      开票数据表中存放实际开票的数据,相当于是一个外贸的发货明细表,其中包含字段:“单位名称”、“产品规格”、“数量”、“外币单价”、“币种”、“价格条款”、“目的港”、“海运费”、“保费”、“发票号码”、“是否已开票”以上11个标题字段(以上字段可以根据实际情况进行更改或增加,但注意修改对于的代码)
2、用户信息表
      该表为登陆界面而设置,如果是小型企业,只有一个人打印开票的完全可以删掉该表,同时删除登陆界面!
3、开票打印表
     该表为实际打印模板表,该表的取数都是通过VBA代码取自开票数据表,该表中的各项设置都直接影响了打印结果,所以该表为设计中的核心,所有的代码都是围绕该表进行设置!

二、开票打印表的具体设置
    打印表中的数据分为两块,一块为VBA直接在开票数据表中直接取得,另一部分为公式或数据有效性设置!表哥表姐们可以分别点进有数据的单元格查看是否有公式或其他设置,如果为纯数值就是有VBA直接在开票数据中取数而得,这部分就不进行讲解!另一部分为有公式或数据有效性设置的:表中的公式都很简单,首先是B5单元格(日期)
  1. =TODAY()
日期的格式为自定格式“[$-409]mmm d yyyy;@”

 
单元格B11(出口港设置)这边定义了两个港口,分别是上海港及宁波港,引用数据区域为”O9:O10”:

 
如果有其他港口,如乍浦港,可以重新设置或增加。这边设置数据有效性的目的不仅是为了方便用户选择,还是为了B15及B16的的取数B15及B16的公式分别为:
  1. =IF(B11="SHANGHAI","","合同协议号:")
  1. =IF(B11="SHANGHAI","",O14)
其中O14单元格为发票号码(及合同协议号)是通过VBA直接取数而来!G17单元格公式:
  1. =IF(O15="FOB","FOB"&" " & B11,IF(O15="EXW","EXW",O15 & " "&G11))
其中O15为价格条款,G11为目的港,这两个单元格均为VBA直接取数(注:FOB时取的是出口港,而CFR、CIF、DDP都是引用目的港的)最后是H48单元格,及对应业务员名字,其中公式为:
  1. =VLOOKUP(H46,用户信息!A:D,4,0)
注:这是根据我们自己单位的实际情况设置的,及某一开票人对应某一业务员,表哥表姐们可以根据实际情况进行设置!
3楼
yjzstar
三、窗体、控件及代码设置

1、登陆界面设置
      ALT+F11进入代码编辑界面,插入窗体,依次在窗体上插入1个图像框、1个复合框,1个文本框,3个标签及两个命令按钮。设置窗体的Caption属性值为“登陆”;两个命令按钮的Caption属性值分别为“确定”及“取消”;设置图像框的Picture属性为自己喜欢的图片,及登陆见面上的图片:

 
登陆界面代码:
窗体代码:(双击窗体空白处进入)
  1. Private Sub UserForm_Initialize()
  2.     Dim rng As Range
  3.     With Sheet2
  4.         Set rng = .Range("A65536").End(xlUp)
  5.     End With
  6.     Me.ComboBox1.List = Sheet2.Range("A1:A" & rng.Row).Value
  7. End Sub
  8. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  9.     If CloseMode = 0 Then
  10.         MsgBox "请单击【取消】按钮来关闭窗体"
  11.         Cancel = True
  12.     End If
  13. End Sub
确定按钮代码:(双击确定按钮)
  1. Private Sub CommandButton1_Click() '确定按钮
  2.     Dim rng As Range
  3.     Set rng = Sheet2.Range("A1:A50").Find(what:=Me.ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
  4.     If rng.Offset(0, 1).Value = Me.TextBox1.Text Then
  5.         Sheet2.Range("C1:C20").Clear
  6.         rng.Offset(0, 2).Value = "√"
  7.         Unload Me
  8.         Application.Visible = True
  9.         With Sheet1
  10.             .Select
  11.             .Range("H46") = Me.ComboBox1.Value
  12.         End With
  13.         With Sheet1
  14.             .CommandButton1.Visible = False
  15.             .CommandButton2.Visible = False
  16.             .CommandButton3.Visible = True
  17.             .CommandButton4.Visible = False
  18.             .CommandButton5.Visible = False
  19.         End With
  20.         If rng.Text = "超级用户" Then
  21.             Sheet2.Visible = True
  22.         Else
  23.             Sheet2.Visible = False
  24.         End If
  25.     Else
  26.         MsgBox "密码不正确,请重新输入!", 64, "提示!"
  27.         Me.TextBox1 = ""
  28.     End If
  29. End Sub
取消按钮代码:
  1. Private Sub CommandButton2_Click()  '取消按钮
  2.     Unload Me
  3.     Application.DisplayAlerts = False
  4.     Application.Quit
  5. End Sub
4楼
yjzstar
2、开票打印表中各个命令按钮的生成方法及相应代码
开票打印表中功能区的具体情况如下:

 
5个命令按钮,分别实现不同的效果,分别为“打印”、“查询”、“信息获取”、“上一张”、“下一张”,生成方法为“开发工具”->“插入”->“命令按钮”在合适的地方拖动鼠标左键便可以生成

 
每个命令按钮的具体代码如下:

打印按钮:
  1. Private Sub CommandButton1_Click() '打印
  2.     Dim n As Integer
  3.     Dim i As Integer
  4.     Dim rng As Range
  5.     On Error Resume Next
  6.     If RNGZ1.Offset(0, 1).Value = "√" Then
  7.         If MsgBox("改发票已经打印过,是否重新打印?", vbYesNo) = vbYes Then
  8.             Sheet1.PrintOut
  9.             If Err.Number = 1004 Then
  10.                 MsgBox "请检查打印机设置或连接!"
  11.                 Exit Sub
  12.             End If
  13.         End If
  14.     Else
  15.         Sheet1.PrintOut
  16.         If Err.Number = 1004 Then
  17.                 MsgBox "请检查打印机设置或连接!"
  18.                 Exit Sub
  19.         End If
  20.         For i = 0 To NN - 1
  21.             RNGZ1.Offset(i, 1).Value = "√"
  22.         Next i
  23.     End If
  24.     n = Sheet3.Range("J65536").End(xlUp).Row
  25.     Set rng = RNGZ.Offset(1, 0)
  26.     If RNGZ.Row = n Then
  27.         MsgBox "已经是最后一张!", 64, "提示!"
  28.     Else
  29.         Call xinxihuoqu(rng)
  30.     End If
  31. End Sub
查询按钮:
  1. Private Sub CommandButton2_Click() '查询
  2.     Dim rng As Range
  3.     Set rng = Sheet3.Range("J1:J6000").Find(what:=Sheet1.Range("O14").Value, LookIn:=xlValues)
  4.     Call xinxihuoqu(rng)
  5. End Sub
信息获取按钮:
  1. Private Sub CommandButton3_Click() '信息获取
  2.     Dim rng As Range
  3.     If Sheet3.Range("a65536").End(xlUp).Row = 1 Then
  4.         MsgBox "开票数据中没有信息,请确认后再获取信息!", 64, "提示!"
  5.         Exit Sub
  6.     End If
  7.     Set rng = Sheet3.Range("J2")
  8.     Call xinxihuoqu(rng)
  9.     With Sheet1
  10.         .CommandButton1.Visible = True
  11.         .CommandButton2.Visible = True
  12.         .CommandButton4.Visible = True
  13.         .CommandButton5.Visible = True
  14.     End With
  15. End Sub
上一张按钮:
  1. Private Sub CommandButton4_Click() '上一张
  2.     Dim rng As Range
  3.     If RNGZ1.Row = 2 Then
  4.         MsgBox "当前已经是第一张,请核实!", 64, "提示!"
  5.     Else
  6.         Set rng = Sheet3.Range("J1:J600").Find(what:=RNGZ1.Offset(-1, 0).Value, LookIn:=xlValues)
  7.         Call xinxihuoqu(rng)
  8.     End If
  9. End Sub
下一张按钮:
  1. Private Sub CommandButton5_Click() '下一张
  2.     Dim n As Integer
  3.     Dim rng As Range
  4.     n = Sheet3.Range("J65536").End(xlUp).Row
  5.     Set rng = RNGZ.Offset(1, 0)
  6.     If RNGZ.Row = n Then
  7.         MsgBox "已经是最后一张!请核实!", 64, "提示!"
  8.     Else
  9.         Call xinxihuoqu(rng)
  10.     End If
  11. End Sub
大家如果看的仔细,可以看到每个按钮代码中都有一个Call xinxihuoqu(rng)的语句,其中xinxihuoqu是写在模块中的核心代码,每个不同的按钮只是把不同的RNG指针传递给了xinxihuoqu过程以达到不同的效果,但是过程是一样的,所以把xinxihuoqu写在模块中公用,从而让代码更具有可读性,给日后更改代码带来了方便,同时大大的缩短了代码的行数!
5楼
yjzstar
3、模块中的代码:
  1. Public RNGZ As Range  '指向每张发票的最后一行
  2. Public RNGZ1 As Range  '指向每张发票的第一行
  3. Public NN As Integer
  4. Public Sub xinxihuoqu(rng As Range)  '信息获取过程
  5.     Dim n As Integer
  6.     Dim n1 As Integer
  7.     Dim i As Integer
  8.     Dim j As Integer
  9.     Dim haiyun As Double
  10.     Dim baofei As Double
  11.     i = 0
  12.     n1 = 20  '打印品种起始行
  13.     n = 1
  14.     With Sheet1
  15.         .Range("B20:D35").Value = ""
  16.         .Range("G20:G35").Value = ""
  17.         .Range("B9").Value = rng.Offset(0, -9).Value
  18.         .Range("G11").Value = rng.Offset(0, -3).Value
  19.         .Range("O14").Value = rng.Text
  20.         .Range("B20") = guigesuoxie(rng.Offset(0, -8))
  21.         .Range("D20") = rng.Offset(0, -7).Value * 1000
  22.         .Range("G20") = rng.Offset(0, -6).Value / 1000
  23.         haiyun = rng.Offset(0, -2)
  24.         baofei = rng.Offset(0, -1)
  25.         Select Case Mid(rng.Offset(0, -5).Value, 1, 1)
  26.             Case "美"
  27.                 .Range("F20") = "USD"
  28.                 .Range("I20:I42").NumberFormatLocal = "[$USD] #,##0.00;[$USD] -#,##0.00"
  29.             Case "欧"
  30.                 .Range("F20") = "EUR"
  31.                 .Range("I20:I42").NumberFormatLocal = "[$EUR] #,##0.00;[$EUR] -#,##0.00"
  32.             Case "日"
  33.                 .Range("F20") = "JPY"
  34.                 .Range("I20:I42").NumberFormatLocal = "[$JPY] #,##0.00;[$JPY] -#,##0.00"
  35.         End Select
  36.         .Range("B21:I35").ClearContents
  37.         Do While rng.Offset(0 + i, 0) = rng.Offset(1 + i, 0)
  38.             .Range("B" & n1 + 2 * n) = guigesuoxie(rng.Offset(1 + i, -8))
  39.             .Range("D" & n1 + 2 * n) = rng.Offset(1 + i, -7).Value * 1000
  40.             .Range("E" & n1 + 2 * n) = Sheet1.Range("E20")
  41.             .Range("F" & n1 + 2 * n) = Sheet1.Range("F20")
  42.             .Range("H" & n1 + 2 * n) = Sheet1.Range("H20")
  43.             .Range("G" & n1 + 2 * n) = rng.Offset(1 + i, -6).Value / 1000
  44.             .Range("I" & n1 + 2 * n).Formula = "=ROUND(" & .Range("D" & n1 + 2 * n).Address & " *" & .Range("G" & n1 + 2 * n).Address & ",2)"
  45.             haiyun = haiyun + rng.Offset(1 + i, -2).Value
  46.             baofei = baofei + rng.Offset(1 + i, -1).Value
  47.             n = n + 1
  48.             i = i + 1
  49.             If n = 8 Then
  50.                 MsgBox "信息超过8行,请更改信息后进行查询!"
  51.                 Exit Do
  52.             End If
  53.         Loop
  54.         Set RNGZ1 = rng  '指向当前发票的第一行
  55.         Set RNGZ = rng.Offset(i, 0)  '指向当前发票的最后一行
  56.         Select Case rng.Offset(0, -4).Value
  57.             Case "FOB"
  58.                .Range("O15").Value = "FOB"
  59.                .Range("I40") = ""
  60.             Case "EXW"
  61.                .Range("O15").Value = "EXW"
  62.                .Range("I40") = ""
  63.             Case Else
  64.                .Range("O15").Value = rng.Offset(0, -4).Value
  65.                .Range("I40") = .Range("I36") - haiyun - baofei
  66.         End Select
  67.     End With
  68.     NN = n
  69. End Sub
注意模块代码中最开始申明的三个公共变量在整个过程中的作用,代码中有注释,这里就不在讲解!此处注意代码中有一自定义函数guigesuoxie即产品规格的缩写函数,开票数据明细表中的产品规格一般是全称,但实际打印发票时可能可以是以缩写形式打印的,所以大家可以根据自己公司的情况编写一下这个函数,此处提供的改函数对原规格不起任何作用,如果不需要缩写的,guigesuoxie函数也不需要自己在写,这边只是做一简单提醒!

4、thisworkbook中的代码
具体代码如下:
  1. Private Sub Workbook_Open()
  2.     Application.Visible = False
  3.     Application.DisplayAlerts = False
  4.     登陆.Show
  5. End Sub
该代码实现隐藏EXCEL窗口隐藏,只显示登陆窗口!


该打印系统相对比较简单,来自于本人的实际工作中,大大的提高了发票打印的速度,改变了以往使用手工录入每张发票的情况,提高了工作效率,降低了手工录入的错误率,希望能给从事财务方面工作的朋友,特别是有外销业务的单位带来一定的方便!该系统是我刚学习VBA知识的时候写的,所以各种语句方面相对比较粗犷,运用也相对简单,同时便于初学者理解,不过总体而言设计的思路我自己还是比较满意的!
6楼
xyf2210
这个可能用得着,先留着
7楼
lnt1231
**V5,进来膜拜
8楼
千年一梦遥
小颜V5
9楼
chx95love
好东东学习下
10楼
bidededede
好东东学习
11楼
亲朝然vk
非常感谢您!
12楼
fishgo
**哄哄的
13楼
:)
哇!真的好强大啊。楼主不可小看啊。
14楼
lrlxxqxa
15楼
VIP]_个人
不错。很详细,值得学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap