Excel VBA: как объяснить екселю, что ИВАНОВ - это фамилия

Автор smorodinka, 13 ноября 2016, 23:30

smorodinka

Здравствуйте, дорогие боги макросов. Я в свое время писала простые программки, теперь снова необходимо обновить знания.
Основы знаю, цикл могу собрать.
Обращаюсь к вам с просьбой подсказать, как выбрать фамилии из строк ниже, например:
1) перечислено для Иванова
2) списание в счет погашения Петрова
3) долг сидорова
...

Всего 5000 строк и вариаций разных.
Как из огромного массива слов объяснить, где фамилия, а где просто нарицательные слова?

Администратор

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

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

smorodinka

Я правильно поняла, что каждую фамилию из вспомогательного листа прогоняем по исходному?
Тоже думала об этом. Боюсь не затянется ли это по времени?

Администратор

Цитата:
Я правильно поняла, что каждую фамилию из вспомогательного листа прогоняем по исходному?


Да, правильно поняли.

Данные из вспомогательного листа нужно скопировать в vba-массив, затем уже циклом просматривать vba-массив.
Работа с vba-массивом быстрее, чем с самими ячейками.
Если макрос будет долго работать, то уже думать, что ещё оптимизировать - в программировании одно и то же можно делать разными способами, поэтому можно подбирать нужный способ, чтобы ускорить работу макроса.

Администратор

А можно делать и обратное действие: разбейте исходный текст на слова и ищете во вспомогательном листе.
Можно задействовать для поиска эксель-функции, может они ускорят поиск. В VBA с эксель-функциями можно работать через объект WorksheetFunction. Например, с помощью эксель-функции СЧЕТЕСЛИ можно считать, сколько раз встречается искомый текст. Эту функцию можно использовать и в VBA, при этом не нужно делать цикл по вспомогательному листу.


Администратор

Или чтобы не делать вспомогательный лист, можно попробовать использовать полуавтоматический способ.
Будет диалоговое окно. Макрос будет двигаться по анализируемым ячейкам, будет разбивать текст на слова, если слово начинается с большой буквы, то будет выводить это слово в диалог, а юзер будет принимать решение - фамилия это или нет. В диалоге будет кнопка и с помощью неё будет сделано нужное действие с фамилией.

smorodinka

Не вариант. Тут и адрес с большой буквы. Все подряд. Лучше через вспомогательный лист.