1. ホーム
  2. excel

[解決済み] Excel VBA マクロ。ユーザー定義型が定義されていない

2022-03-05 21:27:37

質問

このマクロを実行しようとすると、上記のようなエラーが発生します。私はマクロやコーディング全般の初心者なので、無知をお許しください。

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

解決方法は?

エラーの原因は以下の通りです。

Dim oTable As Table, oRow As Row,

これらのタイプは TableRow はExcelのネイティブな変数型ではありません。 これを解決するには、次の2つの方法があります。

  1. Microsoft Wordのオブジェクトモデルへの参照を含める。 ツール]-[参照]-[MS Wordへの参照を追加]でこれを行います。 厳密には必要ではありませんが かもしれません のように、オブジェクトを完全に修飾するのが好きです。 Dim oTable as Word.Table, oRow as Word.Row . これをアーリーバインディングと呼びます。
  2. あるいは、レイトバインディング方式を使用するには、オブジェクトをジェネリックとして宣言する必要があります Object 型を使用します。 Dim oTable as Object, oRow as Object . この方法では、Wordに参照を追加する必要はありませんが、VBEでのインテリセンス補助も失われます。

あなたのコードをテストしたわけではありませんが、おそらく ActiveDocument の方法では、Word.Applicationオブジェクトのインスタンスに適切にスコープしない限り、Excelで動作しません。 提供されたコードのどこにもそれが見当たりません。 例としては、以下のような感じです。

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