Seite 1 von 1
Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 09:19
von Shirkan
Liebe Leute,
kann mir jemand einen Tipp geben wie ich einer benutzerdefinierten Funktion am geschicktesten einen Zellbereich übergebe und ich diesen innerhalb der Funktion einzeln durchlaufe?
(ich bin Umsteigern von Excel auf Calc). Vorab Danke für die Hilfe
Danke Markus
Re: Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 09:31
von komma4
Am Besten über die Angabe der Zellbereichs-Adressnamen:
=MeineFunktion( "A1:D99" ; "Tabelle1" )
Code: Alles auswählen
Function MeineFunktion( sBereichsAdr, sTabName )
oBereich = ThisComponent.Sheets().getByName( sTabName ).getCellRangeByName( sBereichsAdr )
Re: Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 09:42
von Shirkan
Winfried,
kannst Du mir noch sagen wie die Schleife aussieht mit der ich auf die Elemente des übergebenen Bereichs durchlaufen kann um sie z.B. alle zu addieren.
Gruß Markus
Re: Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 10:08
von komma4
Wie man an die Zellen, bzw. Inhalte gelangt ist immer eine Sache des Ziels und der Bereichs-Grösse.
Bspw. geht die Bearbeitung mit einem DatenArray schnell (auch bei grossen Bereichen)
Code: Alles auswählen
lSumme = 0
oDaten = oBereich.getDataArray()
' die Zeilen des Bereichs
' zz: ZählerZeilen
for zz = _
LBound( oDaten() ) to _
UBound( oDaten() )
oDatenZeile() = oDaten( zz )
' zz: ZählerZeilen
' pro Zeile die cells/Zellen
' zc: ZählerCells
for zc = _
LBound( oDatenZeile() ) to _
UBound( oDatenZeile() )
lSumme = lSumme + oDatenZeile( zc )
next ' Zellen
next ' nächste Datenzeile
print lSumme
Der Code funktioniert auch, wenn Zellen leer oder mit Zeichenketten gefüllt sind
Re: Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 10:25
von Stephan
kann mir jemand einen Tipp geben wie ich einer benutzerdefinierten Funktion am geschicktesten einen Zellbereich übergebe
Am Zweckmäßigsten indem Du diesen direkt als Bereich übergibst, z.B. wie in
http://www.calc-info.de/files/Calc_StarBasic.pdf beschrieben:
Code: Alles auswählen
Function summenTest ( vArgument as Variant )
' ist das argument ein Array (Zellbereich)
if Not IsArray(vArgument) then
' ist der einzelne Wert numerisch
if IsNumeric( vArgument ) then
' Rückgabewert ist gleich Eingabewert
summenTest = vArgument
else
' Summe ist gleich 0 wenn kein numerischer Wert
' übergeben wurde
summenTest = 0
end if
' funktion beenden
exit function
End If
Dim nSumme as Long
Dim i as Integer
Dim j as Integer
' der spätere Rückgabewert
nSumme = 0
' Schleife durch 1 Dimension (Zeilen)
for i=1 to UBound(vArgument,1)
' Schleife durch zweite Dimension (Spalten)
for j=1 to UBound(vArgument,2)
' numerisch?
if IsNumeric( vArgument(i,j) ) then
' Wert dazuzählen
nSumme = nSumme + vArgument(i,j)
end if
next j
next i
' Rückagbewert in Zelle
summenTest = nSumme
End Function
und aufrufen mit z.B.:
=SUMMENTEST(A1:B20)
Gruß
Stephan
Re: Funktion Zellbereich übergeben
Verfasst: Mo, 26.09.2011 10:39
von Shirkan
Wilfried, wenn ich das richtig sehe müsste die Funktion vollständig jetzt wie folgt aussehen:
Code: Alles auswählen
Function MeineFunktion( sBereichsAdr, sTabName )
Dim oBereich
Dim oDaten
Dim oDatenZeile
Dim lSumme
Dim zz 'ZählerZeilen
Dim zc 'ZählerCells
oBereich = ThisComponent.Sheets().getByName( sTabName ).getCellRangeByName( sBereichsAdr )
lSumme = 0
oDaten = oBereich.getDataArray()
'die Zeilen des Bereichs durchlaufen
for zz = LBound( oDaten() ) to UBound( oDaten() )
oDatenZeile() = oDaten( zz )
'die Zellen der Zeilen durchlaufen
for zc = LBound( oDatenZeile() ) to UBound( oDatenZeile() )
lSumme = lSumme + oDatenZeile( zc )
next ' Zellen
next ' nächste Datenzeile
'print lSumme
MeineFunktion = lSumme
End Function
Jedenfalls vielen Dank, ich werde es heute abend ausführlich testen.
Gruß Markus
Re: Funktion Zellbereich übergeben
Verfasst: Mi, 28.09.2011 09:21
von Shirkan
Ok, ich hatte Deine Funktion nicht vollständig gesehen, weil in dem sichbaren Fenster die letzte Zeile >Exit Funktion< war und ich dachte hier ist es beendet. Tatsächlich handelte es sich aber nur um einen vorzeitigen Funktionsaausstieg. Die so nicht vollständige Funktion konnte natürlich nicht gehen. Sorry, der Fehler lag auf meiner Seite.
Gruß Markus
P.S. Der Threat kann geschlossen werden.