Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba word поиск примечания

Word VBA find next comment with specific author — sometimes finds other authors’ comments

hope someone can help.

I have the following line in my VBA:

Last_chosen is an author name taken from a dropdown in a userform, and debug.print shows it is read into the macro correctly.

Problem is that the find works OK a few times, then for some reason it finds a comment that belongs to a different author. Even if there are more comments from the Last_chosen author further down the document. And once this happens, it continues to find the wrong comments, sometimes from more than one author, even though Last_chosen is not changed from the original required author.

I’ve tried hiding some authors’ comments in Review | Show Markup | Reviewers in case there’s a glitch (?) when Word defines the author but the VBA still finds the wrong comment sometimes, suggesting that there isn’t a glitch.

Here’s all the code.

Создан 04 май. 17 2017-05-04 10:26:49 hmm

So, Word gets it into its head that ‘Last_Chosen’ is a name which is present but not chosen, and, once convinced that the not chose was chosen sticks to that conviction. There are two possible reasons for this behaviour. One, Word has a bug to the effect that the comments’ ‘Name’ property is being associated with the wrong comments. This appears unlikely because comments are a collection and any mix up of collections’ ‘Name’ property would be apparent elsewhere as well. – Variatus 04 май. 17 2017-05-04 13:02:12

The other possible reason is that there is a mix up in how the ‘Last_Chosen’ variable is assigned its value. That possibility requires examination of your entire code. I say «entire» because you already looked «everywhere». Therefore it is safe to presume that such an error would hide where you didn’t expect to find it. Now, if you prefer to think that the first reason is the cause, we can’t help you. And if you wish to consider the second possibility, please enable our help by adding your code to your question. – Variatus 04 май. 17 2017-05-04 13:06:46

@Variatus — thanks for your suggestions — I’ll post the code shortly – hmm 04 май. 17 2017-05-04 13:45:11

@Variatus — Have posted the code. Have also noticed it tends to go wrong on the 12th run of the Repeat_search_next() macro. – hmm 05 май. 17 2017-05-05 08:09:11

@Variatus Thanks for your help and suggestions. I’ve made some changes: -now no spaces in variable names -use public variable ‘Last_chosen’ in the call to the called sub and in the called sub -kept ‘Chosen’ in the ‘Select Case’ section — is this OK? -kept variable ‘Re_peat’ in the calls but ‘Repeat_nxt’ in the called sub — is this OK? Also, I’m not looking for in the comments, but for comments with a specific using ‘Name:-Last_chosen’ Thanks! – hmm 05 май. 17 2017-05-05 11:11:28

According to your code you are looking for «Duplicates» (short for «Duplicate paragraphs») anywhere in the comments. Are you sure that the ‘Name’ argument for the search limits the search to the author’s name? I researched this point and found MSDN not clear about it. Anyway, do you still have the same problem after the changes? Can you confirm that the search criterion — whether name or «Duplicate» — doesn’t occur anywhere in the text of the comments? – Variatus 05 май. 17 2017-05-05 11:32:54

1 ответ

On first examination of your code I find the following flaws.

  1. You have a public variable Last_chosen which is kept aligned with the private variables Cho_sen and Chosen . I didn’t find where these are being confused, but rather than look for such a point I would eliminate the two private variables and work with the public one only. You save a lot of code and eliminate any chance of confusion.
  2. You have a private variable named Repeat . «Repeat» is a key word reserved for the use of VBA. Select «Repeat» and press F1 for more information. Again, I doubt that this is the source of your problem, but the use of reserved words as variable names can cause unexpected, seemingly unrelated and usually unidentifiable errors. Better to choose another name

My suspicion now falls on another scenario. You are looking for certain words in the comments. What would happen, if the words you are looking for is found in the comment text of another author? In other words, you may need code to ensure that the match found actually represents the name of an author.

Please fix the above two points and comment on my suspicion. If the error still persists thereafter I will hack your code into smaller pieces. 🙂

Meanwhile, I suggest that you implement the following simplifications into your code. First, create a function like this one:-

When you call this function without an argument it will return an array, otherwise the array element specified by the argument. Use this function to load your dropdown.

Finally, replace your Select statements with this code.

Создан 05 май. 17 2017-05-05 09:30:51 Variatus

Поиск на листе Excel

Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What — Строка с текстом, который ищем или любой другой тип данных Excel

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

Читать еще:  Как восстановить кодировку текста в word

LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).

