Makros für csv Listen- automatische Spaltenänderung

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

JDaria
Beiträge: 5
Registriert: Do, 04.02.2016 12:39

Makros für csv Listen- automatische Spaltenänderung

Beitrag von JDaria »

Hallo zusammen,

Ich bin ein absoluter Neuling auf dem Gebiet der Makros, möchte es aber möglichst schnell und effizient lernen. Ich hoffe, Ihr könnt mir dazu eine Hilfestellung bieten.

Momentan stehe ich vor folgendem Problem:

Ich bin nebenberuflich selbstständig und bekomme von meinen Lieferanten regelmäßig Produktlisten(.csv) mit 15-21 Spalten zugesandt. Das Besondere daran ist, dass eine Spalte existiert, die sich "Produktkategorie" nennt. Entnommen wird diese Kategorisierung von den entsprechenden Internetseiten. Leider passen diese vorgegeben Kategorien teilweise überhaupt nicht zu meiner Internetseite.
Bislang habe ich alles manuell geändert und teilweise gelöscht und somit meine Wissenslücke bzgl. der Programmierung von Makros umgehen können, allerdings werden die Updateintervalle der Listen immer kürzer und zeitgleich immer umfangreicher. Aus diesem Grund wollte ich mich informieren, ob es technisch umsetzbar ist ein entsprechendes Makro zu basteln?

Das Makro müsste in meinem Falle zwei Probleme gleichzeitig lösen können:
1. Die automatisierte Änderung von Produktkategorien.

Beispiel : Lieferant A liefert eine CSV-Datei. Eine Kategorie benennt er u.a. "woman>shoes>sneakers". Ich hingegen möchte es in "Frauen>Schuhe>Sneakers" umbenennen, da ich nur deutsche Kategorien auf meiner Internetseite angelegt habe.

2. Die Löschung von ganzen Zeilen wenn eine bestimmte Kategorie hinterlegt ist.

Beispiel: Lieferant A liefert eine CSV-liste. Neben den Produkten, die auch auf meiner Internetseite vertrieben werden sollen (z. B. Schuhe) beinhaltet die Liste Kategorien und Artikel, die ich nicht anbieten möcht(z. B. Klamotten) .
Wie schaffe ich es, dass die Artikel automatisch aus der Liste gelöscht werden?


Ich bedanke mich vorab für eure Hilfe. :D

Liebe Grüße

Jenny
JDaria
Beiträge: 5
Registriert: Do, 04.02.2016 12:39

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von JDaria »

Hallo zusammen,

ich konnte mein Problem bereits teilweise lösen und weiß mittlerweile, wie ich mit einer Makro Kategorien umbenennen kann.
Nun bleibt für mich immer noch die Frage, wie ich ganze Zeilen löschen kann, wenn eine Zelle eine definierte Bedingung erfüllt.

Beispiel:
In Spalte AA befindet sich meine neue Kategorie:
In AA1 und AA10 ist der Zellwert "bitte löschen" hinterlegt.
Das Ziel soll sein, dass beim Ausführen der Makro jede Zeile gelöscht wird, die den Wert "Bitte löschen" ausweist.
Leider bin ich mit der Programmierung der Makro etwas überfordert.
Kann mir einer weiterhelfen?

Ich bedanke mich im Voraus.

Liebe Grüße
Jenny
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von F3K Total »

Hi,
weil heute so schönes Wetter war:

Code: Alles auswählen

sub Delete_Rows
    oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
    oCursor = oSheet.CreateCursor
    oCursor.gotoEndOfUsedArea(false)
    nEndrow = oCursor.Rangeaddress.EndRow
    for i = nEndrow to 0 step - 1 
        oCell = oSheet.getcellbyPosition(26,i)'26 entspricht Spalte AA
        if oCell.string = "Bitte löschen" then
            osheet.rows.removeByIndex(i,1)
        endif
    next i
end sub
Gruß R
JDaria
Beiträge: 5
Registriert: Do, 04.02.2016 12:39

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von JDaria »

Hallo R,

danke für deine schnelle Antwort.

Code: Alles auswählen

sub Delete_Rows
    oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
    oCursor = oSheet.CreateCursor
    oCursor.gotoEndOfUsedArea(false)
    nEndrow = oCursor.Rangeaddress.EndRow
    for i = nEndrow to 0 step - 1 
        oCell = oSheet.getcellbyPosition(26,i)'26 entspricht Spalte AA
        if oCell.string = "Bitte löschen" then
            osheet.rows.removeByIndex(i,1)
        endif
    next i
end sub
Ich habe hierzu nochmal eine Frage:
Würde ich jetzt die Makro auf Spalte B anwenden wollen, weil meine Kategorien in Spalte B hinterlegt sind, müsste ich logischerweise folgende Zeile ändern oder?:

oCell = oSheet.getcellbyPosition(2,i)'2 entspricht Spalte B

Danke im Voraus.
Zuletzt geändert von JDaria am So, 07.02.2016 12:22, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von F3K Total »

Nicht ganz,
0 ist Spalte A, 1 ist B, 2 ist C usw.
Gruß R
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von F3K Total »

Probier es aus!
R
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von Karolus »

Hallo

Wenn die Formeln tatsächlich den Text`Bitte löschen` zurückgeben, dann funktioniert das auch...

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von komma4 »

F3K Total hat geschrieben:0 ist Spalte A, 1 ist B, 2 ist C usw.
... wenn man nicht immer "rechnen" will, welcher Index nun einer Spalte zugeordnet ist, dann nimmt man eine Funktion, die einem das Gesuchte liefert:

Code: Alles auswählen

FUNCTION ColumnIndexFromName( sName as String ) 
' gibt den Index der Spalte zurück

zelle = ThisComponent.Sheets.getByIndex(0).getCellRangeByName( sName & "1" )
ColumnIndexFromName = zelle.CellAddress.Column

END FUNCTION
Im Code kann dann einfach(er) der Spaltenname verwendet werden:

Code: Alles auswählen

oCell = oSheet.getcellbyPosition( ColumnIndexFromName("AA"),i )
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
JDaria
Beiträge: 5
Registriert: Do, 04.02.2016 12:39

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von JDaria »

Hallo R,

ich habe die Makro noch etwas erweitert:

Code: Alles auswählen

sub Delete_Rows
    oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
    oCursor = oSheet.CreateCursor
    oCursor.gotoEndOfUsedArea(false)
    nEndrow = oCursor.Rangeaddress.EndRow
    for i = nEndrow to 0 step - 1 
        oCell = oSheet.getcellbyPosition(26,i)
        if oCell.string = "DELETE" then
            osheet.rows.removeByIndex(i,1)
        endif
    next i
    
     oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
    oCursor = oSheet.CreateCursor
    oCursor.gotoEndOfUsedArea(false)
    nEndrow = oCursor.Rangeaddress.EndRow
    for i = nEndrow to 0 step - 1 
        oCell = oSheet.getcellbyPosition(26,i)
        if oCell.string = "#NV" then
            osheet.rows.removeByIndex(i,1)
        endif
    next i
end sub
Interpretiere ich es richtig, dass die Makro die Tabelle insgesamt zweimal durchgeht( zunächst um alle Zeilen zu löschen, die das Wort "DELETE" in der AA-Spalte, um anschließend selbiges für "'#NV" zu tun)? Ich hatte bereits versucht, beide WENN-Bedingungen untereinander zu schreiben, allerdings hat die Makro dann nicht mehr funktioniert:
sub Delete_Rows
oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
oCursor = oSheet.CreateCursor
oCursor.gotoEndOfUsedArea(false)
nEndrow = oCursor.Rangeaddress.EndRow
for i = nEndrow to 0 step - 1
oCell = oSheet.getcellbyPosition(26,i)
if oCell.string = "DELETE"
if oCell.string = "#NV" then

osheet.rows.removeByIndex(i,1)
endif
next i
end sub
Ich vermute mal, dass an meiner Herangehensweise etwas falsch ist.

Bezüglich deiner Aussage, ich solle es einfach ausprobieren, hatte ich einen kleinen Fehler drinnen, weshalb die Makro nicht ausführbar gewesen ist. Nun funktioniert alles, wie es soll.

@komma4: Danke für die Erläuterung, ich habe mir das gleich mal abgespeichert und werde damit mal rumspielen :D.
Zuletzt geändert von JDaria am So, 07.02.2016 12:23, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von F3K Total »

Daria hat geschrieben:Ah ok super, jetzt begreife ich auch langsam, wie die Programmierung der Makros funktioniert :D
Ich möchte deinen Eifer auf keinen Fall bremsen, sagen wir mal so, es gibt noch Potenzial nach oben,
Hier gibt es gute Literaturhinweise zur Programmierung in Starbasic.
StarBasic FAQ von Dannenhöfer ist ein guter Einstieg.

Es wäre schön, wenn du deinen letzten Beitrag noch einmal editieren würdest und die Programmcodes in Code Tags setzen würdest. Dazu brauchst du den relevanten Text während des Editierens nur zu markieren und dann oben die Taste code anklicken.
Dann sieht es so aus:

Code: Alles auswählen

5+4 = 9
Nun zu deinem Versuch, so geht es kürzer:

Code: Alles auswählen

sub Delete_Rows
    oSheet = ThisComponent.Sheets.getbyName("Tabelle1")
    oCursor = oSheet.CreateCursor
    oCursor.gotoEndOfUsedArea(false)
    nEndrow = oCursor.Rangeaddress.EndRow
    for i = nEndrow to 0 step - 1
        oCell = oSheet.getcellbyPosition(26,i)'26 entspricht Spalte AA
        if (oCell.string = "DELETE" ) OR (oCell.string = "#NV") then
            osheet.rows.removeByIndex(i,1)
        endif
    next i
end sub
Gruß R
JDaria
Beiträge: 5
Registriert: Do, 04.02.2016 12:39

Re: Makros für csv Listen- automatische Spaltenänderung

Beitrag von JDaria »

Hallo R,

ich werde mal reinschauen. Vielen DanK!
Antworten