Добрый день! Прошу помочь написать макрос. Суть: есть файл .csv требуется этот файл перевести в .txt и запаковать в .zip с определенным именем (желательно, чтобы имя автоматически присваивалось по шаблону, может подтягивалось бы из таблицы...Допустим, если исходник с именем 2.csv, то конечный файл архива должен быть 092016111002.txt.zip, а 3.csv будет 092016111003.txt.zip).
PS: последний раз макрос писал на лабораторной в институте...Ребят, помощь нужна в короткие сроки, поставили задачу мне за пару дней с этим разобраться.
Добрый день! Прошу помочь написать макрос. Суть: есть файл .csv требуется этот файл перевести в .txt и запаковать в .zip с определенным именем (желательно, чтобы имя автоматически присваивалось по шаблону, может подтягивалось бы из таблицы...Допустим, если исходник с именем 2.csv, то конечный файл архива должен быть 092016111002.txt.zip, а 3.csv будет 092016111003.txt.zip).
PS: последний раз макрос писал на лабораторной в институте...Ребят, помощь нужна в короткие сроки, поставили задачу мне за пару дней с этим разобраться.skobelev
Sub d() Dim c As Range, Fn$, An$ For Each c In [a2:a5] Zipp c.Offset(, 1).Value, c.Value Next End Sub Public Function Zipp(ZipName, FileToZip) 'Zips A File 'ZipName must be FULL Path\Filename.zip - name Zip File to Create OR ADD To 'FileToZip must be Full Path\Filename.xls - Name of file you want to zip Dim FSO As Object Dim oApp As Object If Dir(ZipName) = "" Then Open ZipName For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 End If Set oApp = CreateObject("Shell.Application") oApp.Namespace(ZipName).CopyHere (FileToZip) 'Keep script waiting until Compressing is done On Error Resume Next Do Until oApp.Namespace(ZipName).items.Count = 1 Application.Wait (Now + TimeValue("0:00:01")) Loop On Error GoTo 0 On Error Resume Next Set FSO = CreateObject("scripting.filesystemobject") FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True Set oApp = Nothing Set FSO = Nothing End Function
[/vba]
В первую колонку вставьте имена своих файлов. Вторая формульно высчитывает новое имя
Можно так: [vba]
Код
Sub d() Dim c As Range, Fn$, An$ For Each c In [a2:a5] Zipp c.Offset(, 1).Value, c.Value Next End Sub Public Function Zipp(ZipName, FileToZip) 'Zips A File 'ZipName must be FULL Path\Filename.zip - name Zip File to Create OR ADD To 'FileToZip must be Full Path\Filename.xls - Name of file you want to zip Dim FSO As Object Dim oApp As Object If Dir(ZipName) = "" Then Open ZipName For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 End If Set oApp = CreateObject("Shell.Application") oApp.Namespace(ZipName).CopyHere (FileToZip) 'Keep script waiting until Compressing is done On Error Resume Next Do Until oApp.Namespace(ZipName).items.Count = 1 Application.Wait (Now + TimeValue("0:00:01")) Loop On Error GoTo 0 On Error Resume Next Set FSO = CreateObject("scripting.filesystemobject") FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True Set oApp = Nothing Set FSO = Nothing End Function
[/vba]
В первую колонку вставьте имена своих файлов. Вторая формульно высчитывает новое имяSLAVICK
SLAVICK, Очень не плохо, спасибо!, Но необходимо чтобы файл внутри был расширения .txt и с именем как файл .zip только без .zip (если zip будет 92016111001.txt.zip, то внутри архива должен быть файл 92016111001.txt).
SLAVICK, Очень не плохо, спасибо!, Но необходимо чтобы файл внутри был расширения .txt и с именем как файл .zip только без .zip (если zip будет 92016111001.txt.zip, то внутри архива должен быть файл 92016111001.txt).skobelev
необходимо чтобы файл внутри был расширения .txt и с именем как файл .zip только без .zip
ну тогда вместо первого макроса так: [vba]
Код
Sub d() Dim c As Range, Fn$, An$ Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") For Each c In [a2:a5] Call objFSO.CopyFile(c.Value, c.Offset(, 1).Value) ' copy file as newFile Zipp c.Offset(, 2).Value, c.Offset(, 1).Value Kill c.Offset(, 1).Value Next End Sub
необходимо чтобы файл внутри был расширения .txt и с именем как файл .zip только без .zip
ну тогда вместо первого макроса так: [vba]
Код
Sub d() Dim c As Range, Fn$, An$ Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") For Each c In [a2:a5] Call objFSO.CopyFile(c.Value, c.Offset(, 1).Value) ' copy file as newFile Zipp c.Offset(, 2).Value, c.Offset(, 1).Value Kill c.Offset(, 1).Value Next End Sub
Manyasha, ммм, прям хочется развить и Ваш макрос , я двумя скриптами делал, то что вы в один оформили)) Хочется конечно, чтобы все файлики разом, как у SLAVICK, чтобы по заранее созданному шаблону упаковалось. Но и на этом большое спасибо вам Manyasha и SLAVICK , может что-то еще скинете, если время будет у вас
Manyasha, ммм, прям хочется развить и Ваш макрос , я двумя скриптами делал, то что вы в один оформили)) Хочется конечно, чтобы все файлики разом, как у SLAVICK, чтобы по заранее созданному шаблону упаковалось. Но и на этом большое спасибо вам Manyasha и SLAVICK , может что-то еще скинете, если время будет у вас skobelev
Manyasha, Доброе утро! А можно Вас еще попросить дополнить макрос, чтобы до сохранения вставлялся столбец с цифрой 1 и внутри текстового файла получались бы теже строки как в вашем варианте только в конце еще "1;" (пример одной строки файла: 0:50,356;321,856;322;1; ) ?) Я бы был счастлив)))
Manyasha, Доброе утро! А можно Вас еще попросить дополнить макрос, чтобы до сохранения вставлялся столбец с цифрой 1 и внутри текстового файла получались бы теже строки как в вашем варианте только в конце еще "1;" (пример одной строки файла: 0:50,356;321,856;322;1; ) ?) Я бы был счастлив)))skobelev
SLAVICK, Доброе утро! Всё бы хорошо, но структура внутри текстового файла не соответствует моей... Попробую конечно объединить труды и ваши SLAVICK и Manyasha , но чувствую у меня не получится))
SLAVICK, Доброе утро! Всё бы хорошо, но структура внутри текстового файла не соответствует моей... Попробую конечно объединить труды и ваши SLAVICK и Manyasha , но чувствую у меня не получится))skobelev
Sub csvToTxt() Application.ScreenUpdating = False Dim pathTxt$, temp$ Dim rarName$, appWinRar$, str$ Dim lr&, lc&, i&, j&, r& Dim wbCsv As Workbook, sh As Worksheet Set sh = ThisWorkbook.Sheets(1) appWinRar = "C:\Program Files\WinRAR\WinRAR.exe a -ep1 -df" With sh For r = 2 To .Cells(Rows.Count, 1).End(xlUp).Row Set wb = Workbooks.Open(.Cells(r, 1)) pathTxt = .Cells(r, 2) With wb.Sheets(1) lr = .Cells(.Rows.Count, 1).End(xlUp).Row lc = .Cells(1, .Columns.Count).End(xlToLeft).Column Open pathTxt For Output As #1 For i = 1 To lr temp = i - 1 & ":" For j = 1 To lc temp = temp & .Cells(i, j) & ";" Next j temp = temp & "1;" Print #1, temp Next i Close #1 rarName = sh.Cells(r, 3) str = appWinRar & " """ & rarName & """ """ & pathTxt & """ " Shell str, vbHide End With wb.Close False Next r End With Application.ScreenUpdating = True End Sub
[/vba]
Таблицу с именами файлов взяла у Ярослава. [vba]
Код
Sub csvToTxt() Application.ScreenUpdating = False Dim pathTxt$, temp$ Dim rarName$, appWinRar$, str$ Dim lr&, lc&, i&, j&, r& Dim wbCsv As Workbook, sh As Worksheet Set sh = ThisWorkbook.Sheets(1) appWinRar = "C:\Program Files\WinRAR\WinRAR.exe a -ep1 -df" With sh For r = 2 To .Cells(Rows.Count, 1).End(xlUp).Row Set wb = Workbooks.Open(.Cells(r, 1)) pathTxt = .Cells(r, 2) With wb.Sheets(1) lr = .Cells(.Rows.Count, 1).End(xlUp).Row lc = .Cells(1, .Columns.Count).End(xlToLeft).Column Open pathTxt For Output As #1 For i = 1 To lr temp = i - 1 & ":" For j = 1 To lc temp = temp & .Cells(i, j) & ";" Next j temp = temp & "1;" Print #1, temp Next i Close #1 rarName = sh.Cells(r, 3) str = appWinRar & " """ & rarName & """ """ & pathTxt & """ " Shell str, vbHide End With wb.Close False Next r End With Application.ScreenUpdating = True End Sub