1

テーブルに垂直方向と水平方向にマージされたセルが含まれているときに反復を終了しないようにするには、vbaスクリプトまたは作成中のヘルプが必要です。

表の例:

---------
|   |   | <-- I don't want these rows deleted, they can be skipped
|---|   |
|   |   | <-- I don't want these rows deleted, they can be skipped
|---|---|
|   |   | <-- this must be checked for emptiness in order to decide to delete or not
|---|---|
|   |   | <-- this must be checked for emptiness in order to decide to delete or not
|---|---|

これまでのVBAでの私のスクリプト:

Public Sub DeleteEmptyRows()
    Dim c As String
    c = ""
    Dim oTable As Table, oRow As Integer
    ' Specify which table you want to work on.
    For Each oTable In ActiveDocument.Tables

        For oRow = oTable.Rows.Count To 1 Step -1
            'On Error GoTo NextIteration
            MsgBox oTable.Rows(oRow).Range.Text
            'If Len(oTable.Rows(oRow).Range.Text) = oTable.Rows(oRow).Cells.Count * 2 + 2 Then
            If Len(Replace(oTable.Rows(oRow).Range.Text, Chr(13) & Chr(7), vbNullString)) = 0 Then
                oTable.Rows(oRow).Delete
            End If
        Next oRow
    Next oTable
    MsgBox c
End Sub

エラーを再現する方法:5x5テーブルを作成します。cell(0,0)とcell(1、0)を選択し、それらをマージします。cell(0、1)とcell(0、2)を選択し、マージします。スクリプトを実行すると、5991エラーが発生します。

問題は、実行時エラー5991が発生することです。垂直方向に結合されたセルがあるため、このコレクションの個々の行にアクセスできません。

このエラーが発生した場合、行は処理されないため、どうすればよいか本当にわかりません。通常、私のテーブルにはセルが垂直方向に結合されたヘッダーがあり、本文の行は結合されていないため、何もできません...

Word用。

4

2 に答える 2

3

これは、マージされたセルを含まず、テキストを含まないテーブル内のすべての行を削除するために私が思いついたものです。

マージされたセルを含むテーブルの問題は、行を削除することではなく、実際にマージされたセルを特定して、残っているセルを削除することです。

私がこれにアプローチした方法は、テーブル内のすべてのセルをループし、各行のワークアウトでカウントされる列の数(水平方向にマージされたセルと上から垂直方向にマージされたセルは無視されます)とこのページ(http://word.mvps .org / FAQs / MacrosVBA / GetRowColSpan.htm)行のセルのいずれかが、垂直方向に結合されたセルの一番上にあるかどうかを確認できます。

最後に、行にテキストがあるかどうかも確認します。

これは私が思いついたコードです。うまくいけば、コメントを付ければ簡単なはずです。残念ながら、Wordがこのようなものを処理する方法のために、セルは範囲を使用するだけでなく、選択する必要があります。これは、処理速度が大幅に低下するため、理想的ではありません。それは私のすべてのテストで機能しました。

Option Explicit

Public Sub DeleteEmptyRows()
    Dim oTable As Table, oCol As Integer, oRows As Integer
    Dim iMergeCount() As Integer, dCellData() As Double
    Dim MyCell As Cell
    Dim iCurrentRow As Integer, iRowCounter As Integer

    'Watching this happen will slow things down considerably
    Application.ScreenUpdating = False

    ' Specify which table you want to work on.
    For Each oTable In ActiveDocument.Tables
        'We need to store the number of columns to determine if there are any merges
        oCol = oTable.Columns.Count

        ReDim dCellData(1 To oTable.Rows.Count, 1 To 3)
        'The first column will count the number of columns in the row if this doesn't match the table columns then we have merged cells
        'The second column will count the vertical spans which tells us if a vertically merged cell begins in this row
        'The third column will count the characters of all the text entries in the row.  If it equals zero it's empty.

        iCurrentRow = 0: iRowCounter = 0
        For Each MyCell In oTable.Range.Cells
            'The Information property only works if you select the cell. Bummer.
            MyCell.Select

            'Increment the counter if necessary and set the current row
            If MyCell.RowIndex <> iCurrentRow Then
                iRowCounter = iRowCounter + 1
                iCurrentRow = MyCell.RowIndex
            End If

            'Check column index count
            If MyCell.ColumnIndex > VBA.Val(dCellData(iRowCounter, 1)) Then dCellData(iRowCounter, 1) = MyCell.ColumnIndex

            'Check the start of vertically merged cells here
            dCellData(iRowCounter, 2) = dCellData(iRowCounter, 2) + (Selection.Information(wdEndOfRangeRowNumber) - Selection.Information(wdStartOfRangeRowNumber)) + 1

            'Add up the length of any text in the cell
            dCellData(iRowCounter, 3) = dCellData(iRowCounter, 3) + VBA.Len(Selection.Text) - 2 '(subtract one for the table and one for cursor(?))

            'Just put this in so you can see in the immediate window how Word handles all these variables
            Debug.Print "Row: " & MyCell.RowIndex & ", Column: " & MyCell.ColumnIndex & ", Rowspan = " & _
                (Selection.Information(wdEndOfRangeRowNumber) - _
                Selection.Information(wdStartOfRangeRowNumber)) + 1
        Next MyCell

        'Now we have all the information we need about the table and can start deleting some rows
        For oRows = oTable.Rows.Count To 1 Step -1
            'Check if there is no text, no merges at all and no start of a vertical merge
            If dCellData(oRows, 3) = 0 And dCellData(oRows, 1) = oCol And dCellData(oRows, 2) = oCol Then
                'Delete the row (we know it's totally unmerged so we can select the first column without issue
                oTable.Cell(oRows, 1).Select
                Selection.Rows.Delete
            End If
        Next oRows
    Next oTable

    Application.ScreenUpdating = True
End Sub
于 2013-02-14T05:46:19.690 に答える
1

範囲内のセルがマージされた場合Range.MergeCellsに返される条件プロパティをチェックインする必要があります。TRUE

于 2013-02-13T11:17:22.453 に答える