Есть тексты (книги). Нужно на выходе работы проги иметь столбец в экселе А со словами, напротив в столбце В кол-во их встречания в тексте.
Делаю так: вордовский макрос коллекцию Words поэлементно заполняет в ячейки экселя. Потом в экселе сортирую столбец, меняю заглавные буквы на маленькие, прогоняю циклом сравнение: если в ячейках одинаковое, то значение в столбце В инкрементируется, строчка с таким же словом удаляется, в итоге имеем нормальный результат, только очень долго это все работает, нужно оптимизировать.
Что касается экселя - там надо просто уйти от обработки ячеек, загнать сразу все в массив, обработать, выкинуть в range на страницу.
А вот из ворда передать коллекцию, как это сделать быстро? Я сейчас делаю так:
Sub count()
k = Selection.Words.count
Set objWorkBook = GetObject("d:\work\French.xls")
Set objExcel = objWorkBook.Application
objExcel.ScreenUpdating = False
For i = 1 To k
objExcel.worksheets(2).Cells(i, 1) = Selection.Words(i)
Next i
objExcel.ScreenUpdating = True
End Sub
Как передать это одним блоком или быстрее, чтобы каждый элемент words расположился в отдельной ячейке?
objExcel.worksheets(2).range("A1") = Selection.Words - как это правильно записать, чтобы работало?
Примечание:
разобрался сам:
Sub count()
k = Selection.Words.count
Set objWorkBook = GetObject("d:\work\French.xls")
Set objExcel = objWorkBook.Application
ReDim mas(k) As String
k = 0
objExcel.ScreenUpdating = False
For Each i In Selection.Words
k = k + 1
mas(k) = i
Next i
objExcel.worksheets(2).Range("A1").Value = mas
objExcel.ScreenUpdating = True
End Sub
В цикле for each передаем в массив значения коллекции words, потом загоняем в экселевский range этот массив. Цикл for each работает на порядки быстрее, чем for to
Примечание:
еще вернее:
Option Base 1
Sub count()
k = Selection.Words.count
Set objWorkBook = GetObject("d:\work\French.xls")
Set objExcel = objWorkBook.Application
ReDim mas(k, 1)
k = 0
objExcel.ScreenUpdating = False
For Each i In Selection.Words
k = k + 1
mas(k, 1) = i
Next i
objExcel.worksheets(2).Range(objExcel.worksheets(2).Cells(1, 1), objExcel.worksheets(2).Cells(k, 1)).Value = mas
objExcel.ScreenUpdating = True
End Sub
Примечание:
Don Palma, спс, щас попробую
LeoCats, анализ и подсчет делается в экселевском макросе, а вордовский делал просто переброс в эксель. Я понимаю, что можно все это сделать в одном, но с моими знаниями сделал как проще для меня :)
Примечание:
посмотрел вордстат, слишком универсально и неприменимо для моей ситуации. У меня в экселе уже добавлена масса надстроек, которые различные формы, спряжения, сокращения учитывают, а что делает вордстат с функцией "объединять похожие" - известно только разработчику. У меня просто только французские тексты, так что лучше буду юзать свои макросы, тем более результат в xls, а не txt и обрабатывать-сортировать и т.п. гораздо удобнее.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.