Tabelle von Dubletten in Spalten befreien

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Gert Seler
*******
Beiträge: 1763
Registriert: Di, 03.10.2006 18:05

Re: Tabelle von Dupletten in Spalten befreien

Beitrag von Gert Seler »

Hallo Nina,
könntest Du uns mal den " Sinn und Zweck " dieser Aufgabe näherbringen ?
Bei 120 Spalten können also auch 120_Buchstaben eingegeben werden, das wäre 4,6 mal das "ABC" á 26_Buchstaben ?

mfg
Gert
Es gibt nichts gutes, außer man tut es.
Win7_64 / LO_4.4.5.2
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Tabelle von Dupletten in Spalten befreien

Beitrag von juetho »

Nina L. hat geschrieben:leider finde ich im Forum keine Hilfsthema:
Richtig, man muss die Suche selbst wandeln (und den wichtigsten Begriff richtig schreiben, sonst kann die Suche nicht funktionieren). Die erste Suche nach "Doubletten Spalten" liefert keinen Treffer, die zweite Suche nach "Doubletten" liefert einen Treffer und dabei den passenden Suchbegriff. Mit der Suche nach "doppelte Werte" bekommst du eine Reihe von Anregungen. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: Tabelle von Dupletten in Spalten befreien

Beitrag von lorbass »

Nina L. hat geschrieben:mit einer charmanten Formel und in einem Arbeitsschritt?
Charme-Offensive? :lol:
Nina L. hat geschrieben:Wie kann ich eine Tabelle mit 70 zeilen und 120 Spalten von Dubletten innerhalb der einzelnen Zeilen Befreien?
Wie passt dein Beispiel zu diesen Anforderungen? Wenn ich das richtig sehe, eliminierst du dort die Dubletten in den Spalten,nicht den Zeilen. Allerdings, so recht passt's dann auch nicht. Erläutere doch bitte mal step by step in einem Beispieldokument, was da im Einzelnen passieren soll. Z.B.: Rutschen Zellen von rechts nach, wenn eine Dublette aus in einer Spalte verschwindet? Wie genau soll das Ersetzen funktionieren?

Als angemeldete Benutzerin könntest du das Beispieldokument beim Schreiben einer Antwort unmittelbar hier im Forum hochladen. Gäste, die sich nicht registrieren möchten, müssen einen Filehoster bemühen und die dort generierten Links in ihren Beitrag kopieren. Vgl. Allgemeine Hinweise zur Forumsbenutzung.
Gert Seler hat geschrieben:120 Spalten […] 120_Buchstaben
Gert, das ist ein Beispiel und die Buchstaben sind Platzhalter :mrgreen:
juetho hat geschrieben:man muss […] den wichtigsten Begriff richtig schreiben
In diesem Fall präziser: Man muss die Suche für jede richtige Schreibweise durchführen, hier also für »Dubletten« und für »Doubletten«, die vom Duden beide abgesegnet sind. Und selbst dann erwischt man die Beiträge mit tatsächlichen Orthographiefehlern nicht…

Gruß
lorbass
ninalettmann
Beiträge: 2
Registriert: Mo, 22.04.2013 21:29

Re: Tabelle von Dupletten in Spalten befreien

Beitrag von ninalettmann »

Hi liebe Leute,
bevor wir das Thema Orthografie vertiefen, lenke ich das Thema zur Sicherheit mal wieder auf Tabellenkalkulation ;-)
Anbei findet Ihr
Beispiel Dubletten nach Zeilen.ods
2 Tabellen mit Dubletten
(12 KiB) 206-mal heruntergeladen
zwei Tabellen, deren 4-stellige Nummern je nach "Gruppe" von den Dubletten befreit werden müssten …
F3K Total
********
Beiträge: 3707
Registriert: Mo, 28.02.2011 17:49

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von F3K Total »

Hi,
das geht z.B. per Makro:

Code: Alles auswählen

