VBA неопределенная строковая структура - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь написать функцию в своем коде, которая позволяет мне искать конкретный файл по его имени.Функция работает, но теперь структура имени изменилась, и это вызвало у меня проблемы.

Мой код представлен в виде макросов, управляющих документом Word.Этот документ получает информацию из другой программы и помещает ее в поля формы в документе word.Затем мой код берет «значение» полей формы и использует их для поиска в конкретной папке файла .txt с именем, совпадающим с сохраненным значением из полей формы.

Теперь имя .txt былоизмененное имя будет иметь некоторую дополнительную информацию, к которой у меня нет доступа через слово document.

Пример: W_X_Y_Z.txt Где Y и Z доступны в полях формы документа и могут быть доступны, ноW и X мне неизвестны.

Нужно решить: так что мне нужно найти способ игнорировать W и X и основывать поиск только на Y и Z.

Идеи: у меня есть идея найти файл с такой структурой, как ?? _ ?? _ Y_Z.txt, но я не уверен, как это будет работать, как в "??"включать числа, если оно находится в строке и содержит "??"означают только 2 неизвестных символа или любое количество?Если только два, есть ли способ определить неизвестную строку, где оба символа неизвестны и количество символов?

Вторая идея - использовать разделитель на _ и каким-то образом выяснить, как я могу сказать,макрос, как игнорировать все после второго _.

Любые идеи или рекомендуемые исследования, которые я должен сделать, приветствуются.

Спасибо.


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

Код на данный момент:

ActiveDocument.FormFields("Remissnummer").Select
Remiss = Selection.Text
Selection.Collapse Direction:=wdCollapseStart

ActiveDocument.FormFields("Personid").Select
strTmpPersonnr = Selection.Text
intNumCharsPersNr = Len(strTmpPersonnr)
Selection.Collapse Direction:=wdCollapseStart

strFileName = strTmpPersonnr
p_strFileReportPath = "G:\HMC\Fysiologiska kliniken\Eko\Export\"
strImportFile = p_strFileReportPath & "*" & strFileName & "_" & Remiss & strFileExt

If Len(Dir$(strImportFile)) = 0 Then
MsgBox "Error"
Else
'starts importing values from the file

Этот метод работал, когда имя файла имело известную структуру, т.е. только Y_Z.txt Теперь, хотя структура изменилась, как я объяснил выше, две новые переменные неизвестны, могут быть что угодно из буквна цифры.

Я пытался с:

Ignore = "*"

strImportFile = p_strFileReportPath & Ignore & "_" & Ignore & "_" & strFileName & "_" & Remiss & strFileExt

, но он просто замерз, и при переходе в диспетчер задач вы могли видеть все больше и больше памяти выделяетсяк слову ... я остановил его через 10 минут.

Так что я догадываюсь, что не могу объяснить неизвестные части имени файла с помощью "*", но я вроде как потерян.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

AFAIK. В VBA вы можете использовать два метода для перебора файлов:

Если вы используете FileSystemObject , то вы выполняете итерацию по каждому файлу и проверяете имя файла, используя любое из следующих \ ng:

Если вы используете Dir (вызов Dir каждый раз без параметров для получения следующего имени файла), затем в дополнение к предыдущим методам можно передать шаблон имени файла в функцию 2 , и он будет возвращать только результаты, соответствующие шаблону.

Используете ли вы оператор Like или передаете шаблон в функцию Dir , ? в шаблоне соответствует любому отдельному символу, тогда как * соответствуетлюбое количество символов:

  • "ab?d" соответствует "abcd", "abgd", но не "abcgd"
  • "ab*d" соответствует "abcd", "abgd" и"abcgd"

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


1.Только в Windows, поскольку Office в Macintosh не поддерживает использование автоматизации ActiveX / COM.
2. Только в Windows.В Macintosh ? и * являются допустимыми символами имени файла и поэтому не могут использоваться для символов подстановки.

0 голосов
/ 06 июня 2018

Похоже, вы могли бы использовать RegEx.Просто поищите RegEx VBA и ознакомьтесь с концепцией.С его помощью вы можете создать запрос поиска для любого обычного шаблона.

здесь вы можете увидеть несколько примеров по StackOverflow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...