Makro Zeilen und Spaltenabfrage

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

Moderator: Moderatoren

turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Makro Zeilen und Spaltenabfrage

Beitrag von turtle47 »

Hallo Spezialisten,

ich bin Anfänger in Basic und habe mir folgendes Makro "zusammengebastelt":

Code: Alles auswählen

Sub Spalte
dim Ergebnis as new  com.sun.star.sheet.GoalResult
dim FormelAdresse as new  com.sun.star.table.CellAddress
dim VariablenAdresse as new  com.sun.star.table.CellAddress
dim Zielwert as integer
dim zeile as integer
   
oDoc = ThisComponent
oSheet = ThisComponent.Sheets(1)
oCelle=oDoc.getCurrentSelection().getCellAddress()
       Wert=oCelle.column

msgbox  ("Spalten A bis IV sind ausgewertet."+ Chr(13) + "Die aktuelle Spalte ist: " & Wert,  , "Abfrage aktuelle Spalte") 'Ausgabe als Messagebox

End Sub


sub Zeile
dim Ergebnis as new  com.sun.star.sheet.GoalResult
dim FormelAdresse as new  com.sun.star.table.CellAddress
dim VariablenAdresse as new  com.sun.star.table.CellAddress
dim Zielwert as integer
dim spalte as integer
   
oDoc = ThisComponent
oSheet = ThisComponent.Sheets(1)
oCelle=oDoc.getCurrentSelection().getCellAddress()
       Wert1 = oCelle.Row

msgbox ("Zeilen 0 bis 32.000 sind ausgewertet." + Chr(13) + "Die aktuelle Zeile ist: " & Wert1, 64 , "Abfrage aktuelle Zeile")        'Ausgabe als Messagebox

End Sub
Die Makros muß ich leider immer einzeln aufrufen.
Hätte aber gerne, dass das Makro "Sub Zeile" direkt nach Bestätigung der ersten MsgBox abläuft.

Habe es schon mit:

Code: Alles auswählen

Call Zeile
am Ende des Makros "Sub Spalte" versucht .
Leider ohne Erfolg.

Hat jemand eine Rat.

Besser währe es noch, wenn beide Abfragen in nur einer MsgBox angezeigt würden.

Vielen Dank im voraus für die Hilfe.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Beitrag von kannenklaus »

hallo turtle,

Code: Alles auswählen

am Ende des Makros "Sub Spalte" versucht .
du kannst der msgbox ein if-abfrage voranstellen und den rückgabewert der schaltfläche auswerten.

Code: Alles auswählen

If MsgBox("Text1",4,"Titel") = 6 then
call zeile
else
exit sub
end if
4 liefert dir die schaltfläche ja/nein, wenn du ja drückst, wird der rückgabewert 6 geliefert. die rückgabewert sind wie folgt dokumentiert:

1 Ok-Schaltfläche
2 Abbrechen-Schaltfläche
4 Wiederholen-Schaltfläche
5 Ignorieren-Schaltfläche
6 Ja-Schaltfläche
7 Nein-Schaltfläche


grüsse klaus
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Nabend Kannenklaus,

funtioniert leider nicht.

Habe jetzt folgendes eigegeben:

Code: Alles auswählen

if msgbox  ("Spalten A bis IV sind ausgewertet."+ Chr(13) + _
"Die aktuelle Spalte ist: " & Wert, 4 , "Abfrage aktuelle Spalte") = 6 then
Call Zeile
else
exit sub
end if
End Sub
Bekomme die Fehlermeldung: Basic-Lauzeitfehler.
Eigenschaft oder Methode nicht gefunden.

Mit dem Code:

Code: Alles auswählen

Sub Test
Call Zeile
End Sub
kann ich das Makro "Zeile" aber aufrufen.
Der Code dafür ist ja auch vorhanden.

Am Aufruf kann es also nicht liegen.

Was mache ich falsch? :?:

Viele Grüße

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Kannenklaus,

das glaube ich jetzt nicht! :shock:

Ich habe:

Code: Alles auswählen

Call Zeile
durch:

Code: Alles auswählen

Call aktuelleZeile
ersetzt und jetzt geht es. :idea:

Wie ist das möglich?

Liegt das wirklich nur an der Namensvergabe???

Natürlich habe ich dafür das Makro "Zeile" in "aktuelleZeile" umbenannt!
Der Fachmann staunt und der Laie wundert sich.

Gruß

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Der Fachmann staunt und der Laie wundert sich.
letzteres mag ja so sein, nur wenn Du Zeile innerhalb eines Makros als Variable deklarierst und gleichzeitig unter diesem Namen ein Makro aufrufen willst reagiert OOo verständlicherweise 'sauer'.
(Ob das bei einem Aufruf mittels Call nun so sein muß sei dahingestellt, nur es ist der Sache nach schon kein guter Stil für eine Prozedur und eine Variable den gleichen Namen zu verwenden.)

Code: Alles auswählen

dim zeile as integer

Liegt das wirklich nur an der Namensvergabe???

Natürlich habe ich dafür das Makro "Zeile" in "aktuelleZeile" umbenannt!
Ja. Du hättest auch den Namen der Variable "zeile" verändern können.
Habe jetzt folgendes eigegeben:

Code:
if msgbox ("Spalten A bis IV sind ausgewertet."+ Chr(13) + _
"Die aktuelle Spalte ist: " & Wert, 4 , "Abfrage aktuelle Spalte") = 6 then
Call Zeile
else
exit sub
end if
End Sub


Bekomme die Fehlermeldung: Basic-Lauzeitfehler.
Eigenschaft oder Methode nicht gefunden.
Weil OOo 'nervös' auf das Leerzeichen hinter "_" in Zeile:

Code: Alles auswählen

if msgbox  ("Spalten A bis IV sind ausgewertet."+ Chr(13) + _ 
reagiert, entferne es einfach.
Mit dem Code:

Code:
Sub Test
Call Zeile
End Sub

kann ich das Makro "Zeile" aber aufrufen.
Der Code dafür ist ja auch vorhanden.
Ja, weil dort keine Deklaration von "zeile" als Integer-Variable erfolgt und die Deklarition von innerhalb der anderen Prozedur (Sub Spalte ) keine Gültigkeit mehr hat.

Das sich das mit der Gültigkeit so verhält kannst Du leicht selbst prüfen mittels:

Code: Alles auswählen

Sub Spalte 
dim Ergebnis as new  com.sun.star.sheet.GoalResult 
dim FormelAdresse as new  com.sun.star.table.CellAddress 
dim VariablenAdresse as new  com.sun.star.table.CellAddress 
dim Zielwert as integer 
dim zeile as integer 
    
oDoc = ThisComponent 
oSheet = ThisComponent.Sheets(1) 
oCelle=oDoc.getCurrentSelection().getCellAddress() 
       Wert=oCelle.column 

if msgbox  ("Spalten A bis IV sind ausgewertet."+ Chr(13) + _
"Die aktuelle Spalte ist: " & Wert, 4 , "Abfrage aktuelle Spalte") = 6 then 
Call Test 
else 
exit sub 
end if 
End Sub

Sub Test 
Call Zeile 
End Sub 

sub Zeile 
dim Ergebnis as new  com.sun.star.sheet.GoalResult 
dim FormelAdresse as new  com.sun.star.table.CellAddress 
dim VariablenAdresse as new  com.sun.star.table.CellAddress 
dim Zielwert as integer 
dim spalte as integer 
    
oDoc = ThisComponent 
oSheet = ThisComponent.Sheets(1) 
oCelle=oDoc.getCurrentSelection().getCellAddress() 
       Wert1 = oCelle.Row 

msgbox ("Zeilen 0 bis 32.000 sind ausgewertet." + Chr(13) + "Die aktuelle Zeile ist: " & Wert1, 64 , "Abfrage aktuelle Zeile")        'Ausgabe als Messagebox 

End Sub

Gruß
Stephan
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Beitrag von kannenklaus »

hallo jürgen,

oft sind es kleine dinge, die laufzeitfehler verursachen. schau nochmals, dass in deiner msgbox beim trennen nach dem underlinded keine blanks sind.

ich habe den folgenden code positiv getestet.

Code: Alles auswählen

Sub Test
if msgbox  ("Spalten A bis IV sind ausgewertet."+ Chr(13)+ _
"Die aktuelle Spalte ist: " & Wert, 4 , "Abfrage aktuelle Spalte") = 6 then 
Call Zeile 
else 
msgbox("Neinsager")
exit sub 
end if 
End Sub

Sub Zeile
msgbox ("Liebe Zeile")
end sub
grüße klaus
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Stephan, Hallo Kannenklaus,

ihr habt Euch aber viel Mühe gegeben alles so ausführlich zu erläutern.
Dafür tausend Dank.
Da macht Basic lernen richtig Spass. :mrgreen:

Wünsche Euch ein schönes Wochenende.


Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo User,

hab heute noch ein bischen versucht zu programmieren.
Daraus hat sich folgender Code entwickelt:

Code: Alles auswählen

Sub SelectedCells 
  oSelect=ThisComponent.CurrentSelection.getRangeAddress
  oSelectColumn=ThisComponent.CurrentSelection.Columns
  oSelectRow=ThisComponent.CurrentSelection.Rows

  CountColumn=oSelectColumn.getCount
  CountRow=oSelectRow.getCount

  oSelectSC=oSelectColumn.getByIndex(0).getName
  oSelectEC=oSelectColumn.getByIndex(CountColumn-1).getName

  oSelectSC=oSelectColumn.getByIndex(0).getName
  oSelectEC=oSelectColumn.getByIndex(CountColumn-1).getName
  oSelectSR=oSelect.StartRow+1
  oSelectER=oSelect.EndRow+1
  NoCell=(CountColumn*CountRow)
  oSelectAC=oSelect.StartColumn+0
  oSelectAR=oSelect.StartRow+0
 
  If CountColumn=1 AND CountRow=1 Then
   MsgBox("Selektierte Zelle: " + oSelectSC + oSelectSR + chr(13) + "Absolute Spalte:  " + oSelectAC+ chr(13) + "Absolute Zeile:  " + oSelectAR,, "Selektierte Zelle")
  Else
   MsgBox("Zellbereich (" + oSelectSC + oSelectSR + ":" + oSelectEC + oSelectER + ")" + chr(13) + "Anzahl der Zellen:  " + NoCell,, "Selektierte Zellen") 
  End If
End Sub
Damit kann ich jetzt einzelne Zellen aber auch Zellbereiche abfragen.


Hab da aber noch ne Frage.

Die Zelle "A1" ist ja auch übersetzt gleich mit 0/0, oder? Ist das der absolute Zellbezug oder wie nennt man den?

Und was ist mit A1 entspricht 1/1? Es ist ja die erste sichtbare Zelle und man fängt ja normalerweise da an zu zählen. Was ist das für ein Bezug, etwa relativ?

Wenn ich mit einem Makro etwas in eine bestimmte Zelle schreiben will muss ich ja ersteres Beispiel anwenden, also von 0/0 an beginnen. Das weis ich mitlerweile.

Der Kern der Frage ist halt nur wie nennt man diese Zellbezüge, weil ich in dem Makro

Code: Alles auswählen

"Absolute Spalte:  " + oSelectAC+ chr(13) + "Absolute Zeile:  " + oSelectAR,, "Selektierte Zelle")
die Richtige Bezeichung angeben will. Nix weiter.



Schönen Sonntag und Feiertag wünsche ich Euch

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Antworten