楼主 yjzstar |
1、登陆界面:
2、机打外销发票实际模板:(由于是扫描件,所以有些模糊,请大家见谅!)
3、打印系统效果及操作展示:
注:系统登陆密码每个用户都为111
07 10版外销开票系统.zip
03版外销开票系统.zip |
2楼 yjzstar |
【制作流程】 一、基础表格简介 1、开票数据表 开票数据表中存放实际开票的数据,相当于是一个外贸的发货明细表,其中包含字段:“单位名称”、“产品规格”、“数量”、“外币单价”、“币种”、“价格条款”、“目的港”、“海运费”、“保费”、“发票号码”、“是否已开票”以上11个标题字段(以上字段可以根据实际情况进行更改或增加,但注意修改对于的代码) 2、用户信息表 该表为登陆界面而设置,如果是小型企业,只有一个人打印开票的完全可以删掉该表,同时删除登陆界面! 3、开票打印表 该表为实际打印模板表,该表的取数都是通过VBA代码取自开票数据表,该表中的各项设置都直接影响了打印结果,所以该表为设计中的核心,所有的代码都是围绕该表进行设置!
二、开票打印表的具体设置 打印表中的数据分为两块,一块为VBA直接在开票数据表中直接取得,另一部分为公式或数据有效性设置!表哥表姐们可以分别点进有数据的单元格查看是否有公式或其他设置,如果为纯数值就是有VBA直接在开票数据中取数而得,这部分就不进行讲解!另一部分为有公式或数据有效性设置的:表中的公式都很简单,首先是B5单元格(日期)- =TODAY()
日期的格式为自定格式“[$-409]mmm d yyyy;@”
单元格B11(出口港设置)这边定义了两个港口,分别是上海港及宁波港,引用数据区域为”O9:O10”:
如果有其他港口,如乍浦港,可以重新设置或增加。这边设置数据有效性的目的不仅是为了方便用户选择,还是为了B15及B16的的取数B15及B16的公式分别为:- =IF(B11="SHANGHAI","","合同协议号:")
- =IF(B11="SHANGHAI","",O14)
其中O14单元格为发票号码(及合同协议号)是通过VBA直接取数而来!G17单元格公式:- =IF(O15="FOB","FOB"&" " & B11,IF(O15="EXW","EXW",O15 & " "&G11))
其中O15为价格条款,G11为目的港,这两个单元格均为VBA直接取数(注:FOB时取的是出口港,而CFR、CIF、DDP都是引用目的港的)最后是H48单元格,及对应业务员名字,其中公式为:- =VLOOKUP(H46,用户信息!A:D,4,0)
注:这是根据我们自己单位的实际情况设置的,及某一开票人对应某一业务员,表哥表姐们可以根据实际情况进行设置! |
3楼 yjzstar |
三、窗体、控件及代码设置
1、登陆界面设置 ALT+F11进入代码编辑界面,插入窗体,依次在窗体上插入1个图像框、1个复合框,1个文本框,3个标签及两个命令按钮。设置窗体的Caption属性值为“登陆”;两个命令按钮的Caption属性值分别为“确定”及“取消”;设置图像框的Picture属性为自己喜欢的图片,及登陆见面上的图片:
登陆界面代码: 窗体代码:(双击窗体空白处进入)- Private Sub UserForm_Initialize()
- Dim rng As Range
- With Sheet2
- Set rng = .Range("A65536").End(xlUp)
- End With
- Me.ComboBox1.List = Sheet2.Range("A1:A" & rng.Row).Value
- End Sub
- Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
- If CloseMode = 0 Then
- MsgBox "请单击【取消】按钮来关闭窗体"
- Cancel = True
- End If
- End Sub
确定按钮代码:(双击确定按钮)- Private Sub CommandButton1_Click() '确定按钮
- Dim rng As Range
- Set rng = Sheet2.Range("A1:A50").Find(what:=Me.ComboBox1.Value, LookIn:=xlValues, lookat:=xlWhole)
- If rng.Offset(0, 1).Value = Me.TextBox1.Text Then
- Sheet2.Range("C1:C20").Clear
- rng.Offset(0, 2).Value = "√"
- Unload Me
- Application.Visible = True
- With Sheet1
- .Select
- .Range("H46") = Me.ComboBox1.Value
- End With
- With Sheet1
- .CommandButton1.Visible = False
- .CommandButton2.Visible = False
- .CommandButton3.Visible = True
- .CommandButton4.Visible = False
- .CommandButton5.Visible = False
- End With
- If rng.Text = "超级用户" Then
- Sheet2.Visible = True
- Else
- Sheet2.Visible = False
- End If
- Else
- MsgBox "密码不正确,请重新输入!", 64, "提示!"
- Me.TextBox1 = ""
- End If
- End Sub
取消按钮代码:- Private Sub CommandButton2_Click() '取消按钮
- Unload Me
- Application.DisplayAlerts = False
- Application.Quit
- End Sub
|
4楼 yjzstar |
2、开票打印表中各个命令按钮的生成方法及相应代码 开票打印表中功能区的具体情况如下:
5个命令按钮,分别实现不同的效果,分别为“打印”、“查询”、“信息获取”、“上一张”、“下一张”,生成方法为“开发工具”->“插入”->“命令按钮”在合适的地方拖动鼠标左键便可以生成
每个命令按钮的具体代码如下:
打印按钮:- Private Sub CommandButton1_Click() '打印
- Dim n As Integer
- Dim i As Integer
- Dim rng As Range
- On Error Resume Next
- If RNGZ1.Offset(0, 1).Value = "√" Then
- If MsgBox("改发票已经打印过,是否重新打印?", vbYesNo) = vbYes Then
- Sheet1.PrintOut
- If Err.Number = 1004 Then
- MsgBox "请检查打印机设置或连接!"
- Exit Sub
- End If
- End If
- Else
- Sheet1.PrintOut
- If Err.Number = 1004 Then
- MsgBox "请检查打印机设置或连接!"
- Exit Sub
- End If
- For i = 0 To NN - 1
- RNGZ1.Offset(i, 1).Value = "√"
- Next i
- End If
- n = Sheet3.Range("J65536").End(xlUp).Row
- Set rng = RNGZ.Offset(1, 0)
- If RNGZ.Row = n Then
- MsgBox "已经是最后一张!", 64, "提示!"
- Else
- Call xinxihuoqu(rng)
- End If
- End Sub
查询按钮:- Private Sub CommandButton2_Click() '查询
- Dim rng As Range
- Set rng = Sheet3.Range("J1:J6000").Find(what:=Sheet1.Range("O14").Value, LookIn:=xlValues)
- Call xinxihuoqu(rng)
- End Sub
信息获取按钮:- Private Sub CommandButton3_Click() '信息获取
- Dim rng As Range
- If Sheet3.Range("a65536").End(xlUp).Row = 1 Then
- MsgBox "开票数据中没有信息,请确认后再获取信息!", 64, "提示!"
- Exit Sub
- End If
- Set rng = Sheet3.Range("J2")
- Call xinxihuoqu(rng)
- With Sheet1
- .CommandButton1.Visible = True
- .CommandButton2.Visible = True
- .CommandButton4.Visible = True
- .CommandButton5.Visible = True
- End With
- End Sub
上一张按钮:- Private Sub CommandButton4_Click() '上一张
- Dim rng As Range
- If RNGZ1.Row = 2 Then
- MsgBox "当前已经是第一张,请核实!", 64, "提示!"
- Else
- Set rng = Sheet3.Range("J1:J600").Find(what:=RNGZ1.Offset(-1, 0).Value, LookIn:=xlValues)
- Call xinxihuoqu(rng)
- End If
- End Sub
下一张按钮:- Private Sub CommandButton5_Click() '下一张
- Dim n As Integer
- Dim rng As Range
- n = Sheet3.Range("J65536").End(xlUp).Row
- Set rng = RNGZ.Offset(1, 0)
- If RNGZ.Row = n Then
- MsgBox "已经是最后一张!请核实!", 64, "提示!"
- Else
- Call xinxihuoqu(rng)
- End If
- End Sub
大家如果看的仔细,可以看到每个按钮代码中都有一个Call xinxihuoqu(rng)的语句,其中xinxihuoqu是写在模块中的核心代码,每个不同的按钮只是把不同的RNG指针传递给了xinxihuoqu过程以达到不同的效果,但是过程是一样的,所以把xinxihuoqu写在模块中公用,从而让代码更具有可读性,给日后更改代码带来了方便,同时大大的缩短了代码的行数! |
5楼 yjzstar |
3、模块中的代码:- Public RNGZ As Range '指向每张发票的最后一行
- Public RNGZ1 As Range '指向每张发票的第一行
- Public NN As Integer
- Public Sub xinxihuoqu(rng As Range) '信息获取过程
- Dim n As Integer
- Dim n1 As Integer
- Dim i As Integer
- Dim j As Integer
- Dim haiyun As Double
- Dim baofei As Double
- i = 0
- n1 = 20 '打印品种起始行
- n = 1
- With Sheet1
- .Range("B20:D35").Value = ""
- .Range("G20:G35").Value = ""
- .Range("B9").Value = rng.Offset(0, -9).Value
- .Range("G11").Value = rng.Offset(0, -3).Value
- .Range("O14").Value = rng.Text
- .Range("B20") = guigesuoxie(rng.Offset(0, -8))
- .Range("D20") = rng.Offset(0, -7).Value * 1000
- .Range("G20") = rng.Offset(0, -6).Value / 1000
- haiyun = rng.Offset(0, -2)
- baofei = rng.Offset(0, -1)
- Select Case Mid(rng.Offset(0, -5).Value, 1, 1)
- Case "美"
- .Range("F20") = "USD"
- .Range("I20:I42").NumberFormatLocal = "[$USD] #,##0.00;[$USD] -#,##0.00"
- Case "欧"
- .Range("F20") = "EUR"
- .Range("I20:I42").NumberFormatLocal = "[$EUR] #,##0.00;[$EUR] -#,##0.00"
- Case "日"
- .Range("F20") = "JPY"
- .Range("I20:I42").NumberFormatLocal = "[$JPY] #,##0.00;[$JPY] -#,##0.00"
- End Select
- .Range("B21:I35").ClearContents
- Do While rng.Offset(0 + i, 0) = rng.Offset(1 + i, 0)
- .Range("B" & n1 + 2 * n) = guigesuoxie(rng.Offset(1 + i, -8))
- .Range("D" & n1 + 2 * n) = rng.Offset(1 + i, -7).Value * 1000
- .Range("E" & n1 + 2 * n) = Sheet1.Range("E20")
- .Range("F" & n1 + 2 * n) = Sheet1.Range("F20")
- .Range("H" & n1 + 2 * n) = Sheet1.Range("H20")
- .Range("G" & n1 + 2 * n) = rng.Offset(1 + i, -6).Value / 1000
- .Range("I" & n1 + 2 * n).Formula = "=ROUND(" & .Range("D" & n1 + 2 * n).Address & " *" & .Range("G" & n1 + 2 * n).Address & ",2)"
- haiyun = haiyun + rng.Offset(1 + i, -2).Value
- baofei = baofei + rng.Offset(1 + i, -1).Value
- n = n + 1
- i = i + 1
- If n = 8 Then
- MsgBox "信息超过8行,请更改信息后进行查询!"
- Exit Do
- End If
- Loop
- Set RNGZ1 = rng '指向当前发票的第一行
- Set RNGZ = rng.Offset(i, 0) '指向当前发票的最后一行
- Select Case rng.Offset(0, -4).Value
- Case "FOB"
- .Range("O15").Value = "FOB"
- .Range("I40") = ""
- Case "EXW"
- .Range("O15").Value = "EXW"
- .Range("I40") = ""
- Case Else
- .Range("O15").Value = rng.Offset(0, -4).Value
- .Range("I40") = .Range("I36") - haiyun - baofei
- End Select
- End With
- NN = n
- End Sub
注意模块代码中最开始申明的三个公共变量在整个过程中的作用,代码中有注释,这里就不在讲解!此处注意代码中有一自定义函数guigesuoxie即产品规格的缩写函数,开票数据明细表中的产品规格一般是全称,但实际打印发票时可能可以是以缩写形式打印的,所以大家可以根据自己公司的情况编写一下这个函数,此处提供的改函数对原规格不起任何作用,如果不需要缩写的,guigesuoxie函数也不需要自己在写,这边只是做一简单提醒!
4、thisworkbook中的代码 具体代码如下:- Private Sub Workbook_Open()
- Application.Visible = False
- Application.DisplayAlerts = False
- 登陆.Show
- End Sub
该代码实现隐藏EXCEL窗口隐藏,只显示登陆窗口!
该打印系统相对比较简单,来自于本人的实际工作中,大大的提高了发票打印的速度,改变了以往使用手工录入每张发票的情况,提高了工作效率,降低了手工录入的错误率,希望能给从事财务方面工作的朋友,特别是有外销业务的单位带来一定的方便!该系统是我刚学习VBA知识的时候写的,所以各种语句方面相对比较粗犷,运用也相对简单,同时便于初学者理解,不过总体而言设计的思路我自己还是比较满意的! |
6楼 xyf2210 |
这个可能用得着,先留着 |
7楼 lnt1231 |
**V5,进来膜拜 |
8楼 千年一梦遥 |
小颜V5
|
9楼 chx95love |
好东东学习下 |
10楼 bidededede |
好东东学习 |
11楼 亲朝然vk |
非常感谢您! |
12楼 fishgo |
**哄哄的 |
13楼 :) |
哇!真的好强大啊。楼主不可小看啊。 |
14楼 lrlxxqxa |
|
15楼 VIP]_个人 |
不错。很详细,值得学习 |