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.
Aus dieser Tabelle möchte ich eine Liste erstellen, in der die Einträge untereinander stehen, möglichst ohne Duplikate:
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