benutzten Bereich per Makro markieren

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

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: benutzten Bereich per Makro markieren

Beitrag von Stephan »

Nebukadnezaar hat geschrieben: Mo, 26.08.2019 13:40 Hallo,
habe mal wieder eine ganz doofe Frage:
Mit diesem Makro markiere ich den aktuellen Bereich:

Code: Alles auswählen

Option VBASupport 1
Sub AktiverBereich
 ActiveSheet.UsedRange.select
end sub
Dabei werden die Ränder der Tabelle mit den Spalten- und Zeilennamen blau markiert.
WIe schaffe ich es (in diesem Makro), dass auch die einzelnen Zellen darin sichtbar (also blau) markiert werden ?
Mir fällt nix ein, denn select'iert wurde ja schon..
Danke erstmal
Bei welchem Programm findet das denn statt?

Ich kann weder mit AOO 4.1.8 noch LO 6.0.3 (Beides Windows) nachvollziehen, das durch diesen Code die Zellen nicht sichtbar markiert werden.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: benutzten Bereich per Makro markieren

Beitrag von Stephan »

Es findet mit der neuesten Version von LO Calc (6.2.5.2)/Windos 7.0 statt.
Habe jetzt LO 6.2.5 Portable (Windows 7) installiert und kann das Problem trotzdem nicht nachvollziehen, kann also leider nicht helfen. Bei mir ist die Markierung durch das Makro so wie Du sie haben möchtest.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: benutzten Bereich per Makro markieren

Beitrag von Stephan »

habe wie folgt getestet:
Windows 10 Pro x64
Vielleicht ist 64Bit die Ursache, jedenfalls habe ich hier ein 32Bit Windows 7.


Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: benutzten Bereich per Makro markieren

Beitrag von balu »

Autofilter_setzen_und_entfernen_per_Makro_0.ods
(14.3 KiB) 130-mal heruntergeladen
Hallo,

auch wenns mir net so gut geht, mal mein Vorschlag.

In meiner Beispieldatei kann man per Button den Autofilter setzen, und auch wieder entfernen.
Hört sich einfacher an als es für mich momentan ist. Und deshalb ist der Code nicht wirklich hübsch und auch nicht mit vielen Kommentaren versehen, zumal ich das mir hier ausm Forum zusammengeschustert habe.

Also es gibt in der Datei 2 Buttons.
1.
Filter setzen

2.
Filter deaktivieren und entfernen.


Zu 1.
Per GotoEndOfUsedArea wird der benutzte Zellbereich ausgewertet. Wobei ich als Startadresse ganz einfach von A1 (0,0) ausgehe.
- Dann wird der Datenbereich mit den eben ermittelten Zellbereich erstellt. Und dieser Datenbereich bekommt den Namen "FilterBereich" zugeordnet.
- Und anschließend wird der Autofiltter aktiviert.

Nun kann gefiltert werden.

Will man nicht mehr filtern, weil man z.B. ein paar Zeilen für den Datenbereich hinzufügen will, muss man den Filter "entfernen".
Dies könnte man z.B. über das Calc-Menü machen:
- Daten
-- Filter
--- Autofilter (oder wie das auch immer in LO 6.x.x heißen mag)
Und den Eintrag Autofilter anklicken, und wech ist der Autofilter.


Kommen wir nun zu 2. was das eben aufgeführte per Knopfdruck erledigt.
Da ich nicht weiss wie man einen vorhandenen Datenbereich unter dem Namen "FilterBereich" ändern kann, gehe ich folgenden Weg.

- Als erstes wird der Autofilter ausgeschaltet (deaktiviert).
- Dann wird der Datenbereich mit dem Namen "FilterBereich" gelöscht (entfernt).
- Egal ob die Zeilen durch das Filtern noch ausgeblendet sind, oder nicht, wird wie zuvor bei Punkt 1. wieder der benutzte Zellbereich ausgewertet.
- Jetzt hat man durch die Auswertung einen Zellbereich in dem man per Makro alle ausgeblendeten Zeilen wieder einblenden kann.
Keine Angst!
Wenn keine Zeilen ausgeblendet sind, kommt es zu keiner Fehlermeldung.

