VBA Word. Как найти первую пустую ячейку в таблице Word? - PullRequest
0 голосов
/ 18 марта 2020

Я пытался найти первую пустую ячейку в таблице Word, используя VBA.

find cell in word table

Код, который я поместил ниже, находит все пустые ячейки, вместо этого я хочу найти первую после заполненной. Как решить эту проблему?

For Each oRow In Selection.Tables(1).Rows
For Each oCell In oRow.Cells
    If Selection.Text = Chr(13) & Chr(7) Then
    oCell.Select
    'Selection.PasteSpecial DataType:=wdPasteText
        MsgBox oCell.RowIndex & " " & oCell.ColumnIndex & " is empty."
    End If

Next oCell
Next oRow

Ответы [ 3 ]

0 голосов
/ 18 марта 2020

Как вы, возможно, обнаружили, определение пустой ячейки в Word не так просто, как может показаться. Приведенный ниже код ищет первую ячейку, где длина текста в ячейке равна 1 после удаления любых пробелов, табуляции и vbCr. Вы могли бы расширить это, чтобы также искать vbLF, ручные разрывы строк и другие символы, которые могут быть в ячейке, но не видны, если у вас отключены текстовые маркеры представления.

Метод .Cells диапазона таблицы - это Наиболее подходящий инструмент для использования здесь, потому что он будет работать, даже если в таблице есть объединенные ячейки. Поиск таблицы с использованием координат ячеек не удастся, если в таблице есть объединенные ячейки. С помощью метода .Cells поиск по таблице осуществляется сверху слева и снизу справа (строка за столбцом).

Option Explicit

Sub Test()

    Dim myCell As Word.Range
    Set myCell = FirstEmptyCell(ActiveDocument.Tables(1).Range)
    myCell.Select

End Sub

' Returns the first cell that has a text length of 1
' after removing spaces and tab characters from the cell text
Public Function FirstEmptyCell(ByVal TableRange As Word.Range) As Word.Range

    Dim myCell As Word.Cell
    For Each myCell In TableRange.Tables(1).Range.Cells

        Dim CellText As String
        CellText = myCell.Range.Text
        CellText = Replace(CellText, vbTab, vbNullString)
        CellText = Replace(CellText, " ", vbNullString)
        CellText = Replace(CellText, vbCr, vbNullString)

        If Len(CellText) = 1 Then

            Set FirstEmptyCell = myCell.Range
            Exit Function

        End If

    Next

End Function
0 голосов
/ 18 марта 2020

Решение действительно намного проще, чем предлагают другие «ответы»:

Dim i As Long
With Selection
  If .Information(wdWithInTable) = True Then
    With .Tables(1).Range
    For i = 1 To .Cells.Count
      With .Cells(i)
        If Len(.Range.Text) = 2 Then
          MsgBox " Row " & .RowIndex & ", Column " & .ColumnIndex & " is empty."
          .Range.PasteSpecial DataType:=wdPasteText
          Exit For
        End If
      End With
    Next
    End With
  Else
    MsgBox "No table selected", vbExclamation
  End If
End With

Я даже добавил некоторую проверку ошибок.

0 голосов
/ 18 марта 2020

Это то, что вы имели в виду?

Sub FindNextBlank()

    Dim Tbl As Table
    Dim TblRow As Row
    Dim HasText As Boolean
    Dim LookForText As Boolean, Done As Boolean
    Dim R As Long, C As Long
    Dim Txt As String

    LookForText = True
    With ThisDocument.Tables(1)
        For R = 1 To .Rows.Count
            Set TblRow = .Rows(R)
            For C = 1 To TblRow.Cells.Count
                HasText = (Len(TblRow.Cells(C).Range.Text) > 2)
                If HasText = LookForText Then
                    If LookForText Then
                        LookForText = Not LookForText
                    Else
                        Done = True
                        TblRow.Cells(C).Range.Select
                        Exit For
                    End If
                End If
            Next C
            If Done Then Exit For
        Next R

        If Done Then
            Txt = "Cell #" & C & " in row " & R & " is free."
        Else
            Txt = "No free cell was found that" & vbCr & _
                   " follows one that has text."""
        End If
    End With
    MsgBox Txt, vbInformation, "Search result"
End Sub

For ... Each быстрее, но я инстинктивно не доверяю этому, потому что последовательность предметов в них обычно определяется последовательностью их создания. Это может быть или не быть сверху вниз, слева направо. Вызов ячеек по их координатам может занять немного больше времени, но вы сохраняете контроль над последовательностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...