#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’.