Автоматизировать функцию LEN() в Word

#vba #ms-word #character

#vba #ms-word #символ

Вопрос:

Добрый день,

Я пытаюсь воспроизвести функцию LEN() из Excel в Word и сделать ее настолько автоматизированной, насколько позволяют программы.

Мне удалось создать короткий модуль, который подсчитывает количество символов определенной продажи, а затем публикует результаты в ячейке справа:

 Sub NumChars()
With Selection.Paragraphs(1)
    .Next.Range.Text = .Range.Characters.Count
End With
End Sub
 

Это результат:

введите описание изображения здесь

Теперь неудобство заключается в том, что если у меня будет несколько строк, то я должен сделать это для каждой из них, поэтому вопрос в том, как можно изменить VBA, чтобы он повторял функцию до тех пор, пока in не достигнет последней строки? Так, например, я один раз нажимаю кнопку «Выполнить», находясь в первой строке, и она (повторно) вычисляет все количество символов для каждой ячейки в этом столбце, пока не дойдет до последней строки.

Любая помощь будет высоко оценена.

Комментарии:

1. Он не размещает его справа, он размещает его вместо текста следующего абзаца. Это происходит только для того, чтобы следующий абзац был следующей ячейкой. Если это действительно для таблиц, вы должны работать с Cells ними вместо этого. Если это действительно для свободного текста, вы должны указать, что делать со всей перезаписью.

Ответ №1:

Ваша идея верна, но вам нужно объединить ее с циклическим перебором каждой строки таблицы, как в этом примере:

 Option Explicit

Sub test()
    Dim mydoc As Document
    Set mydoc = ThisDocument
    
    Dim tbl As Table
    For Each tbl In mydoc.Tables
        CountMyChars tbl
    Next tbl
End Sub

Sub CountMyChars(ByRef tbl As Table)
    Const CHAR_COL As Long = 2
    Const COUNT_COL As Long = 3
    
    Dim row As Long
    Dim col As Long
    For row = 1 To tbl.Rows.Count
        '--- assumes the characters to count are in Column 2
        '    and the cell to hold the count is Column 3
        tbl.Cell(row, COUNT_COL).Range.Text = tbl.Cell(row, CHAR_COL).Range.Characters.Count
    Next row
End Sub
 

Комментарии:

1. Это просто фантастика! Именно то, что я хотел. Большое вам спасибо.

Ответ №2:

Вы могли бы добиться большего успеха с таким кодом, как:

 Sub Demo()
Application.ScreenUpdating = False
Dim r As Long
With Selection
  If .Information(wdWithInTable) = False Then Exit Sub
  With .Tables(1)
    For r = 1 To .Rows.Count
      .Cell(r, 3).Range.Text = Len(.Cell(r, 2).Range.Text) - 2
    Next
  End With
End With
Application.ScreenUpdating = True
End Sub
 

Приведенный выше код выполняется только для выбранной таблицы, а не для всех таблиц в документе (что может поставить под угрозу другие таблицы), и исключает маркер конца ячейки (который считается как 2 символа) из числа символов. Как закодировано, процесс начинается с верхней строки; если эта строка содержит заголовки, измените ‘r = 1’ на ‘r = 2’.