添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

问题描述:

最近在学习wordVBA时遇到以下问题:运行时错误'4198':应用程序定义或对象定义错误

这是我写的一段Excel VBA操作Word的代码,作用是打开已存在的word文档,向其中输入内容后保存退出

Sub test2()
Dim wordapp As New Word.Application '建立word对象
wordapp.Documents.Open ("D:\2021\我的文件\VBA\练习\test.docx") '打开word文档
wordapp.Visible = ture
wordap.Selection.EndKey unit:=wdStory '光标移动到文章末尾
wordapp.Selection.TypeText Text:="我的博客" '输入内容"
wordapp.ActiveDocument.Save '保存
wordapp.ActiveDocument.Close '关闭
wordapp.Quit '退出word对象
Set wordapp = Nothing '释放对象
End Sub

该代码中有一句错误,第五句我把对象变量wordapp误写成了wordap,第一次运行时出现如下问题:运行时错误‘424’:要求对象

第二次运行时再次出现问题,运行过程缓慢,按住win+tab键后发现这个窗口:

***.docx 被“***”锁定,无法编辑。请选择:打开只读副本;创建本地副本,稍后合并更改;在原始副本可用时接收通知

点击取消后报错:运行时错误'4198':应用程序定义或对象定义错误

使用WPS打开word文档时,发现:文档已被“***”锁定,是否以只读模式打开?

原因分析:

猜想如下:

在第一次运行时,程序可以正常打开word文档,但在执行到第五句错误语句时,程序自动退出运行,没有继续往下执行,因此该文件没有被保存,但是被word锁定成了只读模式保护起来。

第二次运行时,因为程序不能正常打开该文档,所以会出现“文件正在使用”的弹窗提示,而且该文档有些时候没有办法编辑、保存以及删除,只有在任务管理器中结束word后台运行才能删除掉。

解决方案:

为了防止调试程序过程中再出现以上问题,可以在程序中加入一个错误转移语句

程序中出现错误后会自动转到skip后面的语句运行,以上问题得到完美解决。

Sub test2()
Dim wordapp As New Word.Application '建立word对象
On Error GoTo skip
wordapp.Documents.Open ("D:\2021\我的文件\VBA\练习\test.docx") '打开word文档
wordapp.Visible = ture
wordap.Selection.EndKey unit:=wdStory '光标移动到文章末尾
wordapp.Selection.TypeText Text:="我的博客" '输入内容"
skip:
wordapp.ActiveDocument.Save '保存
wordapp.ActiveDocument.Close '关闭
wordapp.Quit '退出word对象
Set wordapp = Nothing '释放对象
End Sub
今天,为了实现一个看似比较简单的功能,结果调试 VBA 代码花费了我近3个小时,一杯咖啡从早上喝到现在还没喝完。其中,遭遇了一个“Runtime-error '9'”: Subscript out of range 错误 ,就耽误了很多时间。问题代码:With workbooks(fileName).VBProject For Each objVbc In .VBComponents
VB访问 word 书签。 '实现代码如下 Dim cn As New ADODB.Connection Dim AdoRs As New ADODB.Recordset Dim Word Temps As New Word .Application Private Sub Form_Load() If cn.State = 1 Then cn.Close End If cn.CursorLocation = adUseClient cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb" End Sub '开始导出数据 Private Sub Command1_Click() Dim strSQl As String Dim REC As Integer Dim i As Integer Word Temps.Documents.Add App.Path + "\货物合同.doc", False Word Temps.Selection.GoTo wdGoToBookmark, , , "合同标题" Word Temps.Selection.TypeText "关于冬季货物的成交合同" Word Temps.Selection.GoTo wdGoToBookmark, , , "合同编号" Word Temps.Selection.TypeText "2004000001" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约单位" Word Temps.Selection.TypeText "宏大科技公司,天天科技公司" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约地址" Word Temps.Selection.TypeText "北京中关村大厦" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约时间" Word Temps.Selection.TypeText fromat(Now, "yyyy-mm-dd") strSQl = "select * from Matrixs" AdoRs.Open strSQl, cn, adOpenKeyset, adLockOptimistic REC = AdoRs.RecordCount If REC < 1 Then MsgBox "无商品记录!", vbOKOnly, "提示" AdoRs.Close Exit Sub Else AdoRs.MoveFirst Word Temps.Selection.GoTo wdGoToBookmark, , , "货物清单" For i = 1 To REC Word Temps.Selection.TypeText AdoRs!名称 Word Temps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 Word Temps.Selection.TypeText AdoRs!数量 Word Temps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 Word Temps.Selection.TypeText AdoRs!规格 AdoRs.MoveNext If AdoRs.EOF = False Then Word Temps.Selection.InsertRowsBelow 1 '表格换行 End If Next i AdoRs.Close Word Temps.Visible = True '显示 WORD 窗口 End If End Sub '实现代码如下 Dim cn As New ADODB.Connection Dim AdoRs As New ADODB.Recordset Dim Word Temps As New Word .Application Private Sub Form_Load() If cn.State = 1 Then cn.Close End If cn.CursorLocation = adUseClient cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb" End Sub '开始导出数据 Private Sub Command1_Click() Dim strSQl As String Dim REC As Integer Dim i As Integer Word Temps.Documents.Add App.Path + "\货物合同.doc", False Word Temps.Selection.GoTo wdGoToBookmark, , , "合同标题" Word Temps.Selection.TypeText "关于冬季货物的成交合同" Word Temps.Selection.GoTo wdGoToBookmark, , , "合同编号" Word Temps.Selection.TypeText "2004000001" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约单位" Word Temps.Selection.TypeText "宏大科技公司,天天科技公司" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约地址" Word Temps.Selection.TypeText "北京中关村大厦" Word Temps.Selection.GoTo wdGoToBookmark, , , "签约时间" Word Temps.Selection.TypeText fromat(Now, "yyyy-mm-dd") strSQl = "select * from Matrixs" AdoRs.Open strSQl, cn, adOpenKeyset, adLockOptimistic REC = AdoRs.RecordCount If REC < 1 Then MsgBox "无商品记录!", vbOKOnly, "提示" AdoRs.Close Exit Sub Else AdoRs.MoveFirst Word Temps.Selection.GoTo wdGoToBookmark, , , "货物清单" For i = 1 To REC Word Temps.Selection.TypeText AdoRs!名称 Word Temps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 Word Temps.Selection.TypeText AdoRs!数量 Word Temps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格 Word Temps.Selection.TypeText AdoRs!规格 AdoRs.MoveNext If AdoRs.EOF = False Then Word Temps.Selection.InsertRowsBelow 1 '表格换行 End If Next i AdoRs.Close Word Temps.Visible = True '显示 WORD 窗口 End If End Sub
前后期绑定Excel/ Word 对象 的应用 Set W = CreateObject(“ word .application”) '这种是后期绑定 '注意,运行到这里是这里把程序重置以后,不管visible=true/false这里的 WORD 实例 对象 还是存在, '记的EXCEL如果是这种情况下是会在进程中自动关掉的(见下方描述). 此处不管Public W或是dim W均是这样 W.Visible = True VB6,Set E = CreateObject(“excel.application”)这句发生后,