Getestet unter LO 5.1.5.2.

Hier der gesamte Code.

Code: Alles auswählen

Sub AddNewDatabaseRange() 
  Dim oRange    ' The DatabaseRange object. 
  Dim oAddr     ' The cell address range for the database range. 
  Dim oSheet    ' The first sheet, which will contain the range. 
  Dim oDoc      ' Reference ThisComponent with a shorter name. 
  oDoc = ThisComponent     
  oSheet = odoc.sheets(0)
  
    oCellCursor = oSheet.createCursor
    oCellCursor.GotoEndOfUsedArea(False)
    iEndReihe = oCellCursor.getRangeAddress().endRow    
    iEndSpalte = oCellCursor.getRangeAddress().endColumn
    
  If NOT oDoc.DatabaseRanges.hasByName("FilterBereich") Then   
    oAddr = oSheet.getCellRangeByPosition(0, 0, iEndSpalte, iEndReihe).getRangeAddress() 
    oDoc.DatabaseRanges.addNewByName("FilterBereich", oAddr) 
  End If 
  oRange = oDoc.DatabaseRanges.getByName("FilterBereich") 
  oRange.AutoFilter = True 
End Sub
'
'**************************************************************************************
'
Sub Filter_deaktivieren_und_entfernen() 
  Dim oRange    ' The DatabaseRange object. 
  Dim oDoc      ' Reference ThisComponent with a shorter name. 
  oDoc = ThisComponent 
  oSheet = odoc.sheets(0)
  
  If oDoc.DatabaseRanges.hasByName("FilterBereich") = True Then 
	oRange = oDoc.DatabaseRanges.getByName("FilterBereich") 
	oRange.AutoFilter = False   
	oDoc.DatabaseRanges.removeByName("FilterBereich")  
	
	    oCellCursor = oSheet.createCursor
		oCellCursor.GotoEndOfUsedArea(False)
		iEndReihe = oCellCursor.getRangeAddress().endRow    
		iEndSpalte = oCellCursor.getRangeAddress().endColumn	
	
    oZeilenEinblenden = oSheet.getCellRangeByPosition(0, 0, iEndSpalte, iEndReihe).Rows
	oZeilenEinblenden.isvisible = True
  End If  
End Sub
Das wars meinerseits.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: benutzten Bereich per Makro markieren

Beitrag von Stephan »

Wenn es anscheinend garnicht nötig ist VBA-Code zu nutzen, dann probiere doch normales Starbasic:

Code: Alles auswählen

Sub Main
	With ThisComponent.CurrentController
		cur = .ActiveSheet.createCursor
		cur.gotoStartOfUsedArea(False)
		cur.gotoEndOfUsedArea(True)
		.select(cur)
	End With	
End Sub
Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: benutzten Bereich per Makro markieren

Beitrag von balu »

Autofilter_setzen_und_entfernen_per_Makro_1.ods
(15.08 KiB) 115-mal heruntergeladen
Hallo Neb,
Ich hoffe es geh dir inzwischen wieder besser
Es geht so. Bin extrem Wetterfühlig.
Grad eben, vor ein paar Minuten, kaum dunkler Himmel, aber Blitz und Donner und Wasser ohne Ende. Und das mal nur für ca. 10 Minuten, und jetzt is wida olles ruhig.

danke dir für die Mühe
Freu :-)

Leider kann man (wegen DatabaseRanges.hasByName)
jeweils nur eine Tabelle autofiltern.
Nop!
Dem ist nicht so!
DatabaseRanges ist ein Datenbankbereich. Der in LO 5.x unter
- Daten
- Bereich auswählen
nachzulesen ist.
Und unter
- Bereich hinzufügen
kann man selber weitere hinzufügen.
Ich wüsste jetzt nicht wie groß die Anzahl an verschieden Datenbankbereichen sein darf, aber mehrere hunderte dürften kein Problem sein.

