请教各位:关于VB调用Word的疑难问题

老田低代码 2004-07-18 06:28:45
各位:
我在VB中调用Word是这样的,但是总是出现Word模板损坏的错误提示,并未我在每次调用以后都执行的Word模板的关闭和退出操作。
1、定义了两个对象:
Private mywdapp As Word.Application
Private mysel As Object

2、使用了下面的初始化语句:
Set mywdapp = CreateObject("word.application") ---(a)
mywdapp.Documents.Open ("Word模板") ---(b)
Set mysel = mywdapp.Application.Selection ---(c)

然后查找模板中指定的内容进行替换,但是会出现如下的内容:
“上次打开文档“模板.Doc”的时候出现严重错误,你可以继续打开它,或单击“恢复数据”进行数据恢复。单击“恢复数据”将从文档中提取文本,但是所有格式和图片将丢失。”并且我已经将模板设置为只读文件。

并且在(a)和(b)这两条语句执行的时候速度非常慢,如果单步调试等待一会儿是可以的进行下去的,但是如果采用“运行”的话,可能会出现一些错误提示(如上)。并且这个时候在“资源管理器”->“进程”中出现WINWORD.EXE进程在运行。
我希望各位能够给我一点帮助,看看应该采用怎么样的调用才能避免这样的问题。
...全文
375 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
射天狼 2004-07-21
  • 打赏
  • 举报
回复
代码太长,懒得看,说说你要实现什么功能吧~!!!
老田低代码 2004-07-18
  • 打赏
  • 举报
回复
在执行OpenDoc函数的时候可能出现这样的错误:

错误号:-2147417851
错误描述:对象'Open'的方法'Documents'失败
老田低代码 2004-07-18
  • 打赏
  • 举报
回复
我使用了一个类:(从网上下载的)
下面是我调用的语句
Private Sub Command2_Click()
Dim mobjSetWord As SetWord
Set mobjSetWord = New SetWord
Dim i As Long
With mobjSetWord
.CloseDoc
.QuitWord
.TemplateDoc = App.Path & "\print\保单套打.DOC"
.newdoc = App.Path & "\print\试验套打.DOC"
.OpenWord
If .OpenDoc(False) Then
.WordCopy
.SavetoDoc
For i = 1 To 10
.ReplaceChar "\scan(a),page\", i & i & i & i & i & i, 1
.ReplaceChar "\a:地址\", "收件人地址", 1
.ReplaceChar "\a:姓名\", "收件人姓名", 1
.ReplaceChar "\addrfirst\", "发件人地址", 1
.MoveEnd
.GotoLine 1
'.AddNewPage
.WordPaste
Next
.ViewDoc
.SavetoDoc
End If
Unload wait
End With

Set mobjSetWord = Nothing
End Sub
'****类SetWord*****************************************************************
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()
'
'********************************************************************************
'     从Word.Range对象mysel中查找FindStr,并替换为RepStr
' 替换次数由time参数确定,为0时,替换所有
'********************************************************************************
Public Function ReplaceChar(FindStr As String, RepStr As String, Optional Time As Integer = 0) As Integer
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

'********************************************************************************
'     把图像数据PicData,存为PicFile指定的文件
'********************************************************************************
Public Function GetPic(PicData() As Byte, FileName As String) As Boolean
On Error Resume Next

If Len(FileName) = 0 Then
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()
mysel.EndKey unit:=wdStory, Extend:=wdExtend
mysel.Delete unit:=wdCharacter, Count:=1
End Sub

'光标移动到文档结尾
Public Sub MoveEnd()
mysel.EndKey unit:=wdStory
End Sub

Public Sub GotoLine(LineTime As Integer)
mysel.GoTo What:=wdGoToLine, Which:=wdGoToFirst, Count:=LineTime, Name:=""
End Sub

'********************************************************************************
'     打开Word文件,并给全局变量mysel赋值
'********************************************************************************
Public Function OpenDoc(view As Boolean) As Boolean
On Error Resume Next
'Set mysel = mywdapp.Application.Selection
OpenDoc = False
If Len(C_TemplateDoc) = 0 Then
mywdapp.Documents.Add
Else
mywdapp.Documents.Open (C_TemplateDoc), False
End If

If Err.Number <> 0 Then
C_ErrMsg = 4
RaiseEvent HaveError
OpenDoc = False
Exit Function
End If

mywdapp.Visible = view
'mywdapp.Activate
Set mysel = mywdapp.Application.Selection
OpenDoc = True
'mysel.Select
End Function

'********************************************************************************
'     打开Word程序,并给全局变量mywdapp赋值
'********************************************************************************
Public Sub OpenWord()
On Error Resume Next
Set mywdapp = CreateObject("word.application")
If Err.Number <> 0 Then
C_ErrMsg = 1
RaiseEvent HaveError
Exit Sub
End If
End Sub

Public Sub ViewDoc()
mywdapp.Visible = True
mywdapp.Activate
End Sub

Public Sub AddNewPage()
mysel.TypeParagraph
mysel.InsertBreak Type:=wdPageBreak
End Sub

Public Sub WordCut()
'保存模板页面内容
mysel.WholeStory
mysel.Cut
mysel.HomeKey unit:=wdStory
End Sub

Public Sub WordCopy()
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()
'插入模块内容
mysel.Paste
End Sub

'********************************************************************************
'     关闭Word文件模本
'********************************************************************************
Public Sub CloseDoc()
On Error Resume Next
mywdapp.ActiveDocument.Close False

If Err.Number <> 0 Then
C_ErrMsg = 3
Exit Sub
End If
End Sub

'********************************************************************************
'     关闭Word程序
'********************************************************************************
Public Sub QuitWord()
On Error Resume Next

mywdapp.Quit False

If Err.Number <> 0 Then
C_ErrMsg = 3
Exit Sub
End If
End Sub

Public Sub SavetoDoc()
On Error Resume Next

'并另存为文件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
TemplateDoc = C_TemplateDoc
End Property

Public Property Let TemplateDoc(ByVal vNewValue As String)
C_TemplateDoc = vNewValue
End Property

Public Property Get newdoc() As String
newdoc = C_newDoc
End Property

Public Property Let newdoc(ByVal vNewValue As String)
C_newDoc = vNewValue
End Property

Public Property Get PicFile() As String
PicFile = C_PicFile
End Property

Public Property Let PicFile(ByVal vNewValue As String)
C_PicFile = vNewValue
End Property

Public Property Get ErrMsg() As Integer
ErrMsg = C_ErrMsg
End Property

Private Sub Class_Terminate()
Set mywdapp = Nothing
Set mysel = Nothing
End Sub

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