Sub S_Eraese_doubles
    osel = thiscomponent.currentselection
    if osel.supportsservice("com.sun.star.sheet.SheetCellRange") then
        oRange = osel
        aformula = orange.getformulaarray 'Daten auslesen
        nrows = Ubound (aformula)
        ncolumns = Ubound(aformula(0))
        dim vFormula(ncolumns,nrows)
        for k = 0 to nrows 'Daten in 2D-Array übertragen
          arow = aformula(k)
          for i= 0 to ncolumns
              vformula (i,k) = arow(i)
          next i
        next k
        for i = 0 to ncolumns 'Doubletten löschen
           for j = nrows to 1 step -1
              for k = j-1 to 0 step -1
              if vformula(i,j) = vformula(i,k) then 
                  vformula(i,j) = ""
                  exit for
              endif
              next k
          next j
        next i
        for k = 0 to ncolumns 'Leere Felder löschen
            for i = 0 to nrows
               if vformula(k,i) = "" then
               for j = nrows to i+1 step -1
                  vformula(k,j-1) = vformula(k,j)
                  vformula(k,j) = ""
               next j
               endif
            next i
        next k
        for k = 0 to nrows 'Daten in 1D-Array(1D-Array) zurückschreiben
          arow = aformula(k)
          for i= 0 to ncolumns
              arow(i) = vformula (i,k)
          next i
        next k
        oRange.setformulaarray(aformula) 'Daten in Tabelle zurückschreiben
        msgbox "fertig"
    else
        msgbox "Bitte einen zusammenhängenden Zellbereich selektieren"
    endif
End Sub
siehe Beispiel

Gruß R
Dateianhänge
Beispiel Dubletten nach Zeilen.ods
(17.03 KiB) 185-mal heruntergeladen
Karolus
********
Beiträge: 7483
Registriert: Mo, 02.01.2006 19:48

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von Karolus »

Hallo
@Rik
Wieso produziert dein Makro unterschiedliche Ergebnisse mit deinen Beispielsdaten wie:

Code: Alles auswählen

def columns_set(*dummy):
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.getCurrentSelection()
    data = sel.getDataArray()
    out = []
    for columns in zip(*data):
        c = []
        for cell in columns:
            if cell not in c:
                c.append(cell)
        c.extend(['']* (len(columns)-len(c)))
        out.append(tuple(c))
    sel.setDataArray(tuple(zip(*out))) 
??
Edit: Gelöst _ Dein Code löscht alle mehrfach vorkommenden Einträge - Nina möchte aber einen davon behalten.
Bei "überschaubaren" Daten gibts das gleiche Ergebnis!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
F3K Total
********
Beiträge: 3707
Registriert: Mo, 28.02.2011 17:49

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von F3K Total »

Hallo Karolus,
Karolus hat geschrieben:Wieso produziert dein Makro unterschiedliche Ergebnisse mit deinen Beispielsdaten wie:
Vermutlich, weil der Code einen Fehler hat;-), danke für den Tipp.
Schaue ich mir später nochmal an.

Gruß Rik
F3K Total
********
Beiträge: 3707
Registriert: Mo, 28.02.2011 17:49

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von F3K Total »

Nina L. hat geschrieben:Gibt es nicht eine möglichkeit ...
... klar gibt es diese Möglichkeit, wenn Du es programmierst.
Ich habe jetzt den Fehler in meinem Makro beseitigt, hier der neue Code und eine Beispieldatei.

Code: Alles auswählen

Sub S_Eraese_doubles
    osel = thiscomponent.currentselection
    if osel.supportsservice("com.sun.star.sheet.SheetCellRange") then
        oRange = osel
        aformula = orange.getformulaarray 'Daten auslesen
        nrows = Ubound (aformula)
        ncolumns = Ubound(aformula(0))
        dim vFormula(ncolumns,nrows)
        for k = 0 to nrows 'Daten in 2D-Array übertragen
          arow = aformula(k)
          for i= 0 to ncolumns
              vformula (i,k) = arow(i)
          next i
        next k
        for i = 0 to ncolumns 'Doubletten löschen
           for j = nrows to 1 step -1
              for k = j-1 to 0 step -1
              if vformula(i,j) = vformula(i,k) then 
                  vformula(i,j) = ""
                  exit for
              endif
              next k
          next j
        next i
        for k = 0 to ncolumns 'Leere Felder löschen
            EmptyCounter = 0
            bfound = false
            for i = 1 to nrows
                if vformula(k,i) = "" then
                    EmptyCounter = i
                    bfound = true
                    exit for
                endif
            next i
            for j = EmptyCounter+1 to nrows
                if bfound and vformula(k,j) <> "" then
                    vformula(k,EmptyCounter) = vformula(k,j)
                    vformula(k,j) = ""
                    EmptyCounter = EmptyCounter +1
                endif
            next j
        next k
        for k = 0 to nrows 'Daten in 1D-Array(1D-Array) zurückschreiben
          arow = aformula(k)
          for i= 0 to ncolumns
              arow(i) = vformula (i,k)
          next i
        next k
        oRange.setformulaarray(aformula) 'Daten in Tabelle zurückschreiben
        msgbox "fertig"
    else
        msgbox "Bitte einen zusammenhängenden Zellbereich selektieren"
    endif
End Sub
Nina L. hat geschrieben:Aber was fange ich mit dem Codefragment an? Oder dient das nur der internen Kommunikation zwischen Euch?
Nein, das ist ein Macro, in Python geschrieben, verrichtet den gleichen Job, vermutlich schneller.
Kannst Du auch verwenden. Es ist allerdings keine Python GUI vorhanden, d.h. der Code muß händisch an die richtige Stelle gebracht werden.
Kann man das etwa so sagen Karolus?
Gruß R
Dateianhänge
Beispiel Dubletten nach Zeilen.ods
(18.11 KiB) 205-mal heruntergeladen
ninalettmann
Beiträge: 2
Registriert: Mo, 22.04.2013 21:29

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von ninalettmann »

Hey, super,
herzlichen Dank. Morgen ist endlich Ruhe hier, dann werde ich mir das mal ganz in Ruhe ansehen.
LG, NL
Karolus
********
Beiträge: 7483
Registriert: Mo, 02.01.2006 19:48

Re: Tabelle von Dubletten in Spalten befreien

Beitrag von Karolus »

Hallo
Nein, das ist ein Macro, in Python geschrieben, verrichtet den gleichen Job, vermutlich schneller.
Kannst Du auch verwenden. Es ist allerdings keine Python GUI vorhanden, d.h. der Code muß händisch an die richtige Stelle gebracht werden.
Das stimmt soweit, aber ich hab jetzt noch eine "installier_mich_selbst_an_die_richtige_Stelle"-funktion dazu gepackt:

Code: Alles auswählen

import uno
from os import path

try:
    context = XSCRIPTCONTEXT
except:
    pass
ctx = uno.getComponentContext()
servicemanager = ctx.ServiceManager
createUnoService = servicemanager.createInstance
file_access = createUnoService("com.sun.star.ucb.SimpleFileAccess")
pathsubstution = createUnoService("com.sun.star.util.PathSubstitution")

def install_me(*_):
    """
    Funktion zum kopieren dieses eingebetteten Pythonscripts
    ins den .userconfig_python_pfad"""

    pythonfolder = pathsubstution.substituteVariables('$(user)/Scripts/python/',0)
    filename = path.basename(__file__)
    if not file_access.isFolder( pythonfolder):
        file_access.createFolder(pythonfolder)
    file_access.copy(__file__, path.join( pythonfolder, filename))



def columns_set(*_):
    """
    Fuer Nina_L
    openoffice_info
    Thema 61690
    """
    doc = context.getDocument()
    sel = doc.getCurrentSelection()
    data = sel.getDataArray()
    out = []
    for columns in zip(*data):
        c = []
        for cell in columns:
            if cell not in c:
                c.append(cell)
        c.extend(['']* (len(columns)-len(c)))
        out.append(tuple(c))
    sel.setDataArray(tuple(zip(*out)))
 
office_info_61690.ods
Datei zum testen mit eingebettetem Pythonscript
Das Script enthält zusätzlich eine Funktion zur installation in die Benutzerkonfiguration.
(10.41 KiB) 157-mal heruntergeladen
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten