copy - aber nur, was sichtbar ist

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

copy - aber nur, was sichtbar ist

Beitrag von Hago »

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

Hi Thomas,

ich danke Dir.
Die Zeit ist in diesem Fall kein Problem. - Ich werd's mal versuchen, obwohl ich ja ein absoluter Basic-Laie bin.
D.h., wenn Du mir noch so ein wenig zeigen könntest, wie die Schleife auszusehen hat, wäre ich sehr dankbar.

Gruß, Hago
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Hago,
D.h., wenn Du mir noch so ein wenig zeigen könntest, wie die Schleife auszusehen hat, wäre ich sehr dankbar.
Jo, wenn ich ein wenig Zeit habe, poste ich dir einene Anfang.
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
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

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
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Hago,

ich hab zwar immer noch wenig Zeit, aber da hab ich was für dich:
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.
Du bauchst du zwei Schleifen:
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
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

Geschafft! Endlich.

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
Falls mir jemand noch was Schlaues sagen kann, um es zu vereinfachen... - ich bin immer empfänglich.

Gruß, Hago
Antworten