Will man mehrere Blätter Filtern, dann muss man für jedes Blatt ein Datenbankbereich festlegen und das jeweilige Blatt referenzieren.
Ich war mal so frei und habe auf die ganz schnelle einen 2 Filter eingebaut. Und dafür mussten nur ganz wenige Änderungen vorgenommen werde.

- Als erstes ein weiteres BASIC-Modul anlegen.
- Den Code aus dem bestehenden Modul kopieren und in das neue einfügen.
- In dem neuen Modul muss 2 mal aus diesem hier

Code: Alles auswählen

oSheet = odoc.sheets(0)
das hier gemacht werden.

Code: Alles auswählen

oSheet = odoc.sheets(1)
Dadurch wird das 2. Tabellenblatt per Indexnummer angesprochen.

- Jetzt muss noch im neuen Modul jeder dieser Einträge

Code: Alles auswählen

("FilterBereich")
geändert werden.
Ich habe jetzt zu Demo zwecken einfach das hier genommen.

Code: Alles auswählen

("Tabelle2Filtern")
Das sind ja die Namen für die einzelnen Datenbankbereiche.

Im prinzip wars das auch schon was im Makro geändert werden muss. Einzig müssten auf dem 2. Tabellenblatt wieder 2 Buttons eingefügt werden die auf das neue BASIC-Modul mit dem geänderten Makro zugreifen. Das habe ich auch in der neuen Beispieldatei erledigt.

Mit anderen Worten; Du kannst die neue Datei selber testen. In LO 5.1.5.2 funzt dat wunnebaaahr ;-)

Latürnich isch das Makro wirklich äußerst primitiv, normalerweise würde man dies auch anders erledigen (anstatt 2 mal das gleiche), aber dadurch kannst Du jetzt das etwas einfacher nachvollziehen was zu ändern ist.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: benutzten Bereich per Makro markieren

Beitrag von balu »

Hallo Neb,

wenn Du ein Tabellenblatt gerne mit dem Blattnamen ansprechen willst, so ist das nicht verkehrt. Ich sagte ja auch zu anfangs; schnell zusammengeschustert. Bedenke auch bitte in diesem Zusammenhang das das jetzige Makro nicht mehr viel mit deinem Eingangsproblem zu tun hatte.

Damit war mir schon klar, dass ich für jede Tabelle ein eigenes Makro bzw. (der Übersichtlichkeit halber) Modul anlegen müsste.
Das stimmt so nicht.
Es geht auch eleganter. Aber das geht dann noch weiter in die Tiefen der Programmierung. Selbst das jetzige Makro kann man nicht als ein einfaches Anfängerprojekt bezeichnen.

Was Du bräuchtest ware ein Inspektionstool wie MRI. Okay, damit umzugehen ist auch nicht grad leicht, aber nur damit kommt man an Dinge ran die man nicht sofort findet oder sogar versteht.

Und wenn man mit dem Tool schon weiter gekommen ist, dann kann man so einiges verbessern.
Jetzt sind momentan fast 2 identische Makros im Einsatz. Dies kann man stark reduzieren, zumindest auf nur noch ein Makro. Um das aber zu bewältigen müssen bestimmte Dinge abgeklärt werden. Und erst danach kann man das Makro dementsprechend umschreiben.

Arbeitet man z.B. mit getActiveSheet, kann man auch den dazugehörigen Tabellenblattnamen auslesen. Nur das Verständnis dafür wie man das schafft, ist halt für einen Anfänger nicht so einfach, erst recht nicht ohne das angesprochene Tool.

Hat man den Blattnamen ermittelt, kann man auch gezielt einen Namen für die Datenbankbereiche erstellen. Das ist alles irgendwie machbar. Aber ohne Tool, und die Rahmenanforderungen geht da nix.

