copy - aber nur, was sichtbar ist
Moderator: Moderatoren
copy - aber nur, was sichtbar ist
Hallo,
ich habe ein Makro, mit dem können bestimmte Zeilen einer Tabelle unsichtbar gemacht werden, wenn in eine bestimmte Zelle ein "x" geschrieben wird.
Ich habe ein zweites Makro, mit dem die Inhalte der Tabelle kopiert und in eine neue Tabelle einfügt werden.
Das Problem ist, daß immer alles kopiert wird. Ich hätte aber gerne, daß nur kopiert wird, was sichtbar ist.
Kann mir da jemand helfen?
Gruß, Hago
ich habe ein Makro, mit dem können bestimmte Zeilen einer Tabelle unsichtbar gemacht werden, wenn in eine bestimmte Zelle ein "x" geschrieben wird.
Ich habe ein zweites Makro, mit dem die Inhalte der Tabelle kopiert und in eine neue Tabelle einfügt werden.
Das Problem ist, daß immer alles kopiert wird. Ich hätte aber gerne, daß nur kopiert wird, was sichtbar ist.
Kann mir da jemand helfen?
Gruß, Hago
Hey Hago,
wenn du das mit einem Makro machst, dann arbeitest du mit dem Objektmodell - da ist immer alles drin. Der Controller steuert das View-Objekt, da können Zellen ausgeblendet werden.
Zwei Varianten:
1. Du besorgst dir die Information aus dem View-Objekt über den Controller -> ist aber wahrscheinlich der umständlichere und schwierigere Weg.
2. Du analysierst per Makro (Schleifen) alle Zellinhalte und übernimmst nur die, wo kein X drin ist -> ist meiner Ansicht schneller und einfacher zu lösen, eventuell aber (aufgrund der Schleifen) langsamer in der Ausführung. Kommt auf die Anzahl der Zellen an.
Gruss
Thomas
wenn du das mit einem Makro machst, dann arbeitest du mit dem Objektmodell - da ist immer alles drin. Der Controller steuert das View-Objekt, da können Zellen ausgeblendet werden.
Zwei Varianten:
1. Du besorgst dir die Information aus dem View-Objekt über den Controller -> ist aber wahrscheinlich der umständlichere und schwierigere Weg.
2. Du analysierst per Makro (Schleifen) alle Zellinhalte und übernimmst nur die, wo kein X drin ist -> ist meiner Ansicht schneller und einfacher zu lösen, eventuell aber (aufgrund der Schleifen) langsamer in der Ausführung. Kommt auf die Anzahl der Zellen an.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Hago,
Aber - was für Tabellen meist du eigentlich? Texttabellen oder Calc?
Damit der richtig Code rauskommt....
Gruss
Thomas
Jo, wenn ich ein wenig Zeit habe, poste ich dir einene Anfang.D.h., wenn Du mir noch so ein wenig zeigen könntest, wie die Schleife auszusehen hat, wäre ich sehr dankbar.
Aber - was für Tabellen meist du eigentlich? Texttabellen oder Calc?
Damit der richtig Code rauskommt....
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Thomas,
Calc-Tabellen meine ich.
Eine hat 170 Zeilen, die anderen haben ca. 40 Zeilen.
Unten habe ich das Makro angehängt, das die Zeilen aus- und einblendet.
Inzwischen habe ich einiges an Basic-Tutorials durchgeackert, aber ich denke nicht, daß ich das so auf die Schnelle hin bekomme.
Würde mich sehr freuen.
Gruß, Hago
................................
Sub Filterein_aus()
Dok = ThisComponent
Controller = Dok.CurrentController
Blatt = Controller.ActiveSheet
Cursor =Blatt.createCursor()
Cursor.GotoEndofUsedArea(True)
EndZeile = Cursor.getRangeAddress.EndRow
For I = 0 To EndZeile
Zelle = Blatt.getCellByPosition(8,I)
Wert = Zelle.String
If Wert = "x" or Wert = "X" then
Zeile = Blatt.rows(I)
If Zeile.IsVisible then
Zeile.IsVisible = False
else Zeile.IsVisible = true
end if
End If
next
End Sub
Calc-Tabellen meine ich.
Eine hat 170 Zeilen, die anderen haben ca. 40 Zeilen.
Unten habe ich das Makro angehängt, das die Zeilen aus- und einblendet.
Inzwischen habe ich einiges an Basic-Tutorials durchgeackert, aber ich denke nicht, daß ich das so auf die Schnelle hin bekomme.
Würde mich sehr freuen.
Gruß, Hago
................................
Sub Filterein_aus()
Dok = ThisComponent
Controller = Dok.CurrentController
Blatt = Controller.ActiveSheet
Cursor =Blatt.createCursor()
Cursor.GotoEndofUsedArea(True)
EndZeile = Cursor.getRangeAddress.EndRow
For I = 0 To EndZeile
Zelle = Blatt.getCellByPosition(8,I)
Wert = Zelle.String
If Wert = "x" or Wert = "X" then
Zeile = Blatt.rows(I)
If Zeile.IsVisible then
Zeile.IsVisible = False
else Zeile.IsVisible = true
end if
End If
next
End Sub
Hi,
ich glaub's fast selbst nicht, aber ich hab' da was zuasmmengestupft, das mehr oder weniger macht, was ich will:
............................
sub Kopieren3
myDoc = ThisComponent
oTabelle1 = myDoc.Sheets(0)
oTabelle2 = myDoc.Sheets(1)
For j=4 to 10
Zeile = oTabelle1.rows(j)
If Zeile.IsVisible then
For i=1 to 6
x = oTabelle1.getCellByPosition(i,j).String
oTabelle2.getCellByPosition(i-1,j-4).String = x
Next i
End if
Next j
end sub
.................................
Das Problem ist jetzt noch, daß ich in Tabelle2 an Stelle der ausgeblendeten Zeile eine leere Zeile bekomme. Ich möchte da aber lieber gar keine Zeile.
Kann mir da jemand etwas helfen?
Gruß, Hago
ich glaub's fast selbst nicht, aber ich hab' da was zuasmmengestupft, das mehr oder weniger macht, was ich will:
............................
sub Kopieren3
myDoc = ThisComponent
oTabelle1 = myDoc.Sheets(0)
oTabelle2 = myDoc.Sheets(1)
For j=4 to 10
Zeile = oTabelle1.rows(j)
If Zeile.IsVisible then
For i=1 to 6
x = oTabelle1.getCellByPosition(i,j).String
oTabelle2.getCellByPosition(i-1,j-4).String = x
Next i
End if
Next j
end sub
.................................
Das Problem ist jetzt noch, daß ich in Tabelle2 an Stelle der ausgeblendeten Zeile eine leere Zeile bekomme. Ich möchte da aber lieber gar keine Zeile.
Kann mir da jemand etwas helfen?
Gruß, Hago
Hallo Hago,
ich hab zwar immer noch wenig Zeit, aber da hab ich was für dich:
die erste, die alle Inhalte (außer den nicht gewünschten) in einen Array einliest, eine Zeite, die den Array dann in die Zellen schreibt.
Hier ein Beispiel, dass du dann natürlich entsprechend umstricken musst:
Dieser Code liest Namen aus einer Liste ein, "würfelt" sie durch und gibt sie wieder aus. Das dürfte dein Problem in etwas beschreiben.
Gruss
Thomas
ich hab zwar immer noch wenig Zeit, aber da hab ich was für dich:
Du bauchst du zwei Schleifen:Das Problem ist jetzt noch, daß ich in Tabelle2 an Stelle der ausgeblendeten Zeile eine leere Zeile bekomme. Ich möchte da aber lieber gar keine Zeile.
die erste, die alle Inhalte (außer den nicht gewünschten) in einen Array einliest, eine Zeite, die den Array dann in die Zellen schreibt.
Hier ein Beispiel, dass du dann natürlich entsprechend umstricken musst:
Code: Alles auswählen
sub Zufall
Dim aListe1(5), aListe2(5) ' die Listen mit den Namen - Arrays a 6 Elem
Dim i%, n%, zz%
Dim oDoc as object, oTab as Object
oDoc = ThisComponent
oTab = oDoc.sheets.getsheetByIndex(0)
REM Schleife zum auslesen der Namen
For i = 0 to 5
aListe1(i) = oTab.getCellRangeByName("B" & i+2).string
next
REM Zufallszahl erzeugen, und Werte umkopieren
n = 0
Do
zz = CINt(RND() * 5) 'liefert ganze Zufallszahlen von 0 bis 5
if aListe1(zz) <> "###" then
aListe2(n) = aListe1(zz)
aListe1(zz) = "###" 'bereits übernommene Werte markieren
n = n+1
loop until n >= 6
REM die Neue Liste eintragen
for i = 0 to 5
oTab.getCellRangeByName("C" & i+2).string = aListe2(i)
next
end sub
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Geschafft! Endlich.
Das ist jetzt dabei rausgekommen:
Falls mir jemand noch was Schlaues sagen kann, um es zu vereinfachen... - ich bin immer empfänglich.
Gruß, Hago
Das ist jetzt dabei rausgekommen:
Code: Alles auswählen
sub Kopieren4
myDoc = ThisComponent
oTabelle1 = myDoc.Sheets(0)
oTabelle2 = myDoc.Sheets(1)
jn=1
For j=7 to 25
Zeile = oTabelle1.rows(j)
If not Zeile.IsVisible then
jn=jn-1
j = j+1
else
For i=2 to 7
oTabelle2.getCellByPosition(i-2,jn).String = oTabelle1.getCellByPosition(i,j).String
Next i
End if
jn=jn+1
Next j
end sub
Gruß, Hago