Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Как посчитать кол-во симолов в выделенном тексте


Автор: FiMa1 28.9.2008, 19:53
Добрейшего времени суток, друзья!

У меня проблема такого рода: нужно получить количество символов выделенного текста с учетом пробелов.
Использую следующий код:
Код

    If Selection.Type <> wdSelectionIP Then ' ЕСЛИ что-то выделено
        ' ВСЕ РАВНО ВОЗВРАЩАЕТСЯ ЗНАЧЕНИЕ СИМВОЛОВ ДЛЯ ВСЕГО ДОКУМЕНТА
        num = Selection.Document.BuiltInDocumentProperties("Number of characters (with spaces)").Value
    Else ' ЕСЛИ ничего выделено не было
        ' получить количество символов с учетом пробелов для всего документа
        num = ActiveDocument.BuiltInDocumentProperties("Number of characters (with spaces)").Value
    End If

Приведенный код работает корректно при подсчете символов для всего документа, т.е. без выделения текста, но при выделении текста выдает тот же результат, что и для всего документа.
Еще один вот такой вариант:
Код

num = Selection.Characters.Count

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

Автор: Aloha 28.9.2008, 20:21
Знаков без пробелов:
Код
Selection.Range.ComputeStatistics(wdStatisticCharacters)

Знаков с пробелами:
Код
Selection.Range.ComputeStatistics(wdStatisticCharactersWithSpaces)


Ту же инфу можно получить с помощью панели "Статистика"

Автор: FiMa1 28.9.2008, 20:59
Цитата(Aloha @ 28.9.2008,  20:21)
Знаков без пробелов:
Код
Selection.Range.ComputeStatistics(wdStatisticCharacters)

Знаков с пробелами:
Код
Selection.Range.ComputeStatistics(wdStatisticCharactersWithSpaces)

Ту же инфу можно получить с помощью панели "Статистика"

Aloha, огромное спасибо за помощь. Этот вариант как раз то, что мне было нужно.
Однако, к сожалению, он работает правильно только для сплошного выделения текста, в том же случае если выделены фрагменты в тексте (то есть при зажатой клавише 'Ctrl'), этот код вернет неверный результат.

Код

num = Selection.Range.ComputeStatistics(wdStatisticCharactersWithSpaces) ' num = 3 ВЕРНО

user posted image
Код

num = Selection.Range.ComputeStatistics(wdStatisticCharactersWithSpaces) ' num = 1 НЕ ВЕРНО!

user posted image
Код

num = Selection.Range.ComputeStatistics(wdStatisticCharactersWithSpaces) ' num = 2 НЕ ВЕРНО!

user posted image
С другой стороны 'Word Count' (Статистика) в таких случаях выводит правильные значения.

Автор: FiMa1 1.10.2008, 22:11
Короче говоря в интернете ответа по ходу нет, спросил на форуме мелкомягких - тоже молчание.
Мысль такая: так как физическое копирование для фрагментов выделенного текста работает нормально, то:
Код

Selection.Copy ' копируем выделенные фрагменты в ClipBoard
Set wrd = CreateObject("Word.Application")
wrd.Visible = False
wrd.Documents.Open "c:\temp\tmp.doc"
wrd.Documents.Add
' ЗДЕСЬ НУЖНО ВСТАВИТЬ СКОПИРОВАННЫЙ ТЕКСТ В РАБОЧИЙ ФАЙЛ wrd
' ЗДЕСЬ ПОЛУЧАЕМ КОЛИЧЕСТВО СИМВОЛОВ В РАБОЧЕМ ФАЙЛЕ wrd
wrd.Quit ' закрываем рабочий файл
Set wrd = Nothing ' очищаем память выделенную для него

Кто-нибудь может подсказать как вставить скопированное в созданный файл и получить количество символов в нем?

Автор: FiMa1 2.10.2008, 09:26
Короче придумал что-то вроде вот этого использовать в качестве Workaround:
Код

Dim MyData As DataObject
Dim str As String

Private Sub CommandButton1_Click()
    Selection.Copy
    MyData.GetFromClipboard
    str = MyData.GetText(1)
    num = Len(str)
End Sub

Private Sub UserForm_Initialize()
    Set MyData = New DataObject
End Sub

Еще одно решение (не мое), по поводу моего предыдущего поста:
Код

Call Selection.Copy
Let Application.ScreenUpdating = False

Dim oDoc As Document
Set oDoc = Application.Documents.Add(Visible:=False)
Call oDoc.Range.Paste

Dim nCharCount As Long
Let nCharCount = oDoc.Range.ComputeStatistics(wdStatisticCharactersWithSpaces)
Call MsgBox("nCharCount=" & nCharCount)

Call oDoc.Close(SaveChanges:=False)
Let Application.ScreenUpdating = True

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)