VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)(Object Linking and Embedding)任务的编程语言。他是一种自动化语言可以使常用的程序自动化。在敲机房收费系统的时候我们就接触过了导出到Excel,在VS引用的时候还看到了PPT,想想微软真是厉害,这次的实战主要是word中的书签和VS的结合,使界面更美了。
下图是最终需要做出来的效果。在验收完之后回来的路上,我们猜测既然VS可以和Excel结合,那么应该也可以和Word结合,经过百度证实确实是可以。而且这种技术叫做VBA,自己也借助这次机会初步了解了一下什么是VBA。
百度的过程中无意间看到VB应用word的书签。正所谓知识都是相通的嘛,既然VB可以,那么VS有什么理由不可以呢?经过一番尝试,在一个Word中通过VS写入想要的数据成功了。考虑到实际情况就在debug目录下放了一个模板,在打印的时候程序先将模板拷贝到用户选择的地方,然后我们在该路径下的word中写入想要的数据。
Dim wordApp As New Word.Application '定义一个word Dim wordDoc As New Word.Document Dim opara1 As Word.Paragraph '写入word变量 Dim opara2 As Word.Paragraph Dim opara3 As Word.Paragraph Dim opara4 As Word.Paragraph Dim TargetFileName As String '目标文件名 Dim spath As String Dim ssource As String '获取debug的路径,从而可以将该路径下的模板拷贝到桌面 Dim se As DialogResult Dim strPattern As String = String.Empty se = Me.FolderBrowserDialog1.ShowDialog() If se = DialogResult.OK Then '获取选中的路径 TargetFileName = FolderBrowserDialog1.SelectedPath & "/信息打印.doc" If Microsoft.VisualBasic.Right(Application.StartupPath, 1) <> "/" Then spath = Application.StartupPath & "/" ssource = spath & "信息打印.doc" If Dir$(TargetFileName) <> "" Then If MsgBox("文件已存在,确认替换它!", vbYesNo + vbQuestion) = vbNo Then Exit Sub '判断文件是否已经打开 If isopen(TargetFileName) = True Then MsgBox("路径为:" + TargetFileName + "的文件已打开,请先将其关闭", vbInformation, "提示") Exit Sub Else Kill(TargetFileName) '删除文件 End If FileCopy(ssource, TargetFileName) '复制文件 wordDoc = wordApp.Documents.Open(TargetFileName) ' 横向 wordDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape wordApp.Visible = True wordApp.ShowMe()
'其中的company是word中的一个书签,之下的unitID等等类似 opara1 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("company").Range) opara1.Range.Text = txtCompanyName.Text.Trim() opara2 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("unitID").Range) opara2.Range.Text = _userId opara3 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("userName").Range) opara3.Range.Text = txtPersonalName.Text.Trim() opara4 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("phone").Range) opara4.Range.Text = txtPhoneNumber.Text.Trim() 'wordDoc.Close() '关闭文档实例 'wordApp.Quit() wordDoc = Nothing wordApp = Nothing 'MsgBox("信息表已保存在您选择的路径下!!", vbInformation, "提示") Me.WindowState = System.Windows.Forms.FormWindowState.Minimized Else FileCopy(ssource, TargetFileName) '复制文件 wordDoc = wordApp.Documents.Open(TargetFileName) ' 横向 wordDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape wordApp.Visible = True wordApp.ShowMe() '信息写入wrod opara1 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("company").Range) opara1.Range.Text = txtCompanyName.Text.Trim() opara2 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("unitID").Range) opara2.Range.Text = _userId opara3 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("userName").Range) opara3.Range.Text = txtPersonalName.Text.Trim() opara4 = wordDoc.Content.Paragraphs.Add(wordDoc.Bookmarks.Item("phone").Range) opara4.Range.Text = txtPhoneNumber.Text.Trim() 'wordDoc.SaveAs2(TargetFileName) 'wordDoc.Close() '关闭文档实例 'wordApp.Quit() wordDoc = Nothing wordApp = Nothing Me.WindowState = System.Windows.Forms.FormWindowState.Minimized ' MsgBox("信息表已保存在您选择的路径下!", vbInformation, "提示") End If End If End If
其中我们要求是默认横向打印,万万没想到一行代码就让word信服了。
' 横向 wordDoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape期间做测试,由于好奇心就将拷贝到指定路径下的word打开了,边打开着边用VS执行,这样就出错了,因为word已经打开,就相当于一个程序正在调用该进程,用户也是相当的多,猜想应该不会只有我一个人这样做吧。经过测试,证明是文件被打开的原因,那么如何判断该文件已被打开呢?如果已打开,就给出提示。
Private Function isopen(ByVal path_string As String) As Boolean Try Dim fs As New IO.FileStream(path_string, IO.FileMode.OpenOrCreate, IO.FileAccess.Read) fs.Dispose() Return False Catch ex As Exception Return True End Try End Function在需要判断的地方调用即可:
'判断文件是否已经打开 If isopen(TargetFileName) = True Then MsgBox("路径为:" + TargetFileName + "的文件已打开,请先将其关闭", vbInformation, "提示") Exit Sub End if
VBA的思想就是让简单的东西更加简单了,通过代码将桌面应用程序和我们自己做的程序很好的结合起来,通过单击一个按钮就可以完成在桌面应用程序中的一系列操作。借助已有的东西来让自己的程序更加的方便美观——站在巨人的肩膀上,让自己看的更远。