Makro, wytnij i wklej dane do pustej komórki, wiersza

Użytkowanie arkusza kalkulacyjnego
woxalu
Posty: 1
Rejestracja: śr lis 12, 2025 6:39 pm

Makro, wytnij i wklej dane do pustej komórki, wiersza

Post autor: woxalu »

Potrzebuje pomocy przy makro które wytnie i wklei dane do pustej komórki, wiersza niżej jeżeli jest juz zajęty. Dane wyglądają mniej wiecej tak:

Kod: Zaznacz cały

Birthdate:
09/23/91
Birthplace:
Los Angeles California USA
Height:
6' 1"
Weight:
180 lbs
Zip Code:
90210
Dane wejściowe są zawsze w tej samej kolumnie i komórkach G2:G11
G2 Birthdate:
G3 09/23/91
G4 Birthplace:
G5 Los Angeles California USA
G6 Height:
G7 6' 1"
G8 Weight:
G9 180 lbs
G10 Zip Code:
G11 90210

Teraz potrzebuję wyciąć G3 i wkleic do B2, G5 do C2, G7 do D2 itd... lub do wiersza niżej np: 3, 4, itd jeżeli dany wiersz jest już zajęty, a nastepnie po poprawnej operacji usunie wszytko w G1:G10
Nagrałem proste makro które działa, ale wkleja na sztywno do wpisanych komórek i chce nadpisywać dane.

Kod: Zaznacz cały

REM  *****  BASIC  *****

Sub Main

End Sub


sub Replace
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 = "ToPoint"
args1(0).Value = "$G$3"

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

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

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$B$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$G$5"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

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

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "$C$2"

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

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$G$7"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())

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

rem ----------------------------------------------------------------------
dim args11(0) as new com.sun.star.beans.PropertyValue
args11(0).Name = "ToPoint"
args11(0).Value = "$D$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args11())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args13(0) as new com.sun.star.beans.PropertyValue
args13(0).Name = "ToPoint"
args13(0).Value = "$G$9"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args13())

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

rem ----------------------------------------------------------------------
dim args15(0) as new com.sun.star.beans.PropertyValue
args15(0).Name = "ToPoint"
args15(0).Value = "$E$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args15())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args17(0) as new com.sun.star.beans.PropertyValue
args17(0).Name = "ToPoint"
args17(0).Value = "$G$10"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args17())

rem ----------------------------------------------------------------------
dim args18(0) as new com.sun.star.beans.PropertyValue
args18(0).Name = "ToPoint"
args18(0).Value = "$G$11"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args18())

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

rem ----------------------------------------------------------------------
dim args20(0) as new com.sun.star.beans.PropertyValue
args20(0).Name = "ToPoint"
args20(0).Value = "$F$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args20())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args22(0) as new com.sun.star.beans.PropertyValue
args22(0).Name = "ToPoint"
args22(0).Value = "$G$1:$G$10"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args22())

rem ----------------------------------------------------------------------
dim args23(0) as new com.sun.star.beans.PropertyValue
args23(0).Name = "Flags"
args23(0).Value = "U"

dispatcher.executeDispatch(document, ".uno:DeleteCell", "", 0, args23())


end sub
OpenOffice 4.1.15 na Windows 7 64bit
Jan_J
Posty: 4637
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro, wytnij i wklej dane do pustej komórki, wiersza

Post autor: Jan_J »

Bardzo zgrubny szkic:

1. Ustal numer wiersza docelowego.
Jeśli masz porządek w danych, to będzie wartość o 1 większa, niż numer ostatniego wypełnionego wiersza.
Czyli numer pierwszego wiersza, w którym komórka B będzie pusta.
Jest tak dlatego, że w Basicu wiersze Calca są numerowane od 0. Kolumny też.

Jeśli nie chce ci się pisać tej części w makrze, wpisz w nieużywanej komórce fomułę =COUNTA(B:B).
Powinna dać tę samą wartość. Nazwijmy ją n.

2. Załóż pętlę, która przebiegnie komórki od G2 do G11, wstawiając odczytane wartości do kolejnych komórek wiersza n, przy okazji opróżniając komórki z G

Coś w rodzaju — piszę na żywca: z pamięci, bez sprawdzania i bez opakowania w funkcję.

Kod: Zaznacz cały

sheet = thisComponent.currentController.getActiveSheet()
target_row = n
target_column = 1
source_row = 1
source_column = 6
nfields = 10
for i = 0 to nfields-1
    v = sheet.getCellByPosition(source_column, source_row+i).getString()
    sheet.getCellByPosition(target_column+i, target_row).setString(v)
    sheet.getCellByPosition(source_column, source_row+i).setString("")
next i
Co może wymagać uwagi, to wymuszenie typu przenoszonych danych (teksty / wartości liczbowe) oraz ich formatów (daty). Metody getString i setString pobierają i wstawiają wartości tekstowe.

Niezastąpionym źródłem umiejętności programowego operowania Basicem w Calcu są materiały Andrew Pitonyaka:
AndrewMacro oraz OpenOffice Macros Explained — patrz https://pitonyak.org/book/.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