Макрос Экспорта файла в txt

Автор Konstanta, 13 декабря 2019, 12:32

0 Пользователи и 2 гостей просматривают эту тему.

Konstanta

Приветствую Вас, уважаемы форумчане!
Есть файл "Выгрузка" (приложен), из которого макрос  копирует строку с данными, вставляет её в новый файл, после чего данный файл сохраняет в формате txt с разделителями.


Макрос писался в Excel рекордером.
Sub Выгрузить_отчёт()
'
'   Выгрузить_отчёт Макрос

    Sheets("Выгрузка").Select
   

    Rows("3").Select
    Selection.Copy
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
     
    strDate = Format([B1], "mmmm yyyy")
Application.DisplayAlerts = False 'чтобы не задавал вопросы
PartOfName = ActiveWorkbook.ActiveSheet.[A1] & " Выгрузка за " & strDate ' вставляем в имя файла дату
ActiveWorkbook.SaveAs Filename:="C:\ФОТ\Отчёты\" & PartOfName & ".txt", FileFormat _
        :=xlText, CreateBackup:=False


ActiveWindow.Close

   
End Sub


Из Excel он выполняется вполне корректно и формирует текстовый файл "Москва Выгрузка за Декабрь 2019.txt" (приложен)

Но применяться файл планируется в Libre, для чего он сохранён как Libre документ.
Однако при запуске макроса в Calc он также выгружает готовый файл, но совершенно в другом формате  "Москва Выгрузка за Декабрь 2019.txt" (приложен)
При просмотре содержимого файла очевидно что это не txt

Я допускаю, что в Calc это делается вообще по-другому.
Прошу скорректировать направление.
Всем Спасибо!

economist

Запишите макрорекордером в LO Calc то же самое - получите макрос, в котором остается дописать как формировать имя файла. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Есть и другой путь - макрос на VBA/SB, формирующий TXT прямыми методами. Пример условный, доработайте под свои условия. Краткая нотация вида [A3:C3] - очень удобна. Вместо чисел можно ставить значения переменных.

Option VBASupport 1
Option Compatible

Sub saveTXT()
Open "D:\456.txt" for OutPut as #1
For Each n in Sheets(1).[A3:C3]
stroka=stroka & ";" & n
Next n
Print #1, stroka
Close #1
End sub 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Konstanta

Спасибо, economist!
Метод действительно работает! Это просто здорово и просто.
Вот только я пытался прикрутить к нему формирование имени файла из ячеек и дату.
Но в данном методе отсутствует сохранение через SaveAs поэтому просто не знаю куда поставить ссылку на ячейку [A1] из которой в имя файла должно стать значение и то же самое с датой [B1], чтобы получилось полное имя файла.
То, что я делал вызывает ошибку.



bigor

#4
Цитата: Konstanta от 13 декабря 2019, 13:43чтобы получилось полное имя файла.

Sub saveTXT()

strDate = Format(ActiveSheet.[B3], "mmmm yyyy")
FName = ActiveWorkbook.ActiveSheet.[A3] & " Выгрузка за " & strDate
Open "D:\" & FName for OutPut as #1
stroka=Sheets(1).[A3]&";"& Format(Sheets(1).[B3], "mmmm yyyy")
For Each n in Sheets(1).[c3:r3]
stroka=stroka & ";" & n
Next n
Print #1, stroka
Close #1
End sub  


и на "родном" SB

Sub SaveTXT_SB
Fname = ThisComponent.Sheets(0).getCellbyPosition(0,2).String &" Выгрузка SB за "& format(ThisComponent.Sheets(0).getCellbyPosition(1,2).String,"mmmm YYYY")
Open "D:\" & FName for OutPut as #1
stroka=ThisComponent.Sheets(0).getCellbyPosition(0,2).String &";" & format(ThisComponent.Sheets(0).getCellbyPosition(1,2).String,"mmmm YYYY")
n=2
While ThisComponent.Sheets(0).getCellbyPosition(n,2).String <> ""
'Print stroka
stroka=stroka & ";" & ThisComponent.Sheets(0).getCellbyPosition(n,2).String
n=n+1
wend
Print #1, stroka
Close #1
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta

Bigor, Ай Спасибо!
Всё работает!

Всем огромное Спасибо!

Konstanta

А получается что таким же образом можно не только по одной строке выгружать данные, но и целый массив?

bigor

Массив, наверное, через лист быстрее будет. 
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta

"Через лист" - это через как ?

bigor

Цитата: Konstanta от 13 декабря 2019, 14:48это через как ?
Как у вас в первоначальном варианте. Вот вариант на SB

Sub SaveMassTXT
Dim args(0) As New com.sun.star.beans.PropertyValue
Dim args1(1) As New com.sun.star.beans.PropertyValue
oDoc = ThisComponent.Sheets(0)
Fname= oDoc.getCellbyPosition(0,2).String &" Выгрузка SB за "& format(oDoc.getCellbyPosition(1,2).String,"mmmm YYYY")
sPathArh="D:\"
oRange = oDoc.getCellRangeByName("a3:r8")
Arr_1 = oRange.getDataArray()
args(0).Name ="Hidden"
args(0).Value = true
OutDoc = StarDesktop.loadComponentFromUrl("private:factory/scalc","_blank",0,args())
OutDoc.Sheets(0).getCellRangeByName("a1:r6").setDataArray(Arr_1)
args1(0).Name = "FilterName"
args1(1).Name = "FilterOptions"
args1(0).Value = "Text - txt - csv (StarCalc)"
args1(1).Value= "59,0,34,1,,0,false,true,false,false,false"
OutDoc.storeAsURL(ConverttoURL(sPathArh)& Fname & ".txt" ,args1())
OutDoc.close(true)
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta

Спасибо.
Попытаюсь разобраться с вариантом на SB.
Но он почему-то визуально кажется страшнее чем привычный на VBA

bigor

Да, кнопок больше нужно тыкать :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

StarBasic настолько страшен и длинен, что я каждый раз после него намеренно иду в Python, за "ремиссией" и получением удовольствия от кодинга.

На Python через библиотеку UNO - в LO Calc тоже все делается быстро, а код - еще более компактный. Но пишут на питоне очень мало. Видимо привычка, я тоже никак не "начну" :-)   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Цитата: economist от 13 декабря 2019, 17:48На Python через библиотеку UNO - в LO Calc тоже все делается быстро, а код - еще более компактный
а можно пример. Интересно посмотреть.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Konstanta

Цитата: Bigor от 13 декабря 2019, 15:52Как у вас в первоначальном варианте. Вот вариант на SB
Не мог я осилить Питон... Тупой наверное
А что в моём первоначальном варианте нужно исправить, чтобы было возможно выгрузить массив данных в корректный файл txt ?