Страницы: 1
RSS
Преобразование из XLS в CSV по расписанию
 
Всем доброго времени.  
 
Понадобилось мне громоздкий файл xls с тремя листами преобразовывать (раз в 3 часа) в легкий csv, сохранять готовый файл в заданною папку и потом выбрасывать на фтп.  
 
Подскажите, можно ли все эти действия сделать с помощью только макроса? Или придется задействовать что-то еще?  
При том что в самом этом файле xls макрос располагать нельзя.
 
возможно все.  
Создаете отдельную книгу, в ней макрос.  
макрос: открыть книгу с тремя листами (workbooks.open)  
       for i = 1 to 3    
         сохранить лист(i) как csv в отдельную папку  
       next i  
       выложить на ftp  
 
Практически по каждой строчке на форуме можно найти много примеров.  
Далее создаем vbs файл (расширение .vbs - visual basic script)  
в котором прописываем запуск excel и выполнение нашего макроса.  
В планировщике windows (пуск-стандартные-служебные-планировщик) - указываем наш vbs с указанием периодичности запуска.  
 
Все.
 
Спасибо.  
 
Хотя бы понятно, в каком направлении двигаться.
 
Сохранение листа в формате Excel  
 http://excelvba.ru/code/SaveActiveSheet  
для сохранения в CSV надо заменить xlWorkbookNormal на xlCSV  
Вот ещё ссылка по теме  
 http://excelvba.ru/code/Range2CSV  
Отправка по FTP также не представляет сложностей:  
 http://excelvba.ru/tools/FTP
 
Да в общем всё можно сразу в vbs и прописать.  
Сохранять данные в csv можно и иначе - записывая данные в текст с нужным разделителем.  
Т.е. скриптом открываем xls, берём данные с трёх листов в 3 массива, каждый выгружаем в свой текст в папку или сразу на ftp.  
Примеры как писать в текст на форуме были, поищите по "Write".
 
{quote}{login=EducatedFool}{date=22.03.2012 10:04}{thema=}{post}Сохранение листа в формате Excel...  
Отправка по FTP также не представляет сложностей{/post}{/quote}  
Очень полезно, спасибо.  
 
Просто я менеджер магазина, а не программист. И постоянно ищу способы оптимизировать работу.  
Но я не могу охватить все, в частности программирование. Но однозначно могу разобраться, как работать с макросами, как их править, как вешать кнопки на панель...  
 
Поэтому задаю вопросы, что-то из предложенного могу воплотить в жизнь, что-то нет, так как "не пишу код".  
 
Но в целом, на форуме всегда нахожу помощь : )
 
выложите пример с данными (но чтоб файл был менее 100кб). на работе делать нечего - может быть наваял бы вам чего - нибудь.
 
Я например не знаю, кто тут на форуме программист :) В смысле по образованию и даже по профессии. Может EducatedFool - раз проекты деньги какие-то приносят, судя по сайту?
 
{quote}{login=Hugo}{date=22.03.2012 10:49}{thema=}{post}Да в общем всё можно сразу в vbs и прописать.  
Сохранять данные в csv можно и иначе - записывая данные в текст с нужным разделителем...{/post}{/quote}  
Спасибо.  
 
Можно, но я не умею программировать на vba : )  
Допустим, если есть код, то в нем я смогу поменять какие-то ячейки, листы и т.п.  
А вот с нуля написать, это нет.  
 
В файле есть три листа. На каждом листе есть артикул, название, цена, вес. Все они в разных столбцах для каждого листа.  
Задача: вывести все это в один лист csv, при этом чтобы все идентичные столбцы встали "друг под другом". т.е. все столбцы с артикулами из трех листов встают в один столбец в csv,  
все названия в другой столбец и т.д.    
 
Прилагаю файлы.  
 
Задача для меня стоит такая: макрос должен раз в три часа (допустим) преобразовывать xls, лежащий в заданной папке, в файл csv и сохранять его под заданным именем в  другую и в эту же папку. После этого он сразу должен забрасываться на фтп.  
 
И вот это "всё можно сразу в vbs и прописать." : )
 
