Makro eksportujące komórki do pliku.

Użytkowanie arkusza kalkulacyjnego

Makro eksportujące komórki do pliku.

Postprzez kris86k » N gru 02, 2018 7:00 pm

Witam.
Potrzebuję wyeksportować do pliku zakres komórek np: T2:V100 ale tylko wiersze w których A1:A100 są niepuste lub większe od 0 (nie ma to znaczenia).
Znalazłem skrypt jak poniżej. Czy da się go zmodyfikować do moich potrzeb aby filtrował wynik eksportu?

Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub CreateCSVFile
   Dim sURLFolder as String
   Dim sFileName As String
   Dim i As Integer
   Dim n As Integer
   Dim oSheet
   Dim oCell
   Dim oRange
   Dim CellContentArray
   
   REM Get the active sheet object
   oSheet = ThisComponent.getCurrentController.ActiveSheet
   
   REM Get the cell contents
   oRange = oSheet.getCellRangeByPosition(19,1,21,99)
   CellContentArray = oRange.getDataArray()
     
   REM Get the filename from cell M1 (column 12, row 0) of the active sheet
   oCell = oSheet.getCellByPosition(12,0)
   
   REM Get the folder name this file is saved in and append the filename
   sURLFolder=replace(ThisComponent.url,ThisComponent.title,"")
   sFileName = sURLFolder & oCell.getString() & "eksport.csv"
   
   REM Create a new file (if this filename exists, it will be deleted and replaced)
   n = FreeFile()
   Open sFileName For Output As #n
   
   REM Write the contents of the data array to the file
   REM This assumes all rows are six cells wide
   For i = 0 To UBound(CellContentArray)
      Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
   Next
   
   REM Close the file
   Close #n

End Sub
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » N gru 02, 2018 9:31 pm

Tablica
Kod: Zaznacz cały   Rozszerz widokZwiń widok
oRange = oSheet.getCellRangeByPosition(19,1,21,99)
CellContentArray = oRange.getDataArray()
obejmuje obszar T2:V100.
Można zrobić sobie drugą podobną, z obszarem A2:A100.

Pętla
Kod: Zaznacz cały   Rozszerz widokZwiń widok
For i = 0 To UBound(CellContentArray)
      Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
Next
wyprowadza do otwartego pliku #n i-ty wiersz z obszaru. Wystarczy, by robiła to warunkowo, coś w stylu
Kod: Zaznacz cały   Rozszerz widokZwiń widok
For i = 0 To UBound(CellContentArray)
   If CellContentArray(i)(0) > 0 Then
      Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
   Endif
Next
przy czym warunek trzeba starannie dobrać.
Ja napisałem CellContentArray(i)(0) > 0 -- to się odnosi do komórki z kolumny T. Chcąc sprawdzać kolumnę A, albo ustaw dla niej podobną tablicę (patrz pierwszy mój komentarz), albo wpisz warunek oSheet.getCellByPosition(0,i).getValue() > 0, który jawnie odsyła do i-tego wiersza w kolumnie A.
Taki warunek będzie dawał wartość True, jeżeli w komórce pojawi się liczba dodatnia; False, jeśli liczba będzie niedodatnia albo komórka będzie pusta; wygeneruje błąd jeżeli komórka zawiera tekst lub formułę z wynikiem tekstowym.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » N gru 02, 2018 10:02 pm

Niestety nie ogarniam tego. W komórce od A2:A100 będzie albo liczba dodatnia albo pusta.

Kod: Zaznacz cały   Rozszerz widokZwiń widok
  For i = 0 To UBound(CellContentArray)
   IF oSheet.getCellByPosition(0,i),getValue() > 0 Then
      Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
     Endif   
   Next


Wyrzucą błąd:
Błąd składni BASIC. Oczekiwano: Then.
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Pn gru 03, 2018 2:25 pm

Pisałem od ręki bez testowania. Banał: zamiast
oSheet.getCellByPosition(0,i),getValue()
ma być
oSheet.getCellByPosition(0,i).getValue()
Z kropką zamiast przecinka. W odpowiedzi poprawiłem.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez Jermor » Pn gru 03, 2018 2:36 pm

Mam wrażenie drogi Janie, że instrukcja basica powinna wyglądać tak:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
IF oSheet.getCellByPosition(0,i+1).getString <> "" Then

Trzeba przesunąć indeks o 1, bo indeks tablicy nie jest tożsamy z numerem wiersza.
Zastosowanie getString pozwala wyodrębnić tylko komórki rzeczywiście puste.
No i wystąpiła niezamierzona "literówka" przecinek zamiast kropki.
Albo tak jak proponowałeś:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
oRange2=osheet.getCellRangeByPosition(0,1,0,99)   
   CellConditionArray=oRange2.getDataArray()

i dalej
Kod: Zaznacz cały   Rozszerz widokZwiń widok
   If CellConditionArray(i)(0)<>"" Then
AOO 4.1.5, LO 6.0.6 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że ktoś podał rozwiązanie.
Jermor
 
Posty: 524
Dołączył(a): So paź 12, 2013 11:09 am

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » Pn gru 03, 2018 11:25 pm

Zadziałało połączenie obu wersji ;-) Bardzo dziękuję.

Mam teraz jeszcze jeden mały problem. Chcę wygenerować dwa różne pliki z różnymi zakresami. Zrobiłem jak poniżej ale generuje tylko plik z pierwszego zakresu. Co jest nie tak?


Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub CreateCSVFile
   Dim sURLFolder as String
   Dim sFileName As String
   Dim i As Integer
   Dim n As Integer
   Dim oSheet
   Dim oCell
   Dim oRange
   Dim CellContentArray
   
   REM Get the active sheet object
   oSheet = ThisComponent.getCurrentController.ActiveSheet
   
   REM Get the cell contents of U2 (column 20, row 1) to U3 (column 20, row 2)
   oRange = oSheet.getCellRangeByPosition(19,1,21,99)
   CellContentArray = oRange.getDataArray()
     
   REM Get the filename from cell M1 (column 12, row 0) of the active sheet
   oCell = oSheet.getCellByPosition(1002,0)
   
   REM Get the folder name this file is saved in and append the filename
   sURLFolder="D:\Dropbox\EU csv\AK CEN!\"
   sFileName = sURLFolder & oCell.getString() & "sqlcenyaukcje.csv"
   
   REM Create a new file (if this filename exists, it will be deleted and replaced)
   n = FreeFile()
   Open sFileName For Output As #n
   
   REM Write the contents of the data array to the file
   REM This assumes all rows are six cells wide
   For i = 0 To UBound(CellContentArray)
   IF oSheet.getCellByPosition(0,i+1).getValue() > 0 Then
      Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
     Endif   
   Next
   
   REM Close the file
   Close #n

End Sub

Sub CreateCSVFail1
   Dim sURLFolder as String
   Dim sFileName As String
   Dim i As Integer
   Dim n As Integer
   Dim oSheet
   Dim oCell
   Dim oRange
   Dim CellContentArray
   
   REM Get the active sheet object
   oSheet = ThisComponent.getCurrentController.ActiveSheet
   
   REM Get the cell contents of U2 (column 20, row 1) to U3 (column 20, row 2)
   oRange = oSheet.getCellRangeByPosition(21,1,21,99)
   CellContentArray = oRange.getDataArray()
     
   REM Get the filename from cell M1 (column 12, row 0) of the active sheet
   oCell = oSheet.getCellByPosition(1002,0)
   
   REM Get the folder name this file is saved in and append the filename
   sURLFolder="D:\Dropbox\EU csv\AK CEN!\"
   sFileName = sURLFolder & oCell.getString() & "sqlcenyaukcje1.csv"
   
   REM Create a new file (if this filename exists, it will be deleted and replaced)
   n = FreeFile()
   Open sFileName For Output As #n
   
   REM Write the contents of the data array to the file
   REM This assumes all rows are six cells wide
   For i = 0 To UBound(CellContentArray)
   IF oSheet.getCellByPosition(0,i+1).getValue() > 0 Then
      Print #n, CellContentArray(i)(0)
     Endif   
   Next
   
   REM Close the file
   Close #n

End Sub
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Wt gru 04, 2018 12:26 am

Ta instrukcja
Kod: Zaznacz cały   Rozszerz widokZwiń widok
oRange = oSheet.getCellRangeByPosition(19,1,21,99)
deklaruje eksportowany zakres. Wydaje się że w obu wersjach jest taka sama.
Poza tym nie wiem czy uruchamiasz jedno makro czy oba.

W jakim kierunku iść?
napisać JEDNO makro i wywołać je wielokrotnie dla różnych zakresów i różnych nazw plików.

Coś jak
Kod: Zaznacz cały   Rozszerz widokZwiń widok
    Sub CreateCSVFile(oSheet, startRow, startCol, endRow, endCol, sFileName)
       Dim i As Integer
       Dim n As Integer
       Dim oRange
       Dim CellContentArray
       
       REM Get the cell contents
       oRange = oSheet.getCellRangeByPosition(startCol,startRow,endCol,endRow)
       CellContentArray = oRange.getDataArray()
       
       REM Create a new file (if this filename exists, it will be deleted and replaced)
       n = FreeFile()
       Open sFileName For Output As #n
       
       REM Write the contents of the data array to the file
       For i = 0 To UBound(CellContentArray)-1
         v = oSheet.getCellByPosition(0,i+startRow).getValue()
         if v > 0 Then
          Print #n, CellContentArray(i)(0), CellContentArray(i)(1), CellContentArray(i)(2)
         Endif   
       Next
       
       REM Close the file
       Close #n

    End Sub

    Sub CreateCSVFiles()
       Dim sURLFolder as String
       Dim sFileName As String
       Dim oSheet
       Dim oCell
       
       REM Get the active sheet object
       oSheet = ThisComponent.getCurrentController.ActiveSheet
'       CreateCSVFile(oSheet, 0,1,10,5, "kuku.txt")
       
       REM Get the filename from cell M1 (column 12, row 0) of the active sheet
       oCell = oSheet.getCellByPosition(1002,0)
       
       REM Get the folder name this file is saved in and append the filename
       sURLFolder="D:\Dropbox\EU csv\AK CEN!\"

       sFileName = sURLFolder & oCell.getString() & "sqlcenyaukcje1.csv"
       CreateCSVFile(oSheet, 1,19,99,21, sFileName)
       
       sFileName = sURLFolder & oCell.getString() & "sqlcenyaukcje2.csv"
       CreateCSVFile(oSheet, 1,19,99,21, sFileName) rem WPISZ INNY ZAKRES
    End Sub
Testowałem zapis tylko zakomentowaną linijką (tą "kuku.txt").

Poza tym, WAŻNE:
taki sposób otwarcia pliku nie usuwa poprzedniej zawartości tylko po niej pisze.
Więc jeśli plik wynikowy csv uprzednio istniał, to jego zawartość stanie się mieszanką, w której sekcja początkowa pochodzi z nowego zapisu, ale jeśli poprzedni był dłuższy, to będzie spod niego 'wystawał' na końcu.
Uwaga powyższa wynika z przeprowadzonych eksperymentów. Nie mam wiele do czynienia z Basicem, ale zachowanie takie było dla mnie nieoczekiwane.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez Jermor » Wt gru 04, 2018 12:59 pm

U mnie zapisywanie działa poprawnie. Nie pojawia się nadpisywanie, tylko powstaje nowy plik.
Aby dopisywać nowe dane do istniejącego pliku w instrukcji OPEN należy użyć parametru FOR APPEND zamiast FOR OUTPUT.
No i trzeba pamiętać o usunięciu poprzedniej wersji pliku przed uruchomieniem makra. Można to zapisać w samym makro wykorzystując instrukcję KILL (z wykorzystaniem funkcji FILEEXIST do sprawdzenia czy plik istnieje).
AOO 4.1.5, LO 6.0.6 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że ktoś podał rozwiązanie.
Jermor
 
Posty: 524
Dołączył(a): So paź 12, 2013 11:09 am

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Wt gru 04, 2018 1:37 pm

Ad nieoczekiwane zachowanie
Nie jest to APPEND, tylko jakby dostęp READ+WRITE: `open filename for output as #n` nie usuwa zawartości otwieranego pliku, ustawia głowicę na jego początku. Dane zapisują się w trybie overwrite.

Grzebałem w dokumentacji Basica dla Libre i nie znalazłem wyjaśnienia.

Sprawdzałem na Linux SuSE Tumbleweed + firmowy LibreOffice 5.x, na razie tylko tam.

No i trzeba pamiętać o usunięciu poprzedniej wersji pliku przed uruchomieniem makra.
No właśnie.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez Jermor » Wt gru 04, 2018 3:03 pm

Starałem się posprawdzać, tak na szybko działanie.
"Nieoczekiwane zachowanie" o jakim piszesz pojawia się, (przynajmniej u mnie, LibreOffice w wersji dla Windows) tylko gdy plik jest otwarty jako RANDOM.
AOO 4.1.5, LO 6.0.6 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że ktoś podał rozwiązanie.
Jermor
 
Posty: 524
Dołączył(a): So paź 12, 2013 11:09 am

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » Cz gru 06, 2018 5:31 pm

