Seite 1 von 1

Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 15:09
von Jaycos
Hallo,

ich habe folgende für mich bislang unlösbare Aufgabenstellung.

Code: Alles auswählen

Hund   Hund   Hund
Katze  Hund   Maus
Hund   Maus   Igel
Aus dieser Tabelle möchte ich eine Liste erstellen, in der die Einträge untereinander stehen, möglichst ohne Duplikate:

Code: Alles auswählen

Hund
Katze
Maus
Igel
Allein dafür habe ich bisher schon keine Lösung gefunden.
Hinzu kommt, dass ich mehrere Tabellenblätter habe, in denen die Einträge stehen. Aus allen Tabellenblättern soll eine gemeinsame Liste erstellt werden.

Weiß jemand Rat?

Re: Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 16:26
von lorbass
Ist das eine einmalige oder eine wiederkehrende Aufgabe?

Wenn du das nur einmalig zu erledigen hast, kopiere einfach die Daten per [Strg]+[C] / [Strg]+[C] zusammen in eine Spalte. Anschließend kannst du die Duplikate rausfiltern:
  • zusammenkopierte Zellen markieren
  • Daten > Filter > Standardfilter… wählen
  • [Mehr Optionen] wählen
    • [x] Bereich enthält Spaltenbeschriftungen nur markieren, wenn dies zutrifft
    • [x] Keine Duplikate markieren
    • [x] Filterergebnis ausgeben nach markieren und Zieladresse eingaben
  • Wert »- nicht leer -« auswählen
Gruß
lorbass

Re: Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 19:14
von Jaycos
Hi,

danke, das würde gehen, aber
  • es sind schon einige Daten, das wäre viel Arbeit
    es ist eine wiederkehrende Aufgabe, jede Woche kommen Daten hinzu
Aber ich könnte mir ein Makro basteln, das die immer gleich aufgebauten Wochentabellen in Spaltenform bringt...

Re: Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 20:52
von F3K Total
Na,
dann kannst Du Dir doch auch gleich ein Makro basteln, was die doppelten Einträge garnicht erst in die Spalte schreibt.

Gruß R

Re: Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 21:51
von Karolus
Hallo
F3K Total hat geschrieben:Na,
dann kannst Du Dir doch auch gleich ein Makro basteln, was die doppelten Einträge garnicht erst in die Spalte schreibt.
Nein, das musst du nicht, das gibts schon:

Code: Alles auswählen

import uno
from itertools.chain import from_iterable as flat

context = XSCRIPTCONTEXT

def iterable( enumerable ):
    enum = enumerable.createEnumeration()
    while enum.hasMoreElements():
        yield enum.nextElement()
    

def  filter_allsheet_content_without_duplicates():
    sheets = context.getDocument().Sheets
    data = set()
    for sheet in iterable(sheets):
        ranges = sheet.queryContentCells( 23 )
        for rrange in iterable( ranges ):
            data.update( flat(  rrange.getFormulaArray()  ))
    data = sorted( list( data) )
    data = [ (elem,) for elem in data ]
    makeDataArray( sheets.getByIndex(0), tuple( data ) )


def makeDataArray( sheet , olist ):
    rowsize, colsize = len( olist ) -1, len( olist[0] ) -1 
    oRange = sheet.getCellRangeByPosition(0, 0, colsize , rowsize)
    oRange.setFormulaArray( olist )
Entpacke das angehängte Archiv im Ordner "Scripts" deines Benutzerverzeichnisses, und rufe über →Extras→Makros→Makros verwalten→Python→Meine Makros→setsheetcontent→filter_allsheet_content_without_duplicates auf.
Die Ausgabe erfolgt in Spalte A des erstenTabellenblatts.

Gruß Karo
Edit: Update, insbesondere redunante Zeilen aus makeDataArray entfernt.

Re: Liste aus mehreren Tabellenblättern erstellen

Verfasst: Fr, 10.06.2011 23:34
von bst
Abend auch,

sieht so aus als sollte ich mal Python lernen...

FWIW, hier ein Versuch in Basic.

cu, Bernd
--

Code: Alles auswählen

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

Sub Main
	col = new Collection
	for each oSheet in thisComponent.sheets
		oRange = GetUsedRange(oSheet)
    	FillCollectionWithArray(col, oRange.getDataArray)
	next
	
	oSheet = thisComponent.sheets(0)
	oRange = oSheet.getCellRangeByPosition(0,0,0,col.count)
	aData = oRange.getDataArray
	i = 0
	for each varKey in col
		aData(i)(0) = varKey
		i = i + 1
	next
	oRange.setDataArray(aData)
End Sub

Function GetUsedRange(oSheet as Object) As Object
	oCursor = oSheet.createCursor
	oCursor.GotoStartOfUsedArea(false)
 	oCursor.GotoEndOfUsedArea(true)
 	oRA = oCursor.RangeAddress
	GetUsedRange = oSheet.getCellRangeByPosition(oRA.StartColumn,oRA.StartRow,oRA.EndColumn,oRA.EndRow)
End Function

Sub FillCollectionWithArray(col As Collection, aData As Variant)
	for i = 0 to ubound(aData)
		for j = 0 to ubound(aData(i))
			sData = aData(i)(j)
			if len(sData) > 0 Then
				if not colExists(col, sData) Then 
					col.Add sData, sData
				endif
			endif
		next
	next
	ArrayToCollection = col
End Sub

Function colExists(col as collection, sData As string) as Boolean
   On Local Error Resume Next
   colExists = len(col(sData)) > 0
End Function