Przesunięcie danych

Użytkowanie arkusza kalkulacyjnego
skuter6
Posty: 10
Rejestracja: pn lip 28, 2014 10:32 am

Przesunięcie danych

Post autor: skuter6 »

Witam,
poszukuję sposobu na automatyczne przesunięcie danych z transponowaniem, problem polega na tym że danych jest dużo więc szukam jakiegoś automatu. Próbowałem robić to przez makra, lecz są to moje pierwsze próby. Mam tyle po rejestracji makra i moich zmianach:

Kod: Zaznacz cały


sub Kopiowanieztras3
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 2

dispatcher.executeDispatch(document, ".uno:GoDownSel", "", 0, args1())

rem ----------------------------------------------------------------------

dispatcher.executeDispatch(document, ".uno:Cut", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "By"
args4(0).Value = 3
args4(1).Name = "Sel"
args4(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args4())

rem ----------------------------------------------------------------------
dim args7(5) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Flags"
args7(0).Value = "SVD"
args7(1).Name = "FormulaCommand"
args7(1).Value = 0
args7(2).Name = "SkipEmptyCells"
args7(2).Value = false
args7(3).Name = "Transpose"
args7(3).Value = true
args7(4).Name = "AsLink"
args7(4).Value = false
args7(5).Name = "MoveMode"
args7(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args7())

rem ----------------------------------------------------------------------
dim args8(1) as new com.sun.star.beans.PropertyValue
args8(0).Name = "By"
args8(0).Value = 1
args8(1).Name = "Sel"
args8(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args8())

end sub
Nie mogę znaleźć nigdzie informacji jak sprawdzić czy komórka zawiera dane lub jak policzyć komórki w dół zawierające dane do tej która ich nie zawiera.
Poszukuję ogólnie rozwiązania problemu przesunięcia danych, więc jeżeli ktoś zna sposób bez makr też będę wdzięczny. W załączniku podaje przykładowy plik w który pokazuje jak mam dane, a jak mają być.
Załączniki
przykład.ods
Przykładowe dane
(11.01 KiB) Pobrany 116 razy
LibreOffice 6.2.5.2, system windows 10 x64
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przesunięcie danych

Post autor: Jermor »

Opisz precyzyjnie problem.
Na razie zrozumiałem go tak: w kolumnie znajdują się zestawy danych. Każdy zestaw może składać się z różnej ilości elementów. Nowy zestaw danych zaczyna się po jednej pustej komórce. Każdy zestaw danych należy przekształcić tak aby kolejne elementy zestawu, zapisane w kolumnie, stały się kolejnymi elementami danych zapisanymi w wierszu. Każdy nowy wiersz elementów musi znajdować się o dwa wiersze poniżej poprzedniego.
Napisz też czy jest to akcja jednorazowa, bo musisz jednorazowo przekształcić dane, czy powtarzalna, tzn. ta metoda będzie stale używana do różnych danych.
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.
skuter6
Posty: 10
Rejestracja: pn lip 28, 2014 10:32 am

Re: Przesunięcie danych

Post autor: skuter6 »

W kolumnie pierszej mam zestawy po 2 lub po 3 wiersze danych (tak około 20000 wierszy to zajmuje), każdy zestaw danych chcę przenieść w wolny wiersz pod tym zestawem, ale zmieniając zestaw kolumnowy w wierszowy. Te puste miejsca też będę usuwał, ale to już proste, bo mogę skorzystać z filtrów ;).
Do tego co mam, brakuje mi If-a który by określał, czy w zestawie jest 2 czy 3 wiersze danych z adresowaniem względnym. Szukam już 2 dzień i nie mogę znaleźć dla tego rozwiązania.
LibreOffice 6.2.5.2, system windows 10 x64
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przesunięcie danych

Post autor: Jermor »

Jeśli jest tak jak opisałeś, tzn że między zestawami danych jest jeden pusty wiersz i to w nim chcesz umieścić wyniki, a rozwiązanie jest potrzebne jeden raz, to można to zrobić następująco:
  • Policzyć ile w ogóle jest tych zestawów danych. To jest proste wystarczy utworzyć formułę

    Kod: Zaznacz cały

    =LICZBA.WIERSZY(twój zakres)-ILE.NIEPUSTYCH(twój zakres)+1
  • Zarejestrować makro wg mojego algorytmu (wszystko realizując przy pomocy klawiatury):
    1. Ustawić pierwszą komórkę z danymi w kolumnie
    2. Wywołać rejestrowanie makr
    3. Nacisnąć CTRL+SHIFT+strzałka w dół
    4. Nacisnąć CTRL+C
    5. Nacisnąć strzałka w prawo
    6. Nacisnąć strzałka w lewo
    7. Nacisnąć CTRL+strzałka w dół
    8. Nacisnąć strzałka w dół
    9. nacisnąć CTRL+SHIFT+V i wybrać "Transponuj"
    10. Nacisnąć strzałka w dół
    Wyjaśnienia: 3. zaznacza obszar w dół do najbliższej pustej komórki, 5 i 6 są potrzebne tylko po to aby "zdjąć" zaznaczenie, 7 powoduje przejście do ostatniej zapełnionej w dół (nie działa dobrze, gdy zakres jest zaznaczony, dlatego potrzebny był 5 i 6), 8 przejście do pustej komórki, 9 wstawienie transpozycji, 10 ustawienie się na początku następnego zestawu danych.
  • zapisać zarejestrowane makro pod własna nazwą.
  • Dopisać swoje własne krótkie makro o następującej postaci:

    Kod: Zaznacz cały

    Sub mojanazwa
    For i=1 to liczba_zestawów 
    nazwa_zarejestrowanego_makra
    Next i
    End Sub
    w drugim wierszu makra po słowie "to" wpisać liczbę zestawów danych wynikającą z formuły.
  • wywołać do wykonania makro mojanazwa
Wszystkie testy zrób na kopii!!!
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.
skuter6
Posty: 10
Rejestracja: pn lip 28, 2014 10:32 am

Re: Przesunięcie danych

Post autor: skuter6 »

I tu był właśnie mój błąd, że przesuwałem strzałkami bez CTRL. Dzięki wielkie, działa to choć nie idealnie, kilka nie zrobiło się jak należy, ale to zawsze mniej do poprawiania.
LibreOffice 6.2.5.2, system windows 10 x64
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przesunięcie danych

Post autor: Jermor »

Jeśli nie działa "idealnie" to znaczy, że nie są spełnione warunki brzegowe, np. między niektórymi zestawami jest więcej niż jeden wiersz odstępu albo jakiś zestaw danych zawiera tylko jeden element, albo między zestawami danych nie wystąpił wiersz odstępu. Makro powinno działać prawidłowo dla zestawów zawierających minimum 2 elementy, maksimum 1024 (arkusz może mieć tylko tyle kolumn).
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.
ODPOWIEDZ