Nie jest pewnie piękne ale działa. Kod poniżej. Bardzo dziękuję za pomoc. Odpisuję dopiero dziś bo nie dostałem powiadomienia o odpowiedzi.
Mam ostatnie pytanie czy da się z poziomu makra lub w inny sposób wykonać plik *.cmd lub kod w nim zawarty?

Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub EU
   Dim sURLFolder as String
   Dim sFileName As String
   Dim i As Integer
   Dim n As Integer
   Dim oSheet
   Dim oCell
   Dim oRange
   Dim CellContentArray
   
   REM Get the active sheet object
   oSheet = ThisComponent.getCurrentController.ActiveSheet
   
   REM Get the cell contents of U2 (column 20, row 1) to U3 (column 20, row 2)
   oRange = oSheet.getCellRangeByPosition(20,1,20,99)
   CellContentArray = oRange.getDataArray()
     
   REM Get the filename from cell M1 (column 12, row 0) of the active sheet
   oCell = oSheet.getCellByPosition(1002,0)
   
   REM Get the folder name this file is saved in and append the filename
   sURLFolder="D:\Dropbox\EU csv\AK CEN!\"
   sFileName = sURLFolder & oCell.getString() & "EU.SQL"
   
   REM Create a new file (if this filename exists, it will be deleted and replaced)
   n = FreeFile()
   Open sFileName For Output As #n
   
   REM Write the contents of the data array to the file
   REM This assumes all rows are six cells wide
   For i = 0 To UBound(CellContentArray)
   IF oSheet.getCellByPosition(0,i+1).getValue() > 0 Then
      Print #n, CellContentArray(i)(0)
     Endif   
   Next
   
   REM Close the file
   Close #n



   
   REM Get the active sheet object
   oSheet = ThisComponent.getCurrentController.ActiveSheet
   
   REM Get the cell contents of U2 (column 20, row 1) to U3 (column 20, row 2)
   oRange = oSheet.getCellRangeByPosition(19,1,19,99)
   CellContentArray = oRange.getDataArray()
     
   REM Get the filename from cell M1 (column 12, row 0) of the active sheet
   oCell = oSheet.getCellByPosition(1002,0)
   
   REM Get the folder name this file is saved in and append the filename
   sURLFolder="D:\Dropbox\EU csv\AK CEN!\"
   sFileName = sURLFolder & oCell.getString() & "MAG.SQL"
   
   REM Create a new file (if this filename exists, it will be deleted and replaced)
   n = FreeFile()
   Open sFileName For Output As #n
   
   REM Write the contents of the data array to the file
   REM This assumes all rows are six cells wide
   For i = 0 To UBound(CellContentArray)
   IF oSheet.getCellByPosition(0,i+1).getValue() > 0 Then
      Print #n, CellContentArray(i)(0)
     Endif   
   Next
   
   REM Close the file
   Close #n

End Sub
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Cz gru 06, 2018 8:06 pm

shell(polecenie)

Efektem ubocznym jest wykonanie polecenia ze wszystkimi jego skutkami.
Wynikiem jest kod zakończenia procesu, a w przypadku wykonania asynchronicznego kod procesu inicjującego to wykonanie. Zazwyczaj 0 znaczy że się udało.
Standardowe wyjście polecenia jest przekierowane do nul ew. /dev/null. Tak że nie licz na to, że zobaczysz wydruk terminalowy. Chyba że odpalisz cmd, a w nim plik.cmd.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » Pt gru 07, 2018 10:15 am

Dlaczego to nie działa? "Błąd, nie znaleziono pliku".
Próbowałem różnych przykładów z innych makr ale nic to nie daje . Albo nic się nie dzieje albo wyrzuca błąd.


Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub Main

shell ("D:\Dropbox\EU csv\AK CEN!\AKTUALIZACJA.CMD")


End Sub
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Pt gru 07, 2018 4:41 pm

Ma działać.

Biorąc na rozum, parametr przekazany do shell jest kompletnym wierszem poleceń. Twój system dostaje do realizacji polecenie
Kod: Zaznacz cały   Rozszerz widokZwiń widok
D:\Dropbox\EU csv\AK CEN!\AKTUALIZACJA.CMD
co sprowadza się do próby uruchomienia procesu z pliku
Kod: Zaznacz cały   Rozszerz widokZwiń widok
D:\Dropbox\EU
i przekazania mu dwóch parametrów:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
csv\AK
oraz
Kod: Zaznacz cały   Rozszerz widokZwiń widok
CEN!\AKTUALIZACJA.CMD

Jasne jest, że nie tędy idzie Twoja myśl. Winne są spacje w ścieżkach, zło wcielone.

Zabezpieczenia przeciw spacjom w komendach są dwa: albo (a) ochrona polecenia przez cudzysłowy, albo (b) ochrona spacji przez znak sterujący.

Poprawnymi poleceniami dla Windows byłyby:
wg (a) "D:\Dropbox\EU csv\AK CEN!\AKTUALIZACJA.CMD"
wg (b) D:\Dropbox\EU^ csv\AK^ CEN!\AKTUALIZACJA.CMD

Cudzysłowy które umieściłeś w kodzie są ogranicznikami stałej tekstowej w Basicu. Nie wchodzą w skład napisu, więc nie spełniają żadnej roli w samym poleceniu. Wewnątrz Basic-owego stringa znak " koduje się za pomocą "" -- coś w rodzaju symbolu sterującego. Więc zaklęcie w Basicu
Kod: Zaznacz cały   Rozszerz widokZwiń widok
shell("""D:\Dropbox\EU csv\AK CEN!\AKTUALIZACJA.CMD""")

winno spełnić Twoje oczekiwania. Możliwość z symbole ^ też jest do pomyślenia, z tym że użytkownik Windowsa może skonfigurować inny symbol jako sterujący w wierszu poleceń. Więc będzie to rozwiązanie teoretycznie bardziej zawodne.

Nb., kiedy uruchamiam komendę shell spod Basica w linuksie, cytowanie przez """komenda ze spacjami""" działa, natomiast wypunktowanie spacji symbolem sterującym (w tym przypadku jest to \ a nie ^) nie działa. Wiem nawet dlaczego, ale nie umiem powiedzieć na pamięć jak to będzie w cmd.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » Pt gru 07, 2018 6:59 pm

Dziękuję za dogłębne wyjaśnienie tematu.

Nie wyrzuca błędu ale też nic się nie dzieje po uruchomieniu marka.

Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub Main

shell("""D:\Dropbox\EU csv\AK CEN!\AKTUALIZACJA.CMD""")

End Sub
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » Pt gru 07, 2018 10:21 pm

Więc OK, bo co się ma dziać? pisałem, że okienko się nie odpali, wszystko dzieje się po cichu.
Wpisz w makrze
Kod: Zaznacz cały   Rozszerz widokZwiń widok
w = shell(komenda)
i zbadaj wartość w. Jeśli 0, tzn. się udało.
Sprawdź skutki wykonania: jakiś plik w systemie, wpis w bazie czy co tam.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » So gru 08, 2018 10:03 am

No właśnie ma się uruchomić plik w cmd który wykonuje zadnia na bazie danych i na końcu utworzyć plik. Po ręcznym uruchomieniu wszystko działa. Po uruchomieniu makra plik nie jest wykonywany. Link skopiowany, nie przepisywany. Zresztą po uruchomieniu ręcznym tego linku działa więc błędu w pisowni nie ma.
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm

Re: Makro eksportujące komórki do pliku.

Postprzez Jan_J » So gru 08, 2018 10:32 am

Spróbowałem zrobić to samo pod Windows 10. Skrypt uruchamia się jeśli w jego ścieżce nie ma spacji. W przypadku spacji, pod Windows, podane przeze mnie sposoby nie są skuteczne. W linuksie były OK; podobnie są one OK w wierszu poleceń Windows, cmd.exe.

Andrew Pitonyak (http://www.pitonyak.org/OOME_3_0.pdf) w rozdziale 9.2.4 dyskutuje ten problem i podaje te same sposoby co ja, plus jeszcze jeden dodatkowy z kodowaniem URL (sekwencje szesnastkowe, np. %20 zamiast spacji). W układzie LibreOffice + Windows 10 żadna nie działa.

Nie mam czasu szukać rozwiązania, zwłaszcza że te, które znam, _powinny_ działać. Dużo prościej jest zadbać o dyscyplinę (unikać spacji i liter niełacińskich w nazwach plików i katalogów), niż zastanawiać się jak ominąć ograniczenia i niekonsekwencje oprogramowania.

Aha: w Windows odpalony przez makro proces cmd dostaje przydzielone okno na ekranie. Czyli domyślnie widać, że się uruchomił. Stan tego okna da się kontrolować drugim, opcjonalnym parametrem funkcji shell.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3773
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro eksportujące komórki do pliku.

Postprzez kris86k » N gru 09, 2018 12:05 am

Dzięki za wyjaśnienie. Utworzyłem plik CMD bezpośrednio na dysku D z linkiem do pliku i działa.
OpenOffice 4.1.3 na Windows 7 x64 Prof
kris86k
 
Posty: 8
Dołączył(a): N gru 02, 2018 6:31 pm


Powrót do Calc

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości

cron