Примеры поиска функцией Find

Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»

Обратите внимание : Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

Пример 5: Найти последнюю колонку и столбец, заполненные данными

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;

— для обозначения символов *, ? и

. (т.е. чтобы искать в тексте вопросительный знак, нужно написать

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Как получить текст примечания в ячейку?

Есть таблица по платежам. В ячейках определенных столбцов в примечаниях(вкладка РецензированиеСоздать примечание) записывается дополнительная информация по платежу. Например, номер договора, на основании которого был произведен платеж. И теперь необходимо отобрать записи только по определенным договорам. Ячеек несколько сотен, просматривать и выписывать договора из комментариев вручную похоже на одну из разновидностей древнеримских пыток. Однако при помощи VBA сделать это совсем просто.

Function Get_Text_from_Comment(rCell As Range) On Error Resume Next Get_Text_from_Comment = rCell.Comment.Text End Function

Синтаксис вызова функции с листа Excel:
=Get_Text_from_Comment( A1 )
A1 — ячейка с примечанием, текст которого необходимо получить. Если комментарий в ячейке отсутствует, то функция вернет пусто.
Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: необходимо скопировать текст кода выше, перейти в редактор VBA( Alt+F11 ) -создать стандартный модуль(InsertModule) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций, отыскав её в категории Определенные пользователем (User Defined Functions) .

Текст из примечания без автора примечания
Слегка доработанная функция, в которой можно отсечь имя пользователя, создавшего комментарий:

Читать еще:  Диалоговое окно абзац в word

Function Get_Text_from_Comment(rCell As Range) As String Dim sTxt As String On Error Resume Next sTxt = rCell.Comment.Text Get_Text_from_Comment = Mid(sTxt, InStr(sTxt, «:») + 2) End Function

Синтаксис вызова с листа Excel такой же, как и в функции выше. Просто указываете внутри функции ссылку на ячейку.
=Get_Text_from_Comment( A1 )

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

‘————————————————————————————— ‘ Author : The_Prist(Щербаков Дмитрий) ‘ Профессиональная разработка приложений для MS Office любой сложности ‘ Проведение тренингов по MS Excel ‘ http://www.excel-vba.ru ‘ Purpose: Процедура записи текста из примечаний в ячейки выделенного диапазона ‘————————————————————————————— Sub CommentsToCell() Dim sTxt As String, res As String, rc As Range, rr As Range Dim IsDelAuthor As Boolean, IsDelComment As Boolean, IsReplaceCellVal As Boolean ‘запрашиваем параметры If MsgBox(«Оставлять автора комментария?», vbQuestion + vbYesNo, «www.excel-vba.ru») = vbNo Then IsDelAuthor = True End If If MsgBox(«Заменять значение, если в ячейке с комментариями уже есть текст?» & vbNewLine & _ «ДА(Yes) — значения ячеек будут заменены текстом комментариев» & vbNewLine & _ «НЕТ(No) — к имеющимся значениям будет добавлен текст комментария», vbQuestion + vbYesNo, «www.excel-vba.ru») = vbYes Then IsReplaceCellVal = True End If If MsgBox(«Удалять комментарии после обработки?», vbQuestion + vbYesNo, «www.excel-vba.ru») = vbYes Then IsDelComment = True End If On Error Resume Next ‘получаем в выделенном диапазоне только ячейки с комментариями Set rr = Selection.SpecialCells(xlCellTypeComments) If rr Is Nothing Then MsgBox «В выделенном диапазоне нет ячеек с комментариями», vbCritical, «www.excel-vba.ru» Exit Sub End If On Error GoTo 0 Application.ScreenUpdating = False ‘цикл по всем ячейкам с комментариями For Each rc In rr.Cells sTxt = rc.Comment.Text If IsDelAuthor Then res = Mid(sTxt, InStr(sTxt, «:») + 2) Else res = sTxt End If If IsReplaceCellVal Then rc.Value = res Else rc.Value = rc.Value & Chr(10) & res End If Next If IsDelComment Then rr.ClearComments End If Application.ScreenUpdating = True MsgBox «Комментарии записаны», vbCritical, «www.excel-vba.ru» End Sub

Код необходимо так же скопировать и вставить в стандартный модуль(Переходим в редактор VBA( Alt+F11 ) —InsertModule).
Выделить диапазон ячеек, комментарии из которых необходимо перенести, нажать Alt+F8 и выбрать код CommentsToCell . Код содержит несколько параметров:

  • Сначала необходимо будет выбрать оставить ли автора комментария при считывании текста из комментария. Если выбрать да — весь текст примечания будет перенесен как есть. Если выбрать Нет — то из комментария будет отсечена первая строка до символа двоеточия(:). Именно так по умолчанию Excel обозначает автора.
    Этот параметр нужен, если в ячейках нет автора.
  • Далее будет запрос: оставить значение в ячейках и дописать к ним текст примечания или заменить существующие значения в ячейке на текст комментария. Может пригодиться, если в ячейках записаны суммы платежей и надо добавить к ним из комментария номер договора, не убирая сами суммы.
  • И последний запрос будет: удалять комментарии из ячеек после записи текста из них в ячейки или оставить. Если выбрать да — то после обработки всех выделенных ячеек комментарии будут удалены. Это может пригодиться, если комментариев много. Их удаление может существенно облегчить файл.

Статья помогла? Поделись ссылкой с друзьями!

Поиск на листе Excel

Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What — Строка с текстом, который ищем или любой другой тип данных Excel

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

LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).

