Интеллектуальная загрузка данных на лист Excel
Исходный файл не имеет четкой структуры, записи разделяются символами
0Dh 0Ah. Но дело даже не в этом.
Как открыть текстовый файл я сообразил, а вот как читать его по записям
переменной длины, да еще определить момент достижения конца файла
средствами VBA не могу понять!...
Кто и что может по этому поводу присоветовать?
Б-альшой!! Точнее более 50 метров...
Если размер файла не превышает 100 МБ, то можно воспользоваться средствами FSO.
Общий алгоритм таков:
1. Прочитать файл целиком и присвоить его содержимое в качестве значения строковой переменной;
2. С помощью цикла и функции [color=blue]Replace()[/color] заменить все возможные виды разделителей между элементами на какой-либо один разделитель (назовём его "универсальным символом");
3. С помощью функции [color=blue]Split()[/color] преобразовать значение базовой строковой переменной в массив строк, используя в качестве разделителя символ новой строки;
4. С помощью цикла и функции [color=blue]Split()[/color] последовательно преобразовывать каждую строку полученного на предыдущем шаге массива в отдельный массив, используя в качестве разделителя "универсальный символ".
Пример:
Dim objFS As Object, objFile As Object
Dim strFile As String, strTemp As String, arrFile, arrLine, arrDelim
arrDelim = Array(",", ";", " ")
strTemp = "#"
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\Temp\KM.txt")
strFile = objFile.ReadAll
objFile.Close
Set objFile = Nothing
Set objFS = Nothing
For i = 0 To UBound(arrDelim)
strFile = Replace(strFile, arrDelim(i), strTemp)
Next
arrFile = Split(strFile, vbNewLine)
MsgBox UBound(arrFile) & vbNewLine & arrFile(0) & vbNewLine & arrFile(UBound(arrFile))
For i = 0 To UBound(arrFile)
arrLine = Split(arrFile(i), strTemp)
For j = 0 To UBound(arrLine)
MsgBox arrLine(j)
Next
Next
Erase arrFile
Erase arrLine
End Sub
На последнем же шаге надо анализировать состав полученных элементов нового массива и выполнять с ними нужные действия.
Dim objFS As Object, objFile As Object
Dim strFile As String, strTemp As String, arrFile, arrLine, arrDelim
arrDelim = Array(",", ";", " ")
strTemp = "#"
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\Temp\KM.txt")
strFile = objFile.ReadAll
objFile.Close
Set objFile = Nothing
<skipped>
Однако это "чистый" VB, а поймет ли его VBA-интерпретатор встроенный в Excel? Я имею ввиду методы типа OpenTextFile,
ReadAll и т.п.
Это не "чистый" VB, а средства FSO, которые ориентированы на использование в сценариях.
ReadAll и т.п.
Если в системе имеется и зарегистрирована библиотека scrrun.dll ([color=blue]Microsoft Scripting Runtime[/color]), а именно так дело обстоит со стандартной комплектацией Windows, начиная с версии 2000, то обязательно поймёт.
Если в системе имеется и зарегистрирована библиотека scrrun.dll ([color=blue]Microsoft Scripting Runtime[/color]), а именно так дело обстоит со стандартной комплектацией Windows, начиная с версии 2000, то обязательно поймёт.
А как узнать про методы объектов этой самой библиотеки?
Меня смущает метод ReadAll. Мои 50 метров он считывает секунды 4,
и потом вся эта хрень висит в памяти, пока не закончится обработка...
Заглянуть в MSDN, разумеется:
http://msdn.microsoft.com/en-us/library/hww8txat(VS.85).aspx
Ну, читайте построчно с помощью метода [color=blue]ReadLine[/color].
P.S.
То, да не то!...
Загрузка одним махом 50 метров текста выполняется по
уточненным данным 14 секунд, а последующая разборка
столь длинной строки с "интеллектуальным" заполнением
ячеек листа - без малого 6 часов!!!
И то обработка завершилась аварийно - видать по пере-
полнению переменных на строке с номером 32835(??),
хотя соответствующие переменные для подсчета
номеров позиций в строке объявлены как Long,
а переменные для значений функции Timer - как Single...
С методом ReadLine я и пробовать не стал - ясен пень -
время обработки вырастет раза в полтора как минимум,
а результат будет тот же - аварийное завершение.
Вот так-с!!!