ай, забыл файлы
 
и второй...  
 
p.s. а только по одному прикрепляются?
 
сразу два в архиве : )
 
Новая вводная требует подумать...  
Открыть-сохранить не проблема - а вот порядок навести всегда трудно :)  
Вернее требует работы.
 
{quote}{login=Hugo}{date=23.03.2012 10:30}{thema=}{post}Я например не знаю, кто тут на форуме программист :) В смысле по образованию и даже по профессии. Может EducatedFool - раз проекты деньги какие-то приносят, судя по сайту?{/post}{/quote}  
...ну или по "сложившимся обстоятельствам" и "патамушто нравится".  
Я графическим дизайном занимаюсь, но по профессии - инженер : )
 
martensit, я сейчас работаю как раз над такой программой  
(которая берет данные из любых файлов Excel или CSV, приводит их к единому формату, выгружает результат в CSV или XLS, и созданный файл отправляет по FTP)  
 
Программа будет куда сложнее, чем вам требуется, сможет брать данные из таблиц Excel любой структуры, и будет иметь кучу всяких дополнительных опций.  
 
Так что если вам потребуется брать данные не только из тех файлов, что вы прикрепили, а ещё и из других, более сложных, - ждите, скоро опубликую программу у себя на сайте  
(правда, она будет не бесплатная)
 
Не бесплатная - ну это нормально. Вопрос только когда это произойдет и нужны ли будут все эти дополнительные возможности именно для данной задачи.
 
Как-то со временем напряг... Но основную работу сделал - файл открыт, данные в массиве (поочерёдно из трёх листов), их позиции известны.  
Осталось записать в csv шапку и поочерёдно выложить данные из массивов через разделитель.  
Причём Эксель открывается скрыто и убивается в конце, если не был открыт перед работой.  
Позже или вечером постараюсь добить - ну или ещё кто...  
Код сохраните в текст с расширением vbs и запустите (путь к файлу измените на свой) - будут выведены 3 msgbox с названиями последних книг на листах.  
 
 
 
 
Dim objExcel  
Dim nEx  
Dim wb  
Dim excelSheet  
 
ActivateExcel  
objExcel.screenupdating=false  
set wb = objExcel.Workbooks.open ("D:\TMP\martensit\test.xls")  
 
for sh=1 to 3  
Set excelSheet = GetSheet(wb, sh) ' ищем книгу с таким листом, если не найдёна - будет ошибка скрипта  
LastCol = excelSheet.Cells(256).End(-4159).Column  
 
for i=1 to LastCol  
select case excelSheet.cells(i).value  
case "название": nazv=i  
case "цена1": c1=i  
case "цена2": c2=i  
case "цена3": c3=i  
case "артикул": art=i  
case "вес": ves=i  
case "количество": kol=i  
end select  
next  
 
LastRow = excelSheet.Cells(excelSheet.rows.count,nazv).End(-4162).row  
 
'msgbox nazv & "-" & c1 & "-" & c2 & "-" & c3 & "-" & art & "-" & ves & "-" & kol  
'название цена1 цена2 цена3 артикул вес количество  
 
a=objExcel.range(excelSheet.Cells(1), excelSheet.Cells(LastRow,LastCol)).value  
msgbox "Последняя книга на листе " &  sh & vblf & a(LastRow,nazv)  
 
next  
 
wb.close 0  
objExcel.screenupdating=true  
if nEx then objExcel.quit  
 
 
Private Function ActivateExcel()  
On Error resume next    
Set objExcel = GetObject(, "Excel.Application")  
If objExcel Is Nothing Then  
Set objExcel = CreateObject("Excel.Application")  
'objExcel.Visible = True  
nEx=true  
End If  
End Function  
 
'The GetSheet method returns an Excel Sheet according to the sheetIdentifier  
'ExcelApp - the Excel application which is the parent of the requested sheet  
'sheetIdentifier - the name or the number of the requested Excel sheet  
'return Nothing on failure  
Function GetSheet(ExcelApp, sheetIdentifier) 'As Excel.worksheet  
   On Error Resume Next  
   Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)  
   On Error GoTo 0  
End Function
 
Товарищ, держи.  
На диске C:\ создать папку C:\martensit\    
в нее распаковать архив, чтоб путь к файлу был C:\martensit\start.vbs  
 
файл stat.vbs можно поставить в планировщик на выполнение с заданной периодичностью. его можно редактировать в блокноте.  
 
Если Вас не устраивает место папки и т.д то пути надо будет везде менять.  
vbs запускает excel, открывает файл Macro.xls и выполняет процедуру exp (см моудль1)  
 
процедура exp - открывает книгу C:\martensit\xls.xls собирает данные с 3 листов    
и выгружает в csv (разделитель ;)  
 
Код старался комментировать. Если что спрашивайте.
 
Готово.  
Берёт файл "D:\TMP\martensit\test.xls", пишет в "c:\testfile.csv".  
Затем копируется в "c:\testfile2.csv".  
Меняйте пути на свои.  
 
 
 
Dim objExcel  
Dim nEx  
Dim wb  
Dim excelSheet  
Dim FSO  
Dim MyFile  
 
ActivateExcel  
 
objExcel.screenupdating=false  
 
On Error Resume Next  
set wb = objExcel.Workbooks.open ("D:\TMP\martensit\test.xls")  
if wb is nothing then  
'msgbox "error, no file!"  
objExcel.screenupdating=true  
if nEx then objExcel.quit  
end if  
 
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set MyFile = FSO.CreateTextFile("c:\testfile.csv", True)  
MyFile.WriteLine("название;цена1;цена2;цена3;артикул;вес;количество")  
 
for sh = 1 to 3  
Set excelSheet = GetSheet(wb, sh) ' ищем книгу с таким листом, если не найдёна - будет ошибка скрипта  
LastCol = excelSheet.Cells(256).End(-4159).Column  
 
for i=1 to LastCol  
select case excelSheet.cells(i).value  
case "название": nazv=i  
case "цена1": c1=i  
case "цена2": c2=i  
case "цена3": c3=i  
case "артикул": art=i  
case "вес": ves=i  
case "количество": kol=i  
end select  
next  
 
LastRow = excelSheet.Cells(excelSheet.rows.count,nazv).End(-4162).row  
 
'msgbox nazv & "-" & c1 & "-" & c2 & "-" & c3 & "-" & art & "-" & ves & "-" & kol  
'название цена1 цена2 цена3 артикул вес количество  
 
a=objExcel.range(excelSheet.Cells(1), excelSheet.Cells(LastRow,LastCol)).value  
 
'msgbox "Последняя книга на листе " &  sh & vblf & a(LastRow,nazv)  
 
for x = 2 to LastRow  
MyFile.WriteLine(a(x,nazv) & ";" & a(x,c1) & ";" & a(x,c2) & ";" & a(x,c3) & ";" & a(x,art) & ";" & a(x,ves) & ";" & a(x,kol))  
'цена1;цена2;цена3;артикул;вес;количество")  
next  
 
next  
 
wb.close 0  
objExcel.screenupdating=true  
if nEx then objExcel.quit  
MyFile.Close  
 
Set MyFile = fso.GetFile("c:\testfile.csv")  
MyFile.Copy ("c:\testfile2.csv")  
MyFile.Close  
 
Private Function ActivateExcel()  
On Error resume next    
Set objExcel = GetObject(, "Excel.Application")  
If objExcel Is Nothing Then  
Set objExcel = CreateObject("Excel.Application")  
'objExcel.Visible = True  
nEx=true  
End If  
End Function  
 
'The GetSheet method returns an Excel Sheet according to the sheetIdentifier  
'ExcelApp - the Excel application which is the parent of the requested sheet  
'sheetIdentifier - the name or the number of the requested Excel sheet  
'return Nothing on failure  
Function GetSheet(ExcelApp, sheetIdentifier) 'As Excel.worksheet  
   On Error Resume Next  
   Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)  
   On Error GoTo 0  
End Function
Страницы: 1
Читают тему
Наверх