Примеры поиска функцией Find

Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»

Обратите внимание : Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

Читать еще:  Как сделать шаблон в word

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

Пример 5: Найти последнюю колонку и столбец, заполненные данными

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;

— для обозначения символов *, ? и

. (т.е. чтобы искать в тексте вопросительный знак, нужно написать

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Поиск документа Word из Excel

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

Фамилия, имя, класс — (ранг) (Завершено в ГГГГ-ММ-ДД ЧЧ: мм: сс)

, и каждый человек находится в новом «абзаце» (aka line) в Word.

У меня около 300 сотрудников, которым нужна информация, введенная в этот документ, и около 8 разных столбцов, которые мне нужно заполнить. Скрипт работает на удивление хорошо, однако он довольно медленный и занимает около 10 минут для одного столбца. Я в порядке с ним, так как он выполняет эту работу, но мне любопытно, есть ли способ упорядочить ее дальше и, возможно, добавить проверку ошибок (для несоответствий имен).

2 ответа

Общие примечания

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

Второй . Получите ссылку на объект Worksheet в начале функции вместо того, чтобы полагаться на вызовы на ActiveSheet

Третий — Использование адресации диапазона C2 или L3 не только труднее читать, но и менее эффективно. Вам не только нужно объединять строки, чтобы создавать адреса, но Excel просто должен преобразовать их обратно в числовые индексы. Если у вас нет по-настоящему веской причины не делать этого, использование .Cell(row, column) почти всегда лучше и намного проще использовать в циклах.

Четвертый . Привыкнуть к объявлению области ваших подписок и функций, чтобы убедиться, что вы только разоблачаете те, которые вы намереваетесь. Если вы оставите их выключенными, они по умолчанию станут общедоступными и начнут отображаться в вашем списке функций в книге и будут доступны для автозаполнения. Если это не то, что вы хотели бы показать в ячейке, то есть =SearchWordDoc(«this raises»,»an error») , объявите его как Private

Наконец . Объявите типы возвращаемых функций. Непонятно, что возвращает код ниже, а комментарий делает его хуже — он не возвращает код Date вообще, он возвращает String .

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

Производительность

Как отметил @RubberDuck, наибольшее повышение производительности, которое вы собираетесь получить, — это не из-за неоднократного открытия и закрытия документа Word. Большинство других предложений на месте, поэтому я ограничу этот ответ аспектом производительности кода.

На основе вашего существующего кода очевидно, что в документе Word есть только одна строка на человека, и все строки имеют (или должны иметь) ту же структуру. В основном вы выполняете поиск в файле Word на основе ключа. У VBA есть объект, который предназначен для выполнения ключевых поисков, которые на порядок быстрее, чем метод Word .Find — Scripting.Dictionary . Все, что вам нужно сделать, — сначала проанализировать документ как текст для создания вашего объекта. Например (со ссылкой на исполняемый файл Microsoft Scripting Runtime):

Затем все, что вам нужно сделать в вызывающем коде, это захват словаря из вашей функции синтаксического анализа и захват строк по мере необходимости на основе ключей:

Мое правило состоит в том, что вызовы Windows COM обычно дороги, и их лучше избегать, если существуют альтернативы. Это должно заканчиваться порядка секунд, а не минут, и большая часть времени обработки должна поступать от простого открытия документа Word.

Ссылка на основную публикацию
Adblock
detector