Abschließend noch eine Frage, wie kann man makromatig (automatisch) einen Autofilter deaktivieren, von dem man nicht weiß, welche Dimension (SpaltenxZeilen) er hat?
Hier ist folgende Frage von Bedeutung:
Ist mit deaktivieren das zurückstellen auf Ungefiltert, oder Ungefiltert PLUS Autofilter entfernen gemeint?
Im ersten Falle reicht es wenn man die ausgeblendeten Zeilen wieder einblendet, das wäre kein großes Problem.
Aber im zweitem Falle wirds wohl etwas komplizierter, aber im Prinzip so wie es schon im Makro nachzulesen ist, und zwar in der Sub Filter_deaktivieren_und_entfernen().
Sollte der Autofilter aber ohne Namen gesetzt worden sein, wirds wohl richtig kompliziert.


Wenn Du das mit dem Autofilter weiter ausbauen möchtest, und Du dafür Hilfe brauchst, dann mach hier Schluß und eröffne einen neuen Thread in dem es dann nur noch darum geht.


Grüße sind angelooommen *hicks* :-)



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: benutzten Bereich per Makro markieren

Beitrag von balu »

Hallo Neb,

ich hatte gestern abend noch mal schnell was getestet. Aber ohne ein Inspektionstool (ich verwende XRAY, nebst MRI) wäre ich nicht dahinter gekommen. Obwohl, ich muss gestehen das ich ja schon zu anfangs das Forum durchsucht hatte und dabei etwas bestimmtes gelesen hatte, ich nicht allein drauf gekommen bin, aber dazu ist ja ein Forum da.

Also, mit diesem Tool kann man Sachen feststellen die man sonst nicht sehen würde. Und durch den gefundenen Tipp hate ich mich auf die Suche gemacht. Und dadurch habe ich folgendes festgestellt.

Ohne das Makro laufen zu lassen, gibt es keinen Namen für einen Datenbankbereich. Ist eigentlich logisch.
Das Makro gestartet, und ein Name ist vorhanden. Ist ja soweit auch noch logisch.
ABER!
Von Hand einen Autofilter gesetzt, also über das Menü in Calc, zeigt keinen Namen an. Jedoch mit dem Tool konnte ich feststellen das doch automatisch ein Name angelegt wird namens "unbenannt".
In meiner vorherigen Antwort verwies ich ja auf die *Sub Filter_deaktivieren_und_entfernen()*. Und dort hatte ich den bisherigen Namen "FilterBereich" einfach gegen "unbenannt" getauscht. Anschließend diese Sub ausgegührt, und siehe da, der Händisch gesetzte und gefilterte Autofilter war wech; Autofilter nicht mehr sichtbar und die ausgeblendeten Zeilen waren wieder eingeblendet.

Mit anderen Worten.
Man kann auch per "primitiven" Makro einen Händisch angewendeten Autofilter entfernen und deaktivieren.

Muss aber auch dazu sagen das ich dies erstmal nur in OO.o 3.2.1 getestet hatte, in LO steht noch ein gegentest aus. Und ich habe ja nur mit einem Händischen auf einem Blatt probiert. Weitere Tests müsste ich noch ausführen um eventuell auftretende Einschränkungen festzustellen.

Ich habe jetzt erstmal Feierabend.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: benutzten Bereich per Makro markieren

Beitrag von balu »

Hallo Neb,

ich habe jetzt mal gegentests mit XRAY gestartet, und dabei kamen LO 4.2.1.1 und LO 5.1.5.2 zum einsatz. Ergebnis ist ernüchternd.

In beiden Officen konnte ich mit XRAY keinen Datenbankbereichsnamen für den Händischen Autofilter finden. Das ist ja schon blöd, aber selbst bei den Zähler (Counts) hat sich nix geändert. Kein Name => keine Zählererhöhung. Über den Umweg des Zähler hätte man vielleicht was machen können. Aber das entfällt ja.

Tja, tut mir echt leid, das ich umsonst die Pferde verrückt gemacht habe.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten