Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Интеллектуальная загрузка данных на лист Excel

411
16 сентября 2009 года
Serzh
136 / / 09.07.2003
Столкнулся с проблемой загрузки данных в Excel из текстового файла.
Исходный файл не имеет четкой структуры, записи разделяются символами
0Dh 0Ah. Но дело даже не в этом.
Как открыть текстовый файл я сообразил, а вот как читать его по записям
переменной длины, да еще определить момент достижения конца файла
средствами VBA не могу понять!...
Кто и что может по этому поводу присоветовать?
405
16 сентября 2009 года
Dmitrii
554 / / 16.12.2004
Каков размер файла?
411
17 сентября 2009 года
Serzh
136 / / 09.07.2003
Цитата: Dmitrii
Каков размер файла?




Б-альшой!! Точнее более 50 метров...

405
17 сентября 2009 года
Dmitrii
554 / / 16.12.2004
Цитата: Serzh
... более 50 метров...


Если размер файла не превышает 100 МБ, то можно воспользоваться средствами FSO.
Общий алгоритм таков:
1. Прочитать файл целиком и присвоить его содержимое в качестве значения строковой переменной;
2. С помощью цикла и функции [color=blue]Replace()[/color] заменить все возможные виды разделителей между элементами на какой-либо один разделитель (назовём его "универсальным символом");
3. С помощью функции [color=blue]Split()[/color] преобразовать значение базовой строковой переменной в массив строк, используя в качестве разделителя символ новой строки;
4. С помощью цикла и функции [color=blue]Split()[/color] последовательно преобразовывать каждую строку полученного на предыдущем шаге массива в отдельный массив, используя в качестве разделителя "универсальный символ".

Пример:

Код:
Sub Example()
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


На последнем же шаге надо анализировать состав полученных элементов нового массива и выполнять с ними нужные действия.
411
18 сентября 2009 года
Serzh
136 / / 09.07.2003
br /> Sub Example()
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 и т.п.

405
18 сентября 2009 года
Dmitrii
554 / / 16.12.2004
Цитата: Serzh
Однако это "чистый" VB...

Это не "чистый" VB, а средства FSO, которые ориентированы на использование в сценариях.

Цитата: Serzh
... а поймет ли его VBA-интерпретатор встроенный в Excel? Я имею ввиду методы типа OpenTextFile,
ReadAll и т.п.

Если в системе имеется и зарегистрирована библиотека scrrun.dll ([color=blue]Microsoft Scripting Runtime[/color]), а именно так дело обстоит со стандартной комплектацией Windows, начиная с версии 2000, то обязательно поймёт.

411
18 сентября 2009 года
Serzh
136 / / 09.07.2003
Цитата: Dmitrii

Если в системе имеется и зарегистрирована библиотека scrrun.dll ([color=blue]Microsoft Scripting Runtime[/color]), а именно так дело обстоит со стандартной комплектацией Windows, начиная с версии 2000, то обязательно поймёт.



А как узнать про методы объектов этой самой библиотеки?
Меня смущает метод ReadAll. Мои 50 метров он считывает секунды 4,
и потом вся эта хрень висит в памяти, пока не закончится обработка...

405
18 сентября 2009 года
Dmitrii
554 / / 16.12.2004
Цитата: Serzh
А как узнать про методы объектов этой самой библиотеки?..

Заглянуть в MSDN, разумеется:
http://msdn.microsoft.com/en-us/library/hww8txat(VS.85).aspx

Цитата: Serzh
... Меня смущает метод ReadAll. Мои 50 метров он считывает секунды 4, и потом вся эта хрень висит в памяти, пока не закончится обработка...

Ну, читайте построчно с помощью метода [color=blue]ReadLine[/color].

411
21 сентября 2009 года
Serzh
136 / / 09.07.2003
Вот теперь то что надо! Спасибочки!...
P.S.
То, да не то!...
Загрузка одним махом 50 метров текста выполняется по
уточненным данным 14 секунд, а последующая разборка
столь длинной строки с "интеллектуальным" заполнением
ячеек листа - без малого 6 часов!!!
И то обработка завершилась аварийно - видать по пере-
полнению переменных на строке с номером 32835(??),
хотя соответствующие переменные для подсчета
номеров позиций в строке объявлены как Long,
а переменные для значений функции Timer - как Single...
С методом ReadLine я и пробовать не стал - ясен пень -
время обработки вырастет раза в полтора как минимум,
а результат будет тот же - аварийное завершение.
Вот так-с!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог