Hallo Micha,
ich habe mal ein kleines Makro (s.u.) geschrieben, welches das von Dir
skizzierte Problem löst.
Da hier in den Liste-Mails die Makro-Layouts immer "versaubeutelt"
werden an "Cc: michakuehn@habmalnefrage.de" die Dateianhänge:
+ "Name_Gruppe.txt" (Makro)
+ "Name_Gruppe.ods" (CALC-Beispieltabellen)
[1] Das 'Tabellenblatt 1' kann beliebig viele 'Gruppe'-Spalten
beinhalten, wobei Du die Gruppen-Namen frei wählen kannst, muss also
nicht "Gruppe 1", "Gruppe 2" ... sein.
[2] Das 'Tabellenblatt 1' kann beliebig viele Zeilen enthalten.
[3] Die Tabellenblätter kannst Du auch umbenennen, da die
Tabellenblätter über Indizes angesprochen werden, müssen also nicht
"Tabellenblatt 1" und Tabellenblatt 2" heißen.
[4] Der Wahrheitswert sollte von der Art 'Zeichen' sein. Wenn Du
beispielsweise anstatt "x" als Wahrheitswert "ja" haben möchtest, musst
Du im Makro folgende Zeile anpassen: Const WD = "x" => Const WD = "ja"
[5] Das SORTIEREN habe ich mir im Makro gespart, sind manuell eh nur
wenige MausKlicks:
+ TB2 markieren Spalte "B"
+ [Daten]->[Sortieren]->[Erweiterte Auswahl]->[OK]
Und falls Dein Interesse an Makro-Programmierung "geweckt" worden sein
sollte, hier findest Du Informationen:
StarBasic/OpenOffice.org Basic FAQ (einfache Beispiele zum direkten
Ausprobieren)
http://www.dannenhoefer.de/faqstarbasic/index.html
BASIC-Makros für OpenOffice und LibreOffice (umfassendes "Standardwerk",
manchmal nicht ganz leicht verständlich, inklusive Beispiele)
www.uni-due.de/~abi070/count.php?id=OOME_3_0_deutsch.odt
www.uni-due.de/~abi070/count.php?id=OOME_3_0_deutsch.pdf
Makro Grundlagen Band 1
https://www.tintal.de/index.php/buecher/fbuecher/31746-makro-grundlagen-band-1
Makro Grundlagen Band 2
https://www.tintal.de/index.php/buecher/fbuecher/31747-makro-grundlagen-band-2
Makro Kochbuch
https://www.tintal.de/index.php/buecher/fbuecher/31737-makro-kochbuch
Wenn noch Fragen, lass einfach hören ..
Viele Grüße
Hans-Werner :-))
==================== MAKRO ====================
Option Explicit
Sub Name_Gruppe
Dim aGN() As String ' arr Gruppen Namen
Dim iTB As Integer ' idx Tabellen Blatt
Dim oCur As Object ' obj Cursor
Dim oCD As Object ' obj CALC Dokument
Dim oTB1 As Object ' obj Tabellen Blatt 1
Dim oTB2 As Object ' obj Tabellen Blatt 2
Dim oZ As Object ' obj Zelle
Dim N As String ' Name
Dim W As String ' Wahrheitswert
Dim XaktTB1 As Long ' X aktuell Tabellen Blatt 1
Dim XaktTB2 As Long ' X aktuell Tabellen Blatt 2
Dim XmaxTB1 As Long ' X maximal Tabellen Blatt 1
Dim XmaxTB2 As Long ' X maximal Tabellen Blatt 2
Dim YaktTB1 As Long ' Y aktuell Tabellen Blatt 1
Dim YaktTB2 As Long ' Y aktuell Tabellen Blatt 2
Dim YmaxTB1 As Long ' Y maximal Tabellen Blatt 1
Dim YmaxTB2 As Long ' Y maximal Tabellen Blatt 2
Const WD = "x" ' Wahrheitswert Definition
oCD = ThisComponent ' initialisieren Object CALC Dokument
oTB1 = oCD.Sheets(0) ' initialisieren Tabellenblatt 1
oTB2 = oCD.Sheets(1) ' initialisieren Tabellenblatt 2
oCur = oTB1.createCursor ' TB1 Cursor
initialisieren
oCur.GotoEndOfUsedArea(False) ' TB1 genutzer Bereich
XmaxTB1 = oCur.getRangeAddress().endColumn ' TB1 letzte Spalte
YmaxTB1 = oCur.getRangeAddress().endRow ' TB1 letzte Zeile
For XaktTB1=1 To XmaxTB1 Step 1 ' TB1 über Spalten "B"
bis ...
oZ = oTB1.getCellByPosition(XaktTB1,0) ' TB1 Zelle
initialisieren
ReDim Preserve aGN(XaktTB1-1) ' Array-Element
initialisieren
aGN(XaktTB1-1) = oZ.STRING ' Zellinhalt in
Array-Element
Next XaktTB1
oCur = oTB2.createCursor
oCur.GotoEndOfUsedArea(False) ' TB2 Cursor
initialisieren
XmaxTB2 = oCur.getRangeAddress().endColumn ' TB2 genutzer Bereich
YmaxTB2 = oCur.getRangeAddress().endRow ' TB2 letzte Zeile
oTB2.clearContents(com.sun.star.sheet.CellFlags.STRING) ' TB2 alle
Inhalte löschen
oZ = oTB2.getCellByPosition(0,0) ' "A1"
initialisieren
oZ.STRING = "Name" ' "Name"
=> "A1
oZ = oTB2.getCellByPosition(1,0) ' "B1'
initialisieren
oZ.STRING = "Gruppe" ' "Gruppe"
=> "B2"
YaktTB2 = 0 ' TB2 Y
initialisieren
For YaktTB1=1 To YmaxTB1 Step 1 ' über TB1 Y
For XaktTB1=1 To XmaxTB1 Step 1 ' über TB1 X
oZ = oTB1.getCellByPosition(0,YaktTB1) ' TB1
'Name'-Zelle initialisieren
N = oZ.STRING ' 'Name' merken
oZ = oTB1.getCellByPosition(XaktTB1,YaktTB1) ' TB1
'Wahrheitswert'-Zelle initialisieren
W = oZ.STRING '
'Wahrheitswert' merken
If (W = WD) Then '
'Wahrheitswert' ist "x"
YaktTB2 = YaktTB2+1 ' TB2 nächste
Zeile initialisieren
oZ = oTB2.getCellByPosition(0,YaktTB2) ' TB2
'Name'-Zelle initialisieren
oZ.STRING = N ' 'Name' =>
Zelle
oZ = oTB2.getCellByPosition(1,YaktTB2) ' TB2
'Gruppe'-Zelle initialisieren
oZ.STRING = aGN(XaktTB1-1) ' TB2
Array-'Gruppe' > Zelle
EndIf
Next XaktTB1
Next YaktTB1
For iTB=0 To oCD.Sheets.count-1 ' über TBs
oCD.Sheets(iTB).getColumns().optimalWidth = True ' optimale
Spaltenbreite
oCD.Sheets(iTB).getRows().optimalHeight = True ' optimale
Zeilenhöhe
Next iTB
End Sub
------ Originalnachricht ------
Von: "Micha Kühn" <michakuehn@habmalnefrage.de>
An: users@de.libreoffice.org
Gesendet: 18.08.2020 17:00:49
Betreff: [de-users] Calc-Frage
Hallo,
ich habe mal wieder eine Calc-Frage:
In einer Tabelle habe ich in Spalte A verschiedene Namen
In den Spalten B-...(z.B. B bis F) stehen Wahrheitswerte.
Diese sagen aus, ob derjenige, der in Spalte A steht, in Gruppe 1,
Gruppe 2, Gruppe 3 usw. Mitglied ist oder nicht.
Name Gruppe1 Gruppe2 Gruppe3 Gruppe4 ...
Name1 x
Name2 x x
Name3 x x
...
Jetzt benötige ich daraus ein weiteres Tabellenblatt, dass mir für jede
Mitgliedschaft eine einzelne Zeile generiert:
Name1 Gruppe1
Name2 Gruppe1
Name2 Gruppe3
Name3 Gruppe1
Name3 Gruppe2
...
Die Sortierung ist egal, es dürfte auch nach Gruppen sortiert sein.
Wie kriege ich das hin?
Danke für Tipps und liebe Grüße
Micha
--
Überlegen: Wer denken kann, ist klar im Vorteil.
(Der Postillon)
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
Option Explicit
Sub Name_Gruppe
Dim aGN() As String ' arr Gruppen Name
Dim iTB As Integer ' idx Tabellen Blatt
Dim oCur As Object ' obj Cursor
Dim oCD As Object ' obj CALC Dokument
Dim oTB1 As Object ' obj Tabellen Blatt 1
Dim oTB2 As Object ' obj Tabellen Blatt 2
Dim oZ As Object ' obj Zelle
Dim N As String ' Name
Dim W As String ' Wahrheitswert
Dim XaktTB1 As Long ' X aktuell Tabellen Blatt 1
Dim XaktTB2 As Long ' X aktuell Tabellen Blatt 2
Dim XmaxTB1 As Long ' X maximal Tabellen Blatt 1
Dim XmaxTB2 As Long ' X maximal Tabellen Blatt 2
Dim YaktTB1 As Long ' Y aktuell Tabellen Blatt 1
Dim YaktTB2 As Long ' Y aktuell Tabellen Blatt 2
Dim YmaxTB1 As Long ' Y maximal Tabellen Blatt 1
Dim YmaxTB2 As Long ' Y maximal Tabellen Blatt 2
Const WD = "x" ' Wahrheitswert Definition
oCD = ThisComponent ' initialisieren Object CALC Dokument
oTB1 = oCD.Sheets(0) ' initialisieren Tabellenblatt 1
oTB2 = oCD.Sheets(1) ' initialisieren Tabellenblatt 2
oCur = oTB1.createCursor ' TB1 Cursor initialisieren
oCur.GotoEndOfUsedArea(False) ' TB1 genutzer Bereich
XmaxTB1 = oCur.getRangeAddress().endColumn ' TB1 letzte Spalte
YmaxTB1 = oCur.getRangeAddress().endRow ' TB1 letzte Zeile
For XaktTB1=1 To XmaxTB1 Step 1 ' TB1 über Spalten "B" bis ...
oZ = oTB1.getCellByPosition(XaktTB1,0) ' TB1 Zelle initialisieren
ReDim Preserve aGN(XaktTB1-1) ' Array-Element initialisieren
aGN(XaktTB1-1) = oZ.STRING ' Zellinhalt in Array-Element
Next XaktTB1
oCur = oTB2.createCursor
oCur.GotoEndOfUsedArea(False) ' TB2 Cursor initialisieren
XmaxTB2 = oCur.getRangeAddress().endColumn ' TB2 genutzer Bereich
YmaxTB2 = oCur.getRangeAddress().endRow ' TB2 letzte Zeile
oTB2.clearContents(com.sun.star.sheet.CellFlags.STRING) ' TB2 alle Inhalte löschen
oZ = oTB2.getCellByPosition(0,0) ' "A1" initialisieren
oZ.STRING = "Name" ' "Name" => "A1
oZ = oTB2.getCellByPosition(1,0) ' "B1' initialisieren
oZ.STRING = "Gruppe" ' "Gruppe" => "B2"
YaktTB2 = 0 ' TB2 Y initialisieren
For YaktTB1=1 To YmaxTB1 Step 1 ' über TB1 Y
For XaktTB1=1 To XmaxTB1 Step 1 ' über TB1 X
oZ = oTB1.getCellByPosition(0,YaktTB1) ' TB1 'Name'-Zelle initialisieren
N = oZ.STRING ' 'Name' merken
oZ = oTB1.getCellByPosition(XaktTB1,YaktTB1) ' TB1 'Wahrheitswert'-Zelle initialisieren
W = oZ.STRING ' 'Wahrheitswert' merken
If (W = WD) Then ' 'Wahrheitswert' ist "x"
YaktTB2 = YaktTB2+1 ' TB2 nächste Zeile initialisieren
oZ = oTB2.getCellByPosition(0,YaktTB2) ' TB2 'Name'-Zelle initialisieren
oZ.STRING = N ' 'Name' => Zelle
oZ = oTB2.getCellByPosition(1,YaktTB2) ' TB2 'Gruppe'-Zelle initialisieren
oZ.STRING = aGN(XaktTB1-1) ' TB2 Array-'Gruppe' > Zelle
EndIf
Next XaktTB1
Next YaktTB1
For iTB=0 To oCD.Sheets.count-1 ' über TBs
oCD.Sheets(iTB).getColumns().optimalWidth = True ' optimale Spaltenbreite
oCD.Sheets(iTB).getRows().optimalHeight = True ' optimale Zeilenhöhe
Next iTB
End Sub
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.