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

Excel VBA宏:未定义用户定义的类型,excel,vba,ms-word,Excel,Vba,Ms Word,我在尝试执行此宏时遇到上述错误。一般来说,我对宏和编码都很陌生,所以请原谅我的无知 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

我在尝试执行此宏时遇到上述错误。一般来说,我对宏和编码都很陌生,所以请原谅我的无知

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
以下代码将删除工作表(YourSheetName)中a列内容为空的所有行


编辑:未定义的用户定义类型是由“可作为表”和“或作为行”引起的。用对象替换表和行以解决错误并使其编译。

您的错误是由以下原因引起的:

Dim oTable As Table, oRow As Row,
这些类型,
Table
Row
不是Excel固有的变量类型。您可以通过以下两种方式之一解决此问题:

  • 包括对Microsoft Word对象模型的引用。从工具参考中执行此操作,然后将参考添加到MS Word。虽然不是严格必需的,但您可能希望完全限定对象,如
    Dim oTable为Word.Table或ow为Word.Row
    。这称为早期绑定
  • 或者,要使用后期绑定方法,必须将对象声明为泛型
    对象
    类型:
    作为对象可调,或作为对象可调。使用此方法,您不需要添加对Word的引用,但也会丢失VBE中的intellisense帮助
  • 我尚未测试您的代码,但我怀疑
    ActiveDocument
    无法在Excel中使用方法#2,除非您将其正确地限定为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
    

    我参加聚会迟到了。试着更换如下,我的工作非常好- “DOMDocument”到“MSXML2.DOMDocument60”
    “XMLHTTP”到“MSXML2.XMLHTTP60”

    这似乎是Word的代码,但您已将其标记为Excel。您想在哪里运行它?
    不是一种变量类型是的,我很抱歉,该代码用于Word中的邮件合并,在ExcelIt中执行。在没有相关Word对象的情况下,它可能会编译,但可能不会运行,无论是通过早期绑定还是后期绑定,如答案所示。
    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