Excel VBA宏:用户定义类型未定义

11

当我尝试执行这个宏时,我收到了上述错误。我对宏和编程都很陌生,请原谅我的无知。

Sub DeleteEmptyRows()

Dim oTable As Table, oRow As Row, _
TextInRow As Boolean, i As Long

Application.ScreenUpdating = False

For Each oTable In ActiveDocument.Tables
    For Each oRow In oTable.Rows

        TextInRow = False

        For i = 2 To oRow.Cells.Count
            If Len(oRow.Cells(i).Range.Text) > 2 Then
                'end of cell marker is actually 2 characters
                TextInRow = True
                Exit For
            End If
        Next

        If TextInRow = False Then
            oRow.Delete
        End If
    Next
Next
Application.ScreenUpdating = True

End Sub

1
这似乎是Word的代码,但你已经标记为Excel。你想在哪里运行它? - Rory
1
RowTable不是变量类型。 - z̫͋
是的,非常抱歉,这段代码是用于在 Excel 中执行的 Word 邮件合并。 - holdo1
3个回答

29

你的错误是由这些引起的:

Dim oTable As Table, oRow As Row,

这些类型TableRow不是Excel本身具有的变量类型。您可以通过以下两种方式之一解决:

  1. 包含对Microsoft Word对象模型的引用。在“工具”|“引用”中执行此操作,然后添加对MS Word的引用。虽然这不是绝对必要的,但您可以Dim oTable as Word.Table, oRow as Word.Row 这样完全限定对象。这被称为早期绑定。 enter image description here
  2. 或者,使用后期绑定方法,必须将对象声明为通用Object类型:Dim oTable as Object, oRow as Object。使用此方法,您无需添加对Word的引用,但在VBE中也会失去智能感知辅助功能。

我没有测试过您的代码,但我怀疑在方法#2中ActiveDocument不会在Excel中起作用,除非您将其适当地限定为Word.Application对象的实例。我在您提供的代码中没有看到这一点。示例如下:

Sub DeleteEmptyRows()
Dim wdApp as Object
Dim oTable As Object, As Object, _
TextInRow As Boolean, i As Long

Set wdApp = GetObject(,"Word.Application")

Application.ScreenUpdating = False

For Each oTable In wdApp.ActiveDocument.Tables

0

我晚了参加派对。尝试按照以下方式替换,我的完美运作- 将“DOMDocument”替换为“MSXML2.DOMDocument60” 将“XMLHTTP”替换为“MSXML2.XMLHTTP60”


-1
Sub DeleteEmptyRows()  

    Worksheets("YourSheetName").Activate
    On Error Resume Next
    Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

以下代码将删除工作表(YourSheetName)中所有列A内容为空的行。
编辑:用户定义类型未定义是由“oTable As Table”和“oRow As Row”引起的。将Table和Row替换为Object以解决错误并使其编译。

2
它可能会编译,但如果没有相关的Word对象,无论是通过早期绑定还是晚期绑定,它很可能无法运行,就像这个答案中所述。 - Zev Spitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接