Показать полную графическую версию : [решено] Текст по столбцам. Excel. VBS
Добрый день, Уважаемые.
Столкнулся с проблемой. Vbs пока что только осваиваю, поэтому прошу сильно не пинать.
В общем имеется текстовый файл с такой структурой:
25/10/2012;08:57:49;37.4639600;55.8085733;15
25/10/2012;08:57:50;37.4639600;55.8085733;15
25/10/2012;08:57:51;37.4639600;55.8085733;18
................................................................................
где первая и вторая колонка - дата и время соответственно.
Файл довольно большой, порядка 100000 строк и более.
Средствами VBS этот файл открывается в Excel (2010), и при помощи
Dim app
Set app = CreateObject("Excel.Application")
...........
app.Selection.TextToColumns app.ActiveSheet.Range("A1"), 1, 1, 0, 0, 0, 0, 0, 1, ";"'нашел где то в просторах интернета
разбивается на столбцы.
При этом первый столбец не меняет формат на "Дата". Да и при любом формате, уже вручную, остается без изменений.
Если же все сделать ручками в экселе, то при разбивке строк на колонке все хорошо работает.
Думаю причиной всему являются параметры процедуры TextToColumns, но пока не могу определить конкретику.
Поэтому прошу Вас помочь мне.
Заранее благодарен.
ай, ай, ай. Не в той ветке создал( перенесите пожалуйста!
Средствами VBS этот файл открывается в Excel (2010), »
1. Как именно открывается? Приведите весь значимый код.
2. Вам нужно открыть именно из WSH в Excel? Какова конечная цель? Что планируется делать с этими данными далее?
Приведите весь значимый код »
Const FileNameLog = "D:\1\log.txt"
Const FileNameSave = "D:\1\log.xlsx"
Dim app, book
Set app = WScript.CreateObject("Excel.Application")
app.Visible = true
Set book = app.Workbooks.Open(FileNameLog)
app.ActiveSheet.Columns("A:A").Select
app.Selection.TextToColumns app.ActiveSheet.Range("A1"), 1, 1, 0, 0, 0, 0, 0, 1, ";"
app.ActiveSheet.Columns("B:B").Select
app.Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"
app.ActiveSheet.UsedRange.Select
book.SaveAs FileNameSave,51
Set book = Nothing
app.DisplayAlerts = false
app.Quit
app.DisplayAlerts = true
Set app = Nothing
Вот в принципе весь код для этого текстового файла.
Какова конечная цель? »
Конечная цель заключается в том, что из 2х текстовых файлов создается 2 документа excel, из которых, в последующем, по средствам запросов "сопоставляются" данные из первого файла и из второго(по полям дат).
Попробовал сделать все вручную, записав при этом макрос. При действиях руками,- все работает. Но с этими же данными, но при помощи записанного макроса, так же не работает.
Коллега, не представляю, как Вы пробовали записывать макрос, если от него ничего в коде не осталось.
Пробуйте:
Option Explicit
Const xlDelimited = 1
Const xlDoubleQuote = 1
Const xlNormal = &HFFFFEFD1
Dim strFileNameLog
Dim strFileNameSave
Dim objWorkbook
strFileNameLog = "D:\1\log.txt"
strFileNameSave = "D:\1\log.xlsx"
With WScript.CreateObject("Excel.Application")
.Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
False, False, True, False, False, False, False, _
Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1))
For Each objWorkbook In .Workbooks
If objWorkbook.FullName = strFileNameLog Then
With objWorkbook
.SaveAs strFileNameSave, xlNormal
.Close
End With
Exit For
End If
Next
.Quit
End With
WScript.Quit 0
Конечная цель заключается в том, что из 2х текстовых файлов создается 2 документа excel, из которых, в последующем, по средствам запросов "сопоставляются" данные из первого файла и из второго(по полям дат). »
Может, есть смысл делать это сразу? Или там больше «ручное» сравнение?
Может, есть смысл делать это сразу? »
Может и есть, но в голову ничего больше не пришло к сожалению.
Коллега, не представляю, как Вы пробовали записывать макрос, если от него ничего в коде не осталось. »
Начал запись, сделал "текст по столбцам", закончил запись. Там был код. Я что - то не так сделал?(
Начал запись, сделал "текст по столбцам", закончил запись. Там был код. Я что - то не так сделал?( »
Угу. Запустил Microsoft Excel. Создал пустую книгу (если не было). Начал запись макроса. \Файл\Открыть (я, понятно, для пред-2007-х версий описываю), выбрал текстовый файл, ответил на вопросы по импорту. После открытия файла закончил запись макроса. Нажал Alt-F11, открыл в первой, пустой книге полученный модуль с записанным кодом. Перевёл с VBA на WSH.
Может и есть, но в голову ничего больше не пришло к сожалению. »
А то, смотрите — если запросы, то можно и непосредственно из текстовых файлов попробовать извлекать и связывать данные, представляя их как таблицы базы данных: «select … from … inner join … where … order …» и т.п.
Iska, Огромное спасибо все работает.
Еще такой вот вопрос.
Для даты используется формат даты (xlDMYFormat = 4), а если колонка содержит дату и время (дд/ММ/гггг чч:мм:сс), какой формат при этом необходимо использовать?
непосредственно из текстовых файлов попробовать извлекать и связывать данные, представляя их как таблицы базы данных »
Буду искать, изучать. Так было бы конечно же лучше. Спасибо за наводку)
Для даты используется формат даты (xlDMYFormat = 4), »
Где? В моём коде нет такого.
а если колонка содержит дату и время (дд/ММ/гггг чч:мм:сс), какой формат при этом необходимо использовать? »
Так у Вас же не содержит. У Вас два поля, разделённых «;», отдельно дата и отдельно время.
Где? В моём коде нет такого. »
Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) »
Разве это не оно?
Так у Вас же не содержит »
Это в этом файле. Есть другие, где содержатся такие даты :(
Разве это не оно? »
Оно. Я просто глазами всё искал именно упомянутую мнемоническую константу.
Это в этом файле. Есть другие, где содержатся такие даты »
LilLoco, надо пробовать — в принципе, сам формат дата/время поддерживается. Можете выложить часть файла, как делали это выше.
Я просто глазами всё искал именно упомянутую мнемоническую константу. »
Простите, ввел Вас в заблуждение =(
Можете выложить часть файла »
Да, конечно.
04/10/2012 15:24:23;[GSM Init SM] GSM: Read signal 31 strenght.
04/10/2012 15:24:25;[GSM Init SM] GSM: Read signal 31 strenght.
04/10/2012 15:24:27;[GSM Init SM] GSM: Read signal 31 strenght.
.................................
Вот так вот выглядит файл.
в принципе, сам формат дата/время поддерживается »
Угу, если делать, опять же, вручную - все работает.
если делать, опять же, вручную - все работает. »
Option Explicit
Const xlDelimited = 1
Const xlDoubleQuote = 1
Const xlNormal = &HFFFFEFD1
Dim strFileNameLog
Dim strFileNameSave
Dim objWorkbook
strFileNameLog = "E:\Песочница\0196\0002.txt"
strFileNameSave = "E:\Песочница\0196\0002.xls"
With WScript.CreateObject("Excel.Application")
.Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
False, False, True, False, False, False, False, _
Array(Array(1, 4), Array(2, 1))
For Each objWorkbook In .Workbooks
If objWorkbook.FullName = strFileNameLog Then
With objWorkbook
.SaveAs strFileNameSave, xlNormal
.Close
End With
Exit For
End If
Next
.Quit
End With
WScript.Quit 0
— более ничего не менял. Есть один момент: в первом файле даты были в непонятном формате: символ «/» обычно используется в формате даты «MM/DD/YY», а там явно было «DD/MM/YY». Тем не менее, Excel верно их распознал без дополнительных указаний. А в каком формате даты в новом файле?
А в каком формате даты в новом файле? »
Формат даты тот же, что и у первого файла «DD/MM/YY».
более ничего не менял »
Да, с приведенными данными работает. Но как только даты достигают значений, например, 25/03/2010 даты перестают обрабатываться, к сожалению :(
Возможен ли выход из этой ситуации, или же будет необходимо сначала привести дату к виду «MM/DD/YY»?
Возможен ли выход из этой ситуации, или же будет необходимо сначала привести дату к виду «MM/DD/YY»? »
LilLoco, я разобрался:
.Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
False, False, True, False, False, False, False, _
Array(Array(1, 4), Array(2, 1)), , , , , True
я разобрался »
А вот мне бы ума не хватило :(
Iska, Спасибо Вам огромное)
Буду искать, изучать. Так было бы конечно же лучше. »
За это время изучил и приспособил и этот вариант.
Спасибо ;)
Нужна помощь!
Имеется файл 1.xls типа
11.6308010-10 Амортизатор газовый задней двери "Соболь-Баргузин" Гродно ГАЗ 579
необходимо значение каждой строки первого столба взять в переменную, если переменная найдена в файле 2.xls типа
Код 13400030 Арт. 3163-10-1101009-00 УАЗ бак топливн.левый Патриот 5807,50 руб.
сформировать из 2.xls файл 3.xls
файлы http://rghost.ru/53730995
sov44, ткните пальцем, где она найдена?
Iska, в посте выше я показал только структуру файлов. Сами файлы в архиве по ссылке снизу. Пока удалось найти повторы 451-50-1701022
406.1006260-02
469-1701048
451-50-1701050-10
469-1108030
Перевёл excel в txt и парсю батником второй час. Но батник не вариант, нужен вывод в excel
sov44, непосредственно в Excel или из-под WSH будет ненамного быстрее. Вы ведь ищете 1) по подстроке; 2) всё во всех, т.е. 10894*2496=27191424 сравнений.
Iska, решил задачу батником и ручками. :nunchaku:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.