Фрагмент кода ниже изменен из более крупного проекта, в котором я собираю данные из текстовых файлов и выводю эти данные в таблицу Excel (VBA listobject). Код перебирает все текстовые файлы в указанной папке в поисках файлов, соответствующих определенным условиям. Допустимые файлы имеют заголовок, содержащий тег ## DATA FILE ##
в первой строке и некоторые метаданные в следующих нескольких строках. Я использую FileSystemObject
из Microsoft Scripting Runtime, чтобы открывать эти файлы и проходить построчно. Для этого примера я предполагаю, что у меня есть текстовый файл в папке C:\MyFolder
с допустимым тегом в первой строке, например, со следующим содержимым:
## DATA FILE ##
Version: 49
123 456 789 Some information
111 444 000 Further items
При такой настройке приведенный ниже код должен выполняться плавно и выводить «Тест пройден» в ближайшее окно. Если строка тега изменена, код должен вместо этого представить окно сообщения, запрашивающее у пользователя дальнейшие инструкции.
Теперь, если текстовый файл не содержит необходимый тег в первой строке, я хотел бы добавить опцию, чтобы вручную открывать и редактировать этот файл в блокноте во время выполнения, а затем продолжить выполнение. Я подготовил окно сообщения Да-Нет-Отмена, которое можно использовать, чтобы решить, что делать, но как я могу открыть файл для ручного редактирования во время выполнения?
Option Explicit
Sub LoopThroughFiles()
' Loops through text files looking for files matching some conditions.
' Files that match are processed further.
' For files that don't match, the user can choose to inspect and
' modify the source file.
' Requires that a reference is set to Tools -> References
' -> Microsoft Scripting Runtime
Dim FSO As FileSystemObject
Dim TSO As TextStream
Dim oFolder, oFile As Object
Dim sFileName, sLine, sMsg As String
Dim lMsg As Long
Const sPath As String = "C:\MyFolder\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(sPath)
' Loop through files:
For Each oFile In oFolder.Files
sFileName = oFile.Name
' Treat only text files:
If Right(sFileName, 4) = ".txt" Then
Set TSO = FSO.OpenTextFile(sPath & sFileName, ForReading)
' Check that conditions are met:
sLine = TSO.ReadLine
If Not sLine = "## DATA FILE ##" Then
sMsg = "The following file does not seem to " & _
"contain valid input data:" & vbNewLine & vbNewLine
sMsg = sMsg & sFileName & vbNewLine & vbNewLine
sMsg = sMsg & "Would you like to manually inspect " & _
"the file?" & vbNewLine & _
"(Click No to continue running the script " & _
"; Cancel to exit.)"
lMsg = MsgBox(sMsg, vbYesNoCancel)
Debug.Print lMsg
Stop
'
' OPTION HERE TO MANUALLY OPEN AND EDIT THE TEXT FILE IN NOTEPAD
'
Else
Debug.Print "Test passed"
' Other code here to further process valid data.
End If
TSO.Close
End If
Next oFile
End Sub