Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1356to1360
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

variabel Anzahl an input Parametern

variabel Anzahl an input Parametern
09.04.2014 13:09:02
David
Hallo,
ich möchte eine Funktion schreiben, die sich genau so verhält wie 'Summe' in excel. d.h. sie soll
- von einer Zelle aus aufzurufen sein [ z.B. in zelle A1: "=summe(...)" ]
- die Input-parameter sollen ranges sein [ z.B. "=summe(B1;B2)" ]
- die Anzahl der Input-Parameter soll dabei variabel sein [ z.B. "=summe(B1;B2)" oder "=summe(B1;B2;B3)"]
- die funktion sollte auch mit 50 Input-Parametern klarkommen
Sagen wir als Beispiel, dass ich meine eigene Summen-Formel bauen möchte.
Mit einer festen Anzahl an Input-Arguenten hätte ich kein problem.
Aber wie mache ich das mit der beliebigen Anzahl an Input-Argumenten?
Kann man sich den source code der Excel-Funktionen (z.B. Summe) irgendwo ansehen?
Beste Grüße

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: variabel Anzahl an input Parametern
09.04.2014 13:22:20
selli
hallo david,
woher soll denn deine fuktion erfahren wieviele und welche "input parameter" sie einbeziehen soll?
gruß
selli

ParamArray
09.04.2014 13:25:21
Tino
Hallo,
z. Bsp so.
Function MeineSumme(ParamArray ArWerte() As Variant)
Dim n&
For n = LBound(ArWerte) To UBound(ArWerte)
MeineSumme = MeineSumme + ArWerte(n)
Next n
End Function
In eine Zelle z. Bsp.
=MeineSumme(A1;A10;A20;...)
Gruß Tino

AW: ParamArray
09.04.2014 13:29:45
selli
hallo
ganau das macht doch die SUMME funktion.
gruß
selli

soll ja nur als Beispiel für ParamArray dienen oT.
09.04.2014 13:36:20
Tino

AW: ParamArray
09.04.2014 13:53:52
David
Vielen Dank Tino,
ParamArray war genau das, was ich gebraucht habe.

Anzeige
Allerdings ist Tinos Bsp recht trivial und ...
09.04.2014 15:13:24
Luc:-?
…fktt so nur mit EinzelZellAngaben, David;
der XlFkt SUMME kann man aber auch ganze ZellBereiche und EinzelZellen gleichzeitig übergeben, was Tinos BspPgm in einen Fehler laufen ließe (wg der einfachen Addition). Das musst du also noch bei deiner Fkt beachten.
Ein ParamArray ist ein Variant mit einem Datenfeld. Die Indizierung seiner Elemente beginnt (außer evtl, falls in VBA global anders eingestellt) stets mit 0. Dabei wird ein übergebener Bereich nicht einzelzellenweise auf die möglichen EinzelElemente aufgeteilt, sondern verbleibt als ein Element. Auf diese Weise kann ein auf Xl-ZellBereiche nicht abbildbares Datenfeld entstehen, das aber auch als „Arrays in einem Array“, was es eigentl ist, in VBA elementweise identifiziert und verarbeitet wdn kann. Besteht jedes Element aus einem (1dimensionalen) Vektor, stellt das ParamArray einen senkrechten Vektor dar, dessen Elemente ebenfalls aus Vektoren bestehen. Sind Letztere alle gleichlang, ist das ganze Array sogar auf ZellBereiche abbildbar. Voraussetzung ist dabei allerdings, dass die Vektoren alle 1dimensional sind. Ein ZellBereich, der eine(n Teil einer) Zeile umfasst, wird dann idR so interpretiert, bei Spalten ist das eher fraglich, denn normalerweise sind Vektoren aus Zellbereichen stets 2dimensional. In VBA sind nur horizontale Vektoren 1dimensional, senkrechte (und Matrizen) stets 2dimensional, um so die wichtige Unterscheidung der Vektorausrichtung darstellen zu können. Ein ParamArray (und natürlich auch ein anderweitig erzeugter Variant mit einem Array ) ist stets 1dimensional → aus Einzelwerten (Skalaren) gebildet, ist es auch stets horizontal, aus Vektoren (bzw Matrizen) gebildet, ist es vertikal orientiert. Bestehen seine Elemente aus 1elementigen Vektoren, erhält man den Sonderfall eines 1dimensionalen, aber trotzdem vertikal orientierten VBA-Vektors, dessen EinzelElemente unterster Stufe dann nicht mit ArrayName(i), das wäre bei einem horizontal orientierten Vektor der Fall, sondern mit ArrayName(i)(j), für j=0 bzw 1, identifiziert wdn. Mit dem Erstgenannten spricht man in diesen Fällen ein Element des ParamArrays, also in diesem Falle eine ganze Zeile, egal aus wieviel Elementen diese besteht, an.
Wenn du also auch ganze ZellBereiche oder Datenfelder (idR im Ergebnis von Ausdrücken in TeilFmln als Argument) an das ParamArray übergeben willst, musst du bei seiner Verarbeitung zuerst elementweise auf dieses Faktum mit IsArray(element) prüfen.
Gruß Luc :-?

Anzeige
AW: Allerdings ist Tinos Bsp recht trivial und ...
09.04.2014 17:54:35
David
hallo Luc,
ich glaube, ich habe von deinem ersten Abschnitt nicht alles verstanden. Aber der wesentliche Punkt ist klar.
Falls es noch andere interessiert, meine Lösung (die nicht bei allen anderen Anwendungen klappen mag) für das von Luc angesprochene Problem ist folgende:
Function MeineSumme(ParamArray ArWerte() As Variant)
Dim n&
For n = LBound(ArWerte) To UBound(ArWerte)
for each element in ArWerte(n)
MeineSumme = MeineSumme + element
next element
Next n
End Function
Aber in dem ursprungs-thread geht es ja eigentlich nicht um den umgang mit den Parametern, sondern lediglich, wie diese in die Funktion übergeben werden. Dies wurde ja von Timo beantwortet.
Luc, falls du doch etwas anderes meinst, würde ich mich über eine Rückmeldung freuen. Mein Problem ist zwar gelöst, allerdings lernt man ja gerne dazu.
LG

Anzeige
So, wie du es jetzt geschrieben hast, wäre ...
10.04.2014 13:20:05
Luc:-?
…das genannte Problem in diesem Fall gelöst, David,
allerdings darf dann kein Fehlerwert oder Text innerhalb der ParamArray-Werte auftauchen. Aber das ist ja „nur“ ein Problem der durchgeführten Operation, nicht des Arrays an sich. ;-)
Gruß Luc :-?

War zu schnell; würde den 'For Each'-Zyklus ...
10.04.2014 13:28:50
Luc:-?
…allerdings nur laufen lassen, wenn ArWerte(n) ein Array ist. Also hier so:
If IsArray(ArWerte(n)) Then
For Each element In ArWerte(n)
MeineSumme = MeineSumme + element
Next element
Else: MeineSumme = MeineSumme + ArWerte(n)
End If
Anderenfalls könnte es bei EinzelWerten als ParamArray-Element ein Problem geben.
Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige