vb操作word [追加500分求教] VB操作WORD问题 悬赏分:200 - 解决时间:2007-7-28 11:42 说明,用VB操作WORD,以下源码第一次操作完全正常,正常打开,正常替换,正常退出。进程中并没有留下windword的进 程,但第二次继续操作时就出问题,运行到ReplaceWord()就出现462错误,关闭程序重新开始又正常。请指教出错及解 决原因,追加到500分 '=============打开word============== Function OpenWord(FileName) '打开指定word文档 Dim wordApp As New Word.Application Dim wordDoc As New Word.Document Set wordApp = CreateObject("Word.Application") wordApp.Visible = False Set wordDoc = wordApp.Documents.Open(FileName) End Function ============替换关键字=========== Function ReplaceWord(SearchStr,ReplaceStr) '全部替换函数 Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = SearchStr .Replacement.Text = ReplaceStr .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Function '==================另存为=================== Function SaveAsWord(DiskStr,NameStr) ChangeFileOpenDirectory DiskStr ActiveDocument.SaveAs FileName:=NameStr,FileFormat:=wdFormatDocument _,LockComments:=False,Password:="",AddToRecentFiles:=True,_ WritePassword:="",ReadOnlyRecommended:=False,EmbedTrueTypeFonts:=False,_ SaveNativePictureFormat:=False,SaveFormsData:=False,SaveAsAOCELetter:= _ False Application.Documents.Close Application.Quit End Function '===================清除对象============ Function CloseWord() Set wordDoc = Nothing '清除文件实例 Set wordApp = Nothing '清除WORD实例 End Function 问题补充:根据《小fisher》的答案,已经解决问题,另外在SaveAsWord过程中,ChangeFileOPenDirectory DiskStr更 改为ChangeFileOpenDirectory DiskStr ,ActiveDocument.SaveAs更改为wordDoc.SaveAs,再加上原先《小fisher》提 到要更改的地方,已经完美解决,谢谢!! PS:由于百度只能2次提高悬赏,每次50分,所以现在只有200分,未能对现500分的诺言,所以只有另开贴来加送300 分! 提问者: 有野问 - 经理五级 最佳答案 1) Function ReplaceWord(SearchStr,ReplaceStr) '全部替换函数 Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find ....... 这个函数过程有错误!因为Selection是word的对象而不是VB的对象,所以不能在VB中直接引用,必须用 wordApp.Selection替换掉Selection才行! 这段代码在word VBA中调试不会出问题,但移植到VB中时要注意。 2)wordApp和wordDoc必须定义为全局变量,在模块公有部分使用 Dim wordApp As Word.Application Dim wordDoc As Word.Document 来定义 然后在OpenWord(FileName)过程中使用Set wordApp =New Word.Application 和Set wordDoc = wordApp.Documents.Open(FileName),否则在CloseWord()过程中wordApp和wordDoc两个变量将会是未 第 1 页 vb操作word 初始化的Variant类型。 3)Function SaveAsWord(DiskStr,NameStr)中的Application须使用wordApp替换,道理同1)。 ________________________________________________________________________- 网上说在Visual Basic中创建Word文档使用语句 Dim newDoc As Word.Document Set newDoc = new Word.Document 但是VB会提示上述语句“用户定义类型未定义” 另一种创建的方法是 Dim MsWord As Object Set MsWord = CreateObject("Word.Basic") MsWord.AppShow MsWord.FileNewDefault 可以创建但是下述语句没办法使用(即对该文档的一些操作) With MsWord .Content.Font.Name = "宋体" .Content.Font.Size = 12 .Content.Paragraphs.LineSpacing = 15.5 End With 请教各位高手指点,我想在vb中创建一个word文档,并将程序计算的一堆结果,在该文档中按一定的格式打印出来。 另,我在word中录制了一段宏,请问在VB中如何调用,要求代码 Sub zz() ActiveDocument.Tables.Add Range:=Selection.Range,NumRows:=6,NumColumns:= _ 6,DefaultTableBehavior:=wdWord9TableBehavior,AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> "网格型" Then .Style = "网格型" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With Selection.TypeText Text:="1" Selection.MoveRight Unit:=wdCell Selection.TypeText Text:="2" Selection.MoveRight Unit:=wdCell Selection.TypeText Text:="3" Selection.MoveRight Unit:=wdCell Selection.TypeText Text:="4" Selection.MoveRight Unit:=wdCell Selection.TypeText Text:="5" End sub 提问者: zhaizhaiya - 助理三级最佳答案 将 With MsWord .Content.Font.Name = "宋体" .Content.Font.Size = 12 .Content.Paragraphs.LineSpacing = 15.5 End With 改写为 MsWord.Content.Font.Name = "宋体" MsWord.Content.Font.Size = 12 MsWord.Content.Paragraphs.LineSpacing = 15.5 就可以了。 _____________________________________________________________________- 用vb读word时,在程序读完,为什么还有关联,怎样给她关联除啦 悬赏分:0 - 解决时间:2008-10-23 10:06 用vb实现读word程序的操作! 也就是说当我运行vb程序时读啦一次word 第二次再执行时还是第一次的结果! 例如执行下面这个语句时: If NewDoc.Paragraphs(1).Range.Font.Name = "新宋 体" Then s = s + 0.5 x = MsgBox("s=" + Str$(s),64,"字体为1.5") 执行第一次之后,再改程序,执行时,总是提示word在另一个地方已经打开,实际上没有打开,我想这是由于关联的问 题! 提问者: lcs6678 - 助理二级最佳答案 在任务管理器下的进程下看看,肯定打开了。 不知道你是用什么方法定义的word对象。 如果这样定义: Dim a As Object,b As Object,c As Object Set a = CreateObject("word.application") Set b = a.Documents.open("c:\1 .doc") 第 2 页 vb操作word 用以下语句关闭 b.close a.quit ______________________________________________________________________ 在VB如何存取word格式的文件 悬赏分:30 - 解决时间:2006-9-12 08:30 我想把用vb计算的一堆结果打印在word里面,并且有固定格式的简单排版,最好能在word中打印一些表格,请问用什么样的 函数或者对象实践?希望高手帮忙,要是能加一点说明,更加感激不尽 提问者: zhaizhaiya - 助理二级最佳答案 我帮你搜索到了两种方法虽然我自己也不懂但是也许你会懂吧 通过VBA进行WORD调用,要替换WORD中固定位置的值,可以事先在文档中定义标签,然后修改标签的内容即可,不用查 找。 VB中用VBA调用WORD的方法: 菜单-》工程-》引用->Microsoft Word 9.0 Object Library (后面的数字为版本号) Dim wdApp As New Word.Application Dim docApp As New Word.Document 具体用怎么用标签替换,可以到WORD中录制宏看看就知道了,宏可以直接在VB中通过VBA执行。 方法2 使用VB编程时,有时需要调用Microsoft Word对文字进行编辑、排版及输出。为实现这种调用,可以使用Shell函数、 OLE自动化、在包容器中嵌入Word对象等方法。经过试用和比较,总结出了这几种方法的各自特点。 1 使用Shell函数直接调用 语法:Shell (pathname[,windowstyle]).Pathname是指要执行的程序的名字和任何必须的参数或命令行开关,可以包括 目录和驱动器名;Windowstyle是执行程序的窗口风格的数字。 使用Shell调用Word比较简单,编程量小,但必须明确指定Word所在路径,这不利于移植,而且,不能对Word进行控制, 不利于程序和Word之间的数据交换。 2 使用OLE自动化控制Microsoft Word 2.1 使用方法 (1)Word为OLE自动化提供一种称为“Basic”的对象,要在VB中控制Word,首先要定义一个引用Word中“Basic”对象的 对象变量:Dim Wordobj as Object (2)将Word 中的“Basic”对象赋给该对象:Set Wordobj=CreateObject("Word.Basic") (3)可以使用大多数WordBasic语句和函数控制Word或Word文档,使用方法和在Word宏中使用WordBasic指令的方法基本相 同。 (4)关闭Word:Set Wordobj =Nothing。 注意:“Basic”对象不支持关闭它自己的一个方法。即若在OLE自动化中关闭了Word,则对象被置为Nothing,便不能再 对对象进行操作,程序出错。 2.2 VB指令与WordBasic指令的差异 (1)有一些语句和函数不能使用,包括:控制结构,如While…Wend和If…Then…Else;声明语句,如Dim;定制对话框相 关的语句:FileExit语句;要求数组变量作为参数的语句或函数。 (2)也有一些指令使用方法不同。①返回字符串以一个美元符($)结束的WordBasic函数的关键字必须括在方括号中。例 如,在WordBasic宏中的GetBookmark$()语句:mark$=GetBookmark$("Address"),若用VB调用,必须这样写 mark$=Wordobj.[Ge-tBookmark$]("Address")。②选择一个命令按钮用“True”,不选择用“False” 2.3 对OLE自动化的说明 Word可以为OLE自动化给另一个应用提供对象,但是它不能使用OLE自动化访问其它应用中的对象。例如:VB和Excel可以 使用OLE自动化访问Word,但是Word不能使用OLE自动化访问它们。 3 在包容器中嵌入Word对象 在VB中,要访问在包容器中嵌入的Word对象,首先要在项目中插入对象。做法如下:在窗体中插入OLE控件,对象类型选 择“MicrosoftWord图片”或“Microsoft Word文档”,再按“确定”。 然后用Object属性访问文档或图片,并使用WordBasic语句和函数作用于它。嵌入的对象必须在可被访问之前被激活,可 以使用Action属性激活OLE控件。例如,使用下面指令访问一个嵌入在称为OLE1的OLE控件中的文档: Dim Wordobj as Object OLE1.Action =7 Set Wordobj =OLE1.Object.Application. WordBasic 其他方面,使用方法同OLE自动化。使用在包容器中嵌入的Word对象,Word显示的窗口大小、位置与OLE控件定义的大 小、位置相同,而且工具栏显示位置与Word脱离。这一点与OLE自动化相比,是个不足。 总之,要想在Microsoft Visual Basic中控制Microsoft Word,最好使用OLE自动化,通过使用WordBasic指令对Word进 行全面控制,而且,用户使用起来与使用Microsoft Word一样,非常方便 ___________________________________________________________________________________ 用VB如何在WORD指定位置上插入文字? 悬赏分:150 - 解决时间:2006-12-6 10:21 提问者: sxtyhjh - 见习魔法师二级最佳答案 在VB6.0中,操作word,使用它强大的查找、替换、删除、复制、翦切功能。还可以把特定字符替换成图片。有了它你就 可以使用数据库中的内容或图片文件替换word文件中的特定字符。 只要把下列内容复制到写字板中,另存为SetWord.cls文件,然后在把它添加到工程中,就可以使用了。 VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "SetWord" Attribute VB_GlobalNameSpace = False 第 3 页 vb操作word Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Private mywdapp As Word.Application Private mysel As Object '属性值的模块变量 Private C_TemplateDoc As String Private C_newDoc As String Private C_PicFile As String Private C_ErrMsg As Integer Public Event HaveError() Attribute HaveError.VB_Description = "出错时激发此事件.出错代码为ErrMsg属性" '*************************************************************** 'ErrMsg代码:1-word没有安装 2 - 缺少参数 3 - 没权限写文件 ' 4 - 文件不存在 ' '*************************************************************** Public Function ReplacePic(FindStr As String,Optional Time As Integer = 0) As Integer Attribute ReplacePic.VB_Description = "查找FindStr,并替换为PicFile所指向的图片文件,替换次数由time参数确 定,为0时,替换所有" '******************************************************************************** ' 从Word.Range对象mysel中查找所有FindStr,并替换为PicFile图像 ' 替换次数由time参数确定,为0时,替换所有 '******************************************************************************** If Len(C_PicFile) = 0 Then C_ErrMsg = 2 Exit Function End If Dim i As Integer Dim findtxt As Boolean mysel.Find.ClearFormatting mysel.Find.Replacement.ClearFormatting With mysel.Find .Text = FindStr .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With mysel.HomeKey Unit:=wdStory findtxt = mysel.Find.Execute(Replace:=True) If Not findtxt Then ReplacePic = 0 Exit Function End If i = 1 Do While findtxt mysel.InlineShapes.AddPicture FileName:=C_PicFile If i = Time Then Exit Do i = i + 1 mysel.HomeKey Unit:=wdStory findtxt = mysel.Find.Execute(Replace:=True) Loop ReplacePic = i End Function Public Function FindThis(FindStr As String) As Boolean Attribute FindThis.VB_Description = "查找FindStr,如果模板中有FindStr则返回True" If Len(FindStr) = 0 Then C_ErrMsg = 2 Exit Function End If mysel.Find.ClearFormatting 第 4 页 vb操作word mysel.Find.Replacement.ClearFormatting With mysel.Find .Text = FindStr .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With mysel.HomeKey Unit:=wdStory FindThis = mysel.Find.Execute End Function Public Function ReplaceChar(FindStr As String,RepStr As String,Optional Time As Integer = 0) As Integer Attribute ReplaceChar.VB_Description = "查找FindStr,并替换为RepStr,替换次数由time参数确定,为0时,替换所有 " '******************************************************************************** ' 从Word.Range对象mysel中查找FindStr,并替换为RepStr ' 替换次数由time参数确定,为0时,替换所有 '******************************************************************************** Dim findtxt As Boolean If Len(FindStr) = 0 Then C_ErrMsg = 2 RaiseEvent HaveError Exit Function End If mysel.Find.ClearFormatting mysel.Find.Replacement.ClearFormatting With mysel.Find .Text = FindStr .Replacement.Text = RepStr .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With If Time > 0 Then For i = 1 To Time mysel.HomeKey Unit:=wdStory findtxt = mysel.Find.Execute(Replace:=wdReplaceOne) If Not findtxt Then Exit For Next If i = 1 And Not findtxt Then ReplaceChar = 0 Else ReplaceChar = i End If Else mysel.Find.Execute Replace:=wdReplaceAll End If End Function Public Function GetPic(PicData() As Byte,FileName As String) As Boolean Attribute GetPic.VB_Description = "把图像数据PicData,存为PicFile指定的文件" '******************************************************************************** ' 把图像数据PicData,存为PicFile指定的文件 '******************************************************************************** On Error Resume Next If Len(FileName) = 0 Then 第 5 页 vb操作word C_ErrMsg = 2 RaiseEvent HaveError Exit Function End If Open FileName For Binary As #1 If Err.Number <> 0 Then C_ErrMsg = 3 Exit Function End If '二进制文件用Get,Put存放,读取数据 Put #1,PicData Close #1 C_PicFile = FileName GetPic = True End Function Public Sub DeleteToEnd() Attribute DeleteToEnd.VB_Description = "删除从当前位置到结尾的所有内容" mysel.EndKey Unit:=wdStory,Extend:=wdExtend mysel.Delete Unit:=wdCharacter,Count:=1 End Sub Public Sub MoveEnd() Attribute MoveEnd.VB_Description = "光标移动到文档结尾" '光标移动到文档结尾 mysel.EndKey Unit:=wdStory End Sub Public Sub GotoLine(LineTime As Integer) mysel.GoTo What:=wdGoToLine,Which:=wdGoToFirst,Count:=LineTime,Name:="" End Sub Public Sub OpenDoc(view As Boolean) Attribute OpenDoc.VB_Description = "打开Word文件,View确定是否显示Word界面" On Error Resume Next '******************************************************************************** ' 打开Word文件,并给全局变量mysel赋值 '******************************************************************************** If Len(C_TemplateDoc) = 0 Then mywdapp.Documents.Add Else mywdapp.Documents.Open (C_TemplateDoc) End If If Err.Number <> 0 Then C_ErrMsg = 4 RaiseEvent HaveError Exit Sub End If mywdapp.Visible = view mywdapp.Activate Set mysel = mywdapp.Application.Selection 'mysel.Select End Sub Public Sub OpenWord() On Error Resume Next '******************************************************************************** ' 打开Word程序,并给全局变量mywdapp赋值 '******************************************************************************** Set mywdapp = CreateObject("word.application") If Err.Number <> 0 Then C_ErrMsg = 1 RaiseEvent HaveError 第 6 页 vb操作word Exit Sub End If End Sub Public Sub ViewDoc() Attribute ViewDoc.VB_Description = "显示Word程序界面" mywdapp.Visible = True End Sub Public Sub AddNewPage() Attribute AddNewPage.VB_Description = "插入分页符" mysel.InsertBreak Type:=wdPageBreak End Sub Public Sub WordCut() Attribute WordCut.VB_Description = "剪切模板所有内容到剪切板" '保存模板页面内容 mysel.WholeStory mysel.Cut mysel.HomeKey Unit:=wdStory End Sub Public Sub WordCopy() Attribute WordCopy.VB_Description = "拷贝模板所有内容到剪切板" mysel.WholeStory mysel.Copy mysel.HomeKey Unit:=wdStory End Sub Public Sub WordDel() mysel.WholeStory mysel.Delete mysel.HomeKey Unit:=wdStory End Sub Public Sub WordPaste() Attribute WordPaste.VB_Description = "拷贝剪切板内容到当前位置" '插入模块内容 mysel.Paste End Sub Public Sub CloseDoc() Attribute CloseDoc.VB_Description = "关闭Word文件模板" '******************************************************************************** ' 关闭Word文件模本 '******************************************************************************** On Error Resume Next mywdapp.ActiveDocument.Close False If Err.Number <> 0 Then C_ErrMsg = 3 Exit Sub End If End Sub Public Sub QuitWord() '******************************************************************************** ' 关闭Word程序 '******************************************************************************** On Error Resume Next mywdapp.Quit If Err.Number <> 0 Then C_ErrMsg = 3 Exit Sub End If End Sub Public Sub SavetoDoc() Attribute SavetoDoc.VB_Description = "保存当前文档为FileName指定文件" On Error Resume Next 第 7 页 vb操作word '并另存为文件FileName If Len(C_newDoc) = 0 Then C_ErrMsg = 2 RaiseEvent HaveError Exit Sub End If mywdapp.ActiveDocument.SaveAs (C_newDoc) If Err.Number <> 0 Then C_ErrMsg = 3 RaiseEvent HaveError Exit Sub End If End Sub Public Property Get TemplateDoc() As String Attribute TemplateDoc.VB_Description = "模板文件名." TemplateDoc = C_TemplateDoc End Property Public Property Let TemplateDoc(ByVal vNewValue As String) C_TemplateDoc = vNewValue End Property Public Property Get newdoc() As String Attribute newdoc.VB_Description = "执行CloseDoc方法时,将模板文件另存为此文件名指定的新文件.如果不指定, 在执行CloseDoc方法时,将产生一个错误" newdoc = C_newDoc End Property Public Property Let newdoc(ByVal vNewValue As String) C_newDoc = vNewValue End Property Public Property Get PicFile() As String Attribute PicFile.VB_Description = "图像文件名" PicFile = C_PicFile End Property Public Property Let PicFile(ByVal vNewValue As String) C_PicFile = vNewValue End Property Public Property Get ErrMsg() As Integer Attribute ErrMsg.VB_Description = "错误信息.ErrMsg代码: 1-word没有安装 2-缺少参数 3-没权限写文件 4-文件不 存在" ErrMsg = C_ErrMsg End Property ________________________________________________________________________________ 用VB调用WORD 悬赏分:10 - 解决时间:2008-5-25 19:02 我在WORD里写了点东西,然后想用VB调用它,请高手指点,怎么调用这个文件,假设为help.doc 请给出原程序。 问题补充:你的代码没有问题,可不是我想要的,运行的结果只是显示了WORD内的部分内容,我想要打开WORD并显示出 来,就像正常打开WORD一样,不过这是通过代码来实现 提问者: jerryzhanzmq - 试用期一级最佳答案 那么你试一下下面的代码,是不是你所说的??? Private Sub Form_Load() Dim wp As New Word.Application Dim wd As New Word.Document wp.Visible = True Set wd = wp.Documents.Open("c:\22075847937.doc") Dim neirong As String neirong = wd.Content.Text MsgBox "该Word文件的内容为:" & vbNewLine & neirong End Sub 你说的只是个打开WORD文件,那么不就是个执行文件操作吗?调用shellexecute api不就行了吗!郁闷 _______________________________________________________________________________________ 第 8 页