Skomplikowana tabela przestawna

Użytkowanie arkusza kalkulacyjnego
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Skomplikowana tabela przestawna

Post autor: damswi »

Witam chciałbym stworzyć plik CSV który będzie składał się z 3 kolumn. Produkty, klienci, rabaty. Mój plik CSV wygląda tak ( załącznik rabaty.csv ) a chciałbym żeby wyglądał tak dla wszystkich produktów ( załącznik rabaty2.csv ).
Załączniki
rabaty2.ods
Wersja docelowa
(54.61 KiB) Pobrany 120 razy
rabaty.ods
Wersja pierwotna
(126.17 KiB) Pobrany 126 razy
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Piszesz o załączniku csv ale załączasz pliki ods, czyli Calca. Zakładam jednak, że faktycznie chcesz otrzymać plik csv.
To zadanie jest do zrobienia za pomocą formuł i następnie pomocniczych przekształceń ale pojawia się w nim efekt skali. Twoja tabela ma 2203 wiersze i 456 kolumn. Każdy rekord ma powstać na podstawie pozycji z pierwszej kolumny i pierwszego wiersza. To znaczy, że powstanie 1 001 910 rekordów utworzonych za pomocą tylu samo formuł.
Ponadto jak zobaczyłem tabela zawiera 475 246 pozycji pustych i 273 520 zerowych dla których jak sądzę tworzenie rekordu nie jest konieczne.
Dlatego jedynym rozsądnym rozwiązaniem jest makro. Przekopiuj je sobie do swojego pliku i uruchom.
Makro utworzy plik csv o podanej przez ciebie nazwie w podanym folderze. Pozycje puste albo z wpisanym zerem nie będą uwzględniane w utworzonym pliku. Separatorem pól jest średnik.

Kod: Zaznacz cały

Sub makecsv
Dim iNumber As Integer, iC as Integer, i as Integer
Dim sSep As String
Dim aFile As String
Dim sArk as String, war1 as String, war2 as String, war3 as String, a1 as string
Dim oArk as Object
Dim dW as Double, dj as Double, di as Double 
sSep=";"
sArk=InputBox("Podaj nazwę arkusza, który będzie konwertowany")
oArk=ThisComponent.getSheets().getbyName(sArk)
msgBox "Podaj całkowite rozmiary arkusza"&chr(13)&"Rekordy powstaną na podstawie pierwszego wiersza"_
&chr(13)&"i pierwszej kolumny"
dW=InputBox("Ile wierszy")
iC=InputBox("ile kolumn")
di=(dW-1)*(iC-1)
a1=oArk.getCellbyPosition(0,0).string
aFile=InputBox("Podaj nazwę pliku i ścieżkę dostępu, np. Z:\Forum oo\nazwa.csv")
iNumber = Freefile
Open aFile For Output As #iNumber
For i=1 to iC-1
	For dj=1 to dW-1
	di=di-1
	oArk.getCellbyPosition(0,0).setValue(di)
	war3=oArk.getCellByPosition(i,dj).getString
		if war3>0 and len(war3) >0 then
			war1=oArk.getCellbyPosition(i,0).getString
			war2=oArk.getCellbyPosition(0,dj).getString
			Print #iNumber,war1,sSep,war2,sSep,war3
		End if
	next dj
next i
Close #iNumber
oArk.getCellbyPosition(0,0).setString(a1)
msgBox "Plik "&aFile &" utworzony"
End Sub
Konwertowana tabela musi zaczynać się w komórce A1 wybranego arkusza.
Na moim dość wolnym komputerze konwersja całego arkusza zajęła ok. 10 min.
Trochę zmodyfikowałem makro. Teraz, w trakcie konwersji, w komórce A1 pokazuje ile rekordów pozostało do końca pracy.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Tak, dałem pliki ods ponieważ na forum pliki csv odrzuca.
OpenOffice 4.1.5 na Windows 10
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Kod: Zaznacz cały

Sub makecsv
Dim iNumber As Integer, iC as Integer, i as Integer
Dim sSep As String
Dim aFile As String
Dim sArk as String, war1 as String, war2 as String, war3 as String, a1 as string
Dim oArk as Object
Dim dW as Double, dj as Double, di as Double 
sSep=";"
sArk=InputBox("C:\Rabaty.csv") /* to ma być plik który będzie tworzony ? */
oArk=ThisComponent.getSheets().getbyName(sArk)
msgBox "Podaj całkowite rozmiary arkusza"&chr(13)&"Rekordy powstaną na podstawie pierwszego wiersza"_
&chr(13)&"i pierwszej kolumny" /* Tutaj właściwie jak mam podać całkowite pole arkusza ? */
dW=InputBox("Ile wierszy") /* Tutaj powinienem podać liczbe wierszy z pliku w postaci pierwotnej czyli 2203 ? */
iC=InputBox("ile kolumn")  /* Tutaj powinienem podać liczbe kolumn z pliku w postaci pierwotnej czyli 456 ? */
di=(dW-1)*(iC-1)
a1=oArk.getCellbyPosition(0,0).string
aFile=InputBox("Podaj nazwę pliku i ścieżkę dostępu, np. Z:\Forum oo\nazwa.csv") /* To jest ścieżka do pliku który będzie tworzony ? */
iNumber = Freefile
Open aFile For Output As #iNumber
For i=1 to iC-1
   For dj=1 to dW-1
   di=di-1
   oArk.getCellbyPosition(0,0).setValue(di)
   war3=oArk.getCellByPosition(i,dj).getString
      if war3>0 and len(war3) >0 then
         war1=oArk.getCellbyPosition(i,0).getString
         war2=oArk.getCellbyPosition(0,dj).getString
         Print #iNumber,war1,sSep,war2,sSep,war3
      End if
   next dj
next i
Close #iNumber
oArk.getCellbyPosition(0,0).setString(a1)
msgBox "Plik "&aFile &" utworzony"
End Sub
Obok kodu wpisałem nurtujące mnie pytanie co do poszczególnych linijek, może ktoś objaśnić ?
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Po pierwsze powinieneś po prostu uruchomić makro i sam zobaczyłbyś co się dzieje.

Kod: Zaznacz cały

sArk=InputBox("Podaj nazwę arkusza, który będzie konwertowany")
To co jest w nawiasach tej instrukcji, to jest tekst wyświetlony na ekranie, kiedy instrukcja jest wykonywana. Instrukcja prosi o nazwę arkusza. W Calcu każdy arkusz ma swoją nazwę. Standardowo zazwyczaj są to nazwy "Arkusz1", Arkusz2" ale użytkownik może nadać także własne nazwy. Procedura musi wiedzieć, z którego arkusza ma utworzyć plik.

Kod: Zaznacz cały

msgBox "Podaj całkowite rozmiary arkusza"&chr(13)&"Rekordy powstaną na podstawie pierwszego wiersza"_
&chr(13)&"i pierwszej kolumny"
To jest tylko komunikat wyświetlany na ekranie informujący co nastąpi dalej.

Kod: Zaznacz cały

dW=InputBox("Ile wierszy") 
iC=InputBox("ile kolumn")
Należy podać całkowitą ilość wierszy i kolumn. Procedura zakłada, że pierwszy wiersz tabeli jest pierwszym wierszem, a pierwsza kolumn tabeli pierwszą (czyli A) kolumną arkusza

Kod: Zaznacz cały

aFile=InputBox("Podaj nazwę pliku i ścieżkę dostępu, np. Z:\Forum oo\nazwa.csv")
To jest instrukcja, w której należy podać ścieżkę i nazwę pliku. Przy jej wykonaniu w okienku pojawi się podpowiedź zapisana w nawiasach. Ma ona wyjaśnić jak należy wprowadzić te dane.

Procedura nie zmienia twojego pliku źródłowego. Możesz na próbę wygenerować plik csv podając np 4 wiersze i 3 kolumny i zobaczyć jak to wyszło.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Do momentu wpisania nazwy arkusza makro działa potem jednak na linijce

msgBox "Podaj calkowite rozmiary arkusza"& chr(13)&"Rekordy powstana na podstawie pierwszego wiersza"_
&chr(13)&"i pierwszej kolumny"

Pojawia się okienko błędu.
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Przeanalizowałem jeszcze raz kod. I proponuję zmienić instrukcję Print na następująca wersję:

Kod: Zaznacz cały

Print #iNumber, war1;sSep;war2;sSep;war3
(średniki zamiast przecinka między war1 a war3) dzięki temu w rekordach pliku nie będą wstawiane dodatkowe spacje.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Nie mogłeś zrzucić tego okienka i załączyć?
Podejrzewam jednak, że nie ma tam żadnego okienka błędu. To jest tylko komunikat, który należy zatwierdzić przyciskiem OK.
Właściwe liczby trzeba podać przy kolejnych okienkach.
Przed chwilą uruchamiałem makro, bo zaproponowałem zmianę w instrukcji Print.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Ma znaczenie że robie to w Excelu ? W OpenOffice w ogóle nie mogę makr uruchomić bo potrzebuje wyskakuje błąd że potrzebne JRE, ale po zainstalowaniu i tak dalej wyskakuje ten sam błąd. A to zrzut ekranu z excela w załączniku.
Załączniki
123.png
OpenOffice 4.1.5 na Windows 10
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Dasz rade przekonwertować to w OpenOfficie i załączyć jakoś tutaj bo już 2 dni z tym się użeram i nie moge tego zrobić.
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Chyba, że uruchomiłeś makro w wersji ze swoimi komentarzami. To wówczas będzie błąd, bo znaki /* i */ nie są w Basicu symbolami ograniczającymi komentarze. Te rolę pełnią instrukcja REM po której pisze się komentarz lub znak apostrofu, po którym tekst jest traktowany jak komentarz. Np:
REM to jest komentarz
Print #iNumber, war1;sSep;war2;sSep;war3 'To jest komentarz po instrukcji Print

No tak, do diesla nie nalejesz benzyny bo to nie zadziała ale makro z Calca ma wg ciebie bez problemów uruchomić się w Excelu?

Co do JRE Java musi być zgodna z wersją pakietu. Jeśli masz 64-bitowy pakiet to musisz zainstalować 64-bitowa Javę. Trzeba ją samodzielnie pobrać ze strony. Najczęściej domyślnie instalowana jest Java 32 bitowa. W systemie możesz mieć obie Javy.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Skomplikowana tabela przestawna

Post autor: Jermor »

Dam radę ale przyślij mi wiadomość na PW, bo wtedy będę miał twój adres mailowy i odeślę ci załącznik na ten adres. Na forum będzie za duży.
Rozumiem też, że wszystko do wiersza 2202? Bo w 2203 są jakieś dziwne liczby.
AOO 4.1.15, LO 7.5.9 (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 istnieje jego rozwiązanie.
damswi
Posty: 9
Rejestracja: pt sty 04, 2019 11:18 am

Re: Skomplikowana tabela przestawna

Post autor: damswi »

Dostałeś tamte moje wiadomości ?
OpenOffice 4.1.5 na Windows 10
ODPOWIEDZ