【VBA研究】打印银行对账单(套打)

iamlaosong文

根据需要打印银行对账单,打印方式是套打(这种应用很多,比如快递单、发票等),现就有关技术问题进行总结。

1、如何实现准确套打

1)将对账单样式图片插入excel,略微调整大小为一张A4纸大小,插入图片的目的是为了准确定位套打位置,图片本身不用打印,需设置为不打印(套打需要先印刷,后打印)。如果不是套打,则打印图片本身。方法是右击图片,点击菜单“大小和属性”,去掉打印对象勾选,如下图:

2)设置打印区域,即将对账单图片所在区域设为打印区域,其它地方就不会打印了,这样做的目的是只要发出打印命令就可以打印,不用指定打印哪一页这些麻烦事,其它单元格有内容也没关系。套打如果位置有差,可适当调整控件位置适应。设置打印区域方法是先选择需要打印的区域,点击菜单“页面布局”-“打印区域”-“设置打印区域”,如下图:

3)将需要打印的数据复制到指定区域(VBA程序根据指定的行从数据表中复制到A42:Z46),在对账单需要套打的地方插入文本框,并将文本框连接到对应的单元格提取数据。这里可能用到文本框的对齐、分布,如果打印的和显示的不同,可适当调整文本框的边距。如下图:

4)套打时,如个别位置有差,可调整文本框控件位置,如所有的控件位置都有差,则调整页边距,以保证文本框和图片基本适应,因为图片本就是为套打定位的。

 

 

5)打印功能有单个打印和连续打印,如下图:

 

'打印指定行的数据:excel是可以设置打印区域的。
'将A1:K40设置为打印区域,则只会打印一页,就不用指定从哪打到哪了。
'单行打印
Sub SinglePrint()
    Dim rr As Long
    
    rr = Cells(2, "O")
    rr = GetRowData(rr)
    'Worksheets.("sheet1").PrintOut From:=2, To:=3, Copies:=3
    'ActiveSheet.PrintPreview
    msg = GenPic(0)
    ActiveSheet.PrintOut
End Sub

'多行打印
Sub MutiPrint()
    Dim rr1, rr2, rr As Long, msg As String
    
    rr1 = Cells(5, "O")
    rr2 = Cells(5, "P")
    For rr = rr1 To rr2
        rr = GetRowData(rr)
        'Worksheets.("sheet1").PrintOut From:=2, To:=3, Copies:=3
        'ActiveSheet.PrintPreview
        msg = GenPic(0)
        ActiveSheet.PrintOut
    Next rr
End Sub

'指定全部行号
Sub GetRows()
    Dim stName As String
    
    stName = Cells(2, "P")
    Cells(5, "O") = 2
    Cells(5, "P") = Sheets(stName).[A1].End(xlDown).Row
End Sub

2、二维码生成

对账单需要生成对账用的二维码(易码),银行提供了接口函数(通过DLL文件),但VBA调用不成功,后将其提供的Demo程序改造成控制台命令,通过命令行参数传递函数需要的数据,从而实现了二维码的生成。VBA执行DOS命令还是很简单的,有两种方式,其一是通过"Wscript.shell"对象的exec方法执行,其二是用shell命令完成(或者通过"Wscript.shell"对象的run方法执行,效果一样,shell对双引号的支持更好 , run则需要添加额外的双引号或chr(34))。两种方法各有优缺点,第一种方法可以读取屏幕上的执行结果,以便判断执行情况,但执行时会有DOS弹窗一闪;第二种方法则可以隐藏窗口,不会出现闪窗,但无法得到执行情况。需要注意的是,shell命令是重建一个进程完成的(异步执行),所以VBA并不会等这个命令执行完成再执行下面一个语句。本应用中需要命令生成的二维码,所以执行shell命令后需要一个延时,以便等待二维码生成结束(网上有根据返回的进程号查询系统该进程是否还在运行来判断是否结束,但比较麻烦,本应用只是生成一个二维码,时间很短,一个延时就够了)。

    '图片生成模式
    If mode = 0 Then
        'mode=0,有弹窗,但可以根据弹窗的内容确定命令执行情况
        Set oShell = CreateObject("Wscript.shell")
        Set oExec = oShell.exec(strCmd)
        'result = vbaPing(Ip)
        Do Until oExec.stdout.AtEndOfStream
            result = result & oExec.stdout.readline() & Chr(13)
        Loop
        'Debug.Print result
        '反馈:编码成功或者编码失败
        If InStr(result, "编码成功") > 0 Then
            UpdatePic
            GenPic = "OK"
        Else
            MsgBox "编码失败,请检查原因!"
            GenPic = "Fail"
        End If
    Else
        'shell执行命令,隐藏弹窗。mode的数值作为延时
        Shell strCmd, vbHide
        tim1 = Timer
        Do While Timer < tim1 + mode
        Loop
        '无反馈:不论编码成功还是编码失败
        UpdatePic
        GenPic = "OK"
    End If

shell命令也可以用下面语句代替:

        Set oShell = CreateObject("Wscript.shell")
        rs = oShell.Run(strCmd, vbHide, True)

通过WScript调用命令,有两种方法run和exec,这两种方法的区别如下:

run有一个等待程序完成的参数 , exec则可以返回执行的对象, run返回一个整数,这两个方法的声明如下:
Function Exec(ByVal Command As String) As WshExec

Function Run(ByVal Command As String, [ByVal WindowStyle], [ByVal WaitOnReturn]) As Integer

可以看出几点区别:

(1)run的返回值是一个整数,就是0或1成功和失败两个状态,而exec方法的返回值是一个对象,从返回对象中可以获得控制台输出信息和控制台错误信息,即StdOut和StdErr属性等。例如:

Set exeRs = objws.Exec("pscp -r -scp -pw 。。。。"

errMsg = exeRs.StdErr.ReadAll()

stdMsg = oExec.StdOut.ReadAll()

可以取到控制台错误和控制台信息,本程序就是通过这个方法判断执行结果。

(2)Run 的后两个参数,一个是cmd窗口的风格,一个是是否等待执行完成。最后一个参数很有用,如果你希望等待本次cmd执行的程序结束后,在执行 objws.Run后面的语句的话,只要设置这个参数为true就可以了,否则后面的语句将不等待cmd窗口完成,直接运行(我们程序就有这个需求,需要生成二维码图片后,再更新到Excel工作表图像控件中,如果没有生成完就去更新图片会出错的)。另外,如果你使用exec 方法的时候,如果希望等待cmd中程序执行完后,在执行后面的语句,也可以通过下面的方法:

oExec.StdErr.ReadAll()或者oExec.StdOut.ReadAll(),道理上也应该好理解,要得到输出的信息,肯定要cmd执行完后才会有输出的。

3、更新图片

 

每张对账单有不同的二维码,在打印时生成并更新到对账单上面,代码如下:

'更换图片
Private Sub UpdatePic()
    Dim Pic As Object, PicName As String
    Dim PicT, PicL, PicH, PicW As Integer
    '所选图片路径
    ActiveSheet.Unprotect
    PicName = ThisWorkbook.Path & "\YiCode.bmp"
    Set Pic = ActiveSheet.Shapes("图片 2")
    '原图片的位置和大小:纵横比属性 .LockAspectRatio
    With Pic
        PicT = .Top
        PicL = .Left
        PicH = .Height
        PicW = .Width
    End With
    '删除原图片
    Pic.Delete
    '插入所选图片
    Set Pic = ActiveSheet.Shapes.AddPicture(Filename:=PicName, LinkToFile:=msoFalse, _
          SaveWithDocument:=msoTrue, Left:=PicL, Top:=PicT, Width:=PicW, Height:=PicH)
    '设置图片名称
    Pic.Name = "图片 2"
    Pic.Locked = False
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    'Set Pic = Nothing
End Sub

4、插入图片和更改图片名称。应用本身不需要,但调试过程中可能会用到,代码如下:

'插入图片
Private Sub InsertPic()
    'On Error Resume Next
    Dim Pic As Object, PicName As String
    
    PicName = ThisWorkbook.Path & "\YiCode.bmp"
    '参数:path,left,top,width,height(宽和高为-1表示用原始尺寸)
    Set Pic = ActiveSheet.Shapes.AddPicture(Filename:=PicName, LinkToFile:=msoFalse, _
          SaveWithDocument:=msoTrue, Left:=60, Top:=60, Width:=-1, Height:=-1)
    Pic.LockAspectRatio = msoTrue     '锁定高宽比例
    Pic.ScaleHeight 0.5, msoTrue      '高度缩为一半
    'ActiveSheet.Shapes.AddPicture PicName, True, True, 60, 60, 127, 127
End Sub

'更换图片名称
Private Sub SetPicName()
    Dim Pic As Object
    
    Set Pic = ActiveSheet.Shapes("图片 6")
    Pic.Name = "图片 2"
    Set Pic = Nothing
End Sub

附:VB Shell函数用法


示例代码:
1. 打开记事本
   Private Sub Command1_Click()
    Shell "Notepad E:\VB练习\添加DTPicker控件.txt ", vbNormalFocus
   End Sub
注:NotePad后有空格
2. 打开QQ登陆界面
   Private Sub Command2_Click()
    Shell "D:\Program Files\Tencent\QQ2009\Bin\qq.exe", vbNormalFocus
   End Sub
3. 打开Word文档
   Private Sub Command3_Click(Index As Integer)
   Dim strDir As String
   strDir = "E:\VB练习\Test.doc"
   Select Case Index
   Case 0
         Shell "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE " & strDir, vbHide
   Case 1
         Shell "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE " & strDir, vbNormalFocus
   Case 2
         Shell "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE " & strDir, vbMinimizedNoFocus
   Case 3
         Shell "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE " & strDir, vbNormalNoFocus
   Case 4
         Shell "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE " & strDir, vbMaximizedFocus
   End Select
   End Sub
注:C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE之后有空格
 
* 在开始->运行里面能执行的命令用shell函数也行
 
Shell的语法:Shell(PathName[,WindowStyle])。
 
  PathName为必需参数。类型为String,它指出了要执行的程序名,以及任何需要的参数或命令行变量,也可以包括路径名。
 
  WindowStyle为可选参数。Integer类型,指定在程序运行时窗口的样式。WindowStyle有以下这些值。
 
  常量                   值        描述
 
VbHide                      0      窗口被隐藏,且焦点会移到隐式窗口。
 
VbNormalFocus         1      窗口具有焦点,且会还原到它原来的大小和位置。
 
VbMinimizedFocus     2      窗口会以一个具有焦点的图标来显示(缺省值)。
 
VbMaximizedFocus     3      窗口是一个具有焦点的最大化窗口。
 
VbNormalNoFocus     4      窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。
 
VbMinimizedNoFocus 6     窗口会以一个图标来显示,而当前活动的窗口仍然保持活动。

 

总结一下,Shell就是一个打开应用程序的函数,所带的参数为样式参数。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Word VBA 排版助手是一种利用Visual Basic for Applications(VBA)编写的宏代码,能够帮助用户在Word文档中进行排版和格式设置的工具。 它可以自动执行一系列排版操作,比如调整字体、字号和间距,设置段落格式,添加页眉页脚等。用户只需简单地点击一下按钮或运行宏代码,就能快速完成繁琐的排版工作。 Word VBA 排版助手的优点在于它的灵活性和定制性。用户可以根据自己的需求编写和修改宏代码,添加新的功能和功能按钮,以适应不同的排版需求。 此外,Word VBA 排版助手还可以与其他Office应用程序和第三方工具集成,实现更多复杂的排版操作和自动化任务。例如,用户可以编写VBA代码与Excel进行数据交互,或使用外部工具进行图形处理和索引生成。 需要注意的是,使用Word VBA 排版助手需要一定的编程知识和经验。用户需要了解VBA语言的基本语法和Word对象模型,才能正确使用宏代码并避免可能的错误或冲突。 总的来说,Word VBA 排版助手是一个强大的工具,能够大大提高用户在Word文档中的排版效率和准确性,使得整个排版过程更加便捷和可靠。 ### 回答2: Word VBA 排版助手是一种能够通过使用 VBA(Visual Basic for Applications)编程语言来帮助用户在 Word 文档中进行排版的工具。VBA 是一种 Microsoft Office 件自带的编程语言,可以用于自动化完成各种操作,包括文字格式设置、段落样式调整、页眉页脚设计、表格创建和维护等。 Word VBA 排版助手能够提供以下几方面的帮助: 1. 快速格式设置:通过编写 VBA 宏或使用 VBA 脚本,用户可以自定义对文档进行格式设置的功能。例如,用户可以编写 VBA 代码将所选文字设置为指定的字体、字号、颜色等。 2. 自动样式调整:排版助手可以编写 VBA 宏来自动调整文档中的段落样式。例如,可以设置标题和正文样式,使文档看起来更加统一和专业。 3. 页面设计和调整:利用 VBA 编程的强大能力,可以自动创建和修改页眉页脚,包括插入页码、公司标志和日期等信息。也可以利用 VBA 编写代码实现页面边距、页面大小和纸张方向的设置。 4. 表格创建和管理:VBA 可以帮助用户自动创建表格和表格样式,并对表格进行格式设置和数据处理。例如,可以通过编写 VBA 宏来自动插入行列、调整单元格宽度和高度以及对表格进行排序和筛选等。 总之,通过 Word VBA 排版助手,用户可以根据自己的需求和喜好,通过编写 VBA 代码来实现文档的自动化排版,提高工作效率和文档质量。无论是处理大量文档还是进行复杂排版,这个工具都能够帮助用户实现更加灵活和高效的排版操作。 ### 回答3: Word VBA排版助手是一种用于自动化和简化Word文档排版的工具。VBA是Visual Basic for Applications的缩写,是一种用于操作Office应用程序的编程语言。 利用Word VBA排版助手,可以轻松地自定义和设置文档的格式和布局。通过编写VBA代码,我们可以实现各种排版功能,如插入标题、段落编号、页眉页脚、表格、图片、引用文献等。这些功能可以大大提高文档制作的效率和准确性。 Word VBA排版助手还可以处理大量的文档批量排版任务,通过编写循环和条件语句,可以自动化处理多个文档的排版需求。例如,我们可以编写VBA代码实现自动批量调整文档的字体、字号、行间距、页面边距等格式要求。 此外,Word VBA排版助手还可以实现一键排版和自定义排版模板的功能。通过录制宏和编写VBA代码,我们可以将常用的排版操作保存为宏或模板,以便以后的使用。这样,我们可以在需要时调用宏或模板,快速应用一致的排版样式,提高文档的整体质量和一致性。 总的来说,Word VBA排版助手是一种强大的工具,可以帮助我们自动化和简化Word文档的排版操作。它使排版工作更加高效、精确,并提供了一些灵活性,从而提供了更好的用户体验和文档质量。无论是个人用户、教育机构还是企业,都可以从中受益,并提高他们的文档制作效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值