web-dev-qa-db-fra.com

Erreur «Type défini par l'utilisateur non défini»

J'obtiens l'erreur ci-dessus lorsque j'essaie d'exécuter ces macros. Je suis assez nouveau sur les macros et le codage en général, alors pardonnez l'ignorance.

Merci

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
9
holdo1

Votre erreur est due à ceux-ci:

Dim oTable As Table, oRow As Row,

Ces types, Table et Row ne sont pas des types variables natifs d'Excel. Vous pouvez résoudre ce problème de deux manières:

  1. Incluez une référence au modèle d'objet Microsoft Word. Faites cela à partir des outils | Références, puis ajoutez une référence à MS Word. Bien que cela ne soit pas strictement nécessaire, vous pouvez souhaitez qualifier pleinement les objets comme Dim oTable as Word.Table, oRow as Word.Row. C'est ce qu'on appelle la liaison anticipée. enter image description here
  2. Alternativement, pour utiliser la méthode de liaison tardive, vous devez déclarer les objets comme génériques Object type: Dim oTable as Object, oRow as Object. Avec cette méthode, vous n'avez pas besoin d'ajouter la référence à Word, mais vous perdez également l'aide d'intellisense dans le VBE.

Je n'ai pas testé votre code mais je pense que ActiveDocument ne fonctionnera pas dans Excel avec la méthode # 2, à moins que vous ne l'étendiez correctement à une instance d'un objet Word.Application. Je ne vois cela nulle part dans le code que vous avez fourni. Un exemple serait comme:

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
15
David Zemens

Je suis en retard pour la fête. Essayez de remplacer comme ci-dessous, le mien a parfaitement fonctionné - "DOMDocument" à "MSXML2.DOMDocument60" "XMLHTTP" à "MSXML2.XMLHTTP60"

0
GideonMetre