Используя VBA, я пытаюсь преобразовать текстовые файлы в книги Excel и вызвать макрос в другом модуле.Затем сделайте то же самое в других подпапках. - PullRequest
0 голосов
/ 28 июня 2019

Используя VBA, я пытаюсь преобразовать текстовые файлы в книги Excel, открыть их, а затем вызвать макрос в другом модуле (Call DataCleanBehfMRI). Затем сделайте то же самое, просматривая текстовые файлы в других подпапках.

Структура папок:

V:\Behavioral\Twin_behaviorTry\19510196-1\WorkingMemory.txt

V:\Behavioral\Twin_behaviorTry\19510197-1\WorkingMemory.txt

и т.д.

Таким образом, каждый файл "WorkingMemory.txt" содержит данные, по которым я хочу запустить макросы, для каждого предмета (19510196-1,19510197-1 и т. Д.).

Я попробовал код для циклического просмотра отдельных файлов в нескольких папках и попытался адаптировать его к текстовым файлам, но он просто пропускает код с "Workbooks.OpenText filename:=folderPath & filename, _" до "end if".

Sub LoopSubfoldersAndFiles()
Dim foo As Object
Dim folder As Object
Dim subfolders As Object
Dim MyFile As String
Dim wb As Workbook
Dim CurrFile As Object

With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("V:\Behavioral\Twin_behaviorTry\")
Set subfolders = folder.subfolders
MyFile = "*.txt"

For Each subfolders In subfolders

Set CurrFile = subfolders.Files

    For Each CurrFile In CurrFile
        If CurrFile.Name = MyFile Then
            Workbooks.OpenText filename:=folderPath & filename, _
    Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
    xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _
    Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), _
    Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:=True
    Set wb = ActiveWorkbook

    'Call a subroutine here to operate on the just-opened workbook
    Call DataCleanBehfMRI
    'close open work book

    wb.Close SaveChanges:=False

    filename = Dir
        End If
    Next

Next

Set fso = Nothing
Set folder = Nothing
Set subfolders = Nothing

With Application
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With

End Sub

Это довольно сложно, но я был бы очень признателен за предложения!

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Я вижу как минимум 3 проблемы с вашим кодом.

  • Первое уже упоминалось в комментарии Микку и в ответе Викрама: If CurrFile.Name = MyFile Then никогда не будет верным, когда вы сравниваете имя файла (например, WorkingMemory.txt со строкой *.txt. Вы можете исправить это, используя Right -Функция для сравнения только самых правых 4-х символов. В качестве альтернативы вы можете использовать like -оператор: If CurrFile.Name like MyFile Then, который будет учитывать подстановочный знак. Я бы посоветовал использовать lcase -функцию так что вы можете поймать также файл WorkingMemory.TXT:

    If lcase(CurrFile.Name) like "*.txt" Then
    
  • Во-вторых, вы не должны использовать одни и те же переменные для коллекций (subfolders, CurrFile) и переменные, которые вы используете для циклического перебора этой коллекции с помощью For Each. Хотя, кажется, что в этом случае работает, нет никакой гарантии. В вашем случае нет необходимости сохранять коллекцию в промежуточную переменную, используйте логику, такую ​​как For Each subfolder in folder.subfolders и For Each currFile in subfolder.Files.

  • В-третьих, в Workbook.Open вы используете необъявленную переменную folderPath, поэтому имя файла будет неправильным (и открытие не будет выполнено). Совет: поместите Option Explicit в верхней части вашего модуля, это гарантирует, что все переменные должны быть объявлены, и вы поймете такие ошибки намного легче. Я бы предложил использовать промежуточную переменную для создания полного имени файла перед его открытием.

Некоторые другие вещи, которые стоит упомянуть:

  • Workbook.Open - это функция , которая возвращает открытую книгу, поэтому вы можете назначить результат непосредственно вашей wb -вариаторе.

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

    Sub DataCleanBehfMRI(wb as Workbook)
    
  • Команда Dir в конце вашего внутреннего цикла бесполезна, похоже, это реликт от более ранних попыток.

Итак, ваш код может выглядеть так:

Const baseFolder = "V:\Behavioral\Twin_behaviorTry\"

Set folder = fso.GetFolder("V:\Behavioral\Twin_behaviorTry\")
Dim subfolder as object
For Each subfolder In folder.subfolders
    For Each currFile In subfolder.Files
        If lcase(currFile.Name) like "*.txt" then
            dim fullFileNameas string
            fullFileName=  baseFolder & subFolder.Name & currFile.Name
            Debug.Print "I will open now " & fullFileName
            set wb = Workbooks.OpenText(filename:=fullFileName... )
            DataCleanBehfMRI wb
       End If
    Next currFile 
Next subFolder

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

0 голосов
/ 28 июня 2019

Вместо строки:

If CurrFile.Name = MyFile Then

Попробуйте использовать строку:

If Dir(MyFile) = CurrFile.Name Then

И она должна работать, надеюсь.

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