Hallo Leute,
ich kenne den Sinn einer Funktion schon (mehrere Wert rein, ein Wert zurück).
Aber kennt jemand einen Trick wie ich auch andere Felder einen Wert zuordnen kann?
Hintergrund: Wenn in Spalte A ein Wert ermittelt wird (geschieht jetzt mit einer Funktion) dann muss auch in B und C ein Wert erscheinen.
Gruß
Johann
Zitat von: Jonny am April 13, 2012, 08:15:06
Aber kennt jemand einen Trick wie ich auch andere Felder einen Wert zuordnen kann?
Einfacher Trick: Deklariere den Rückgabewert der Funktion "as Variant" und gib ein Array zurück, welches fest strukturiert ist.
Dim myArray() as Integer
myArray = myFunction(par1, par2, ...)
B = myArray(0)
C = myArray(1)
Hallo Wurliwurm,
erstmal Danke für die Antwort.
Kannst du mir das etwas detalierter schreiben?
Wo kommt z.B. die Deklaration "as Variant" hin.
Gruß
Johann
Hallo,
ZitatWenn in Spalte A ein Wert ermittelt wird (geschieht jetzt mit einer Funktion) dann muss auch in B und C ein Wert erscheinen.
Wenn der Wert ermittelt wurde, kannst Du in der gleichen Funktion auch den beiden anderen Feldern den Wert zuweisen. Entweder jeweils in einer eigenen Funktion oder wenn möglich den Wert direkt zuweisen.
Wenn die Funktion im Klassenmodul des Formulars ist, kannst Du die Felder B und C direkt ansprechen
ZitatMe.FeldB = ....
Zitat von: Jonny am April 13, 2012, 09:32:36
Kannst du mir das etwas detalierter schreiben?
Wo kommt z.B. die Deklaration "as Variant" hin.
Ich kann Dir hier ein allgemeines Beispiel schreiben:
Public Function getPersonendaten(ByVal intPersNr as integer) as Variant
Dim myArray() as String
Redim myArray(3)
myArray(0) = "Max"
myArray(1) = "Mustermann"
myArray(2) = "Hamburg"
getPersonendaten = myArray
End Function
Danke euch Beiden,
ich hab hier eine Sub die wie folgt aussieht:
Sub Stelle()
Dim Kundennummer As Long
Kundennummer = Range("A" & ActiveCell.Row)
Dim Zeile As Long
Dim ZeileNeu As Long
Dim Spalte As Long
Dim Gefunden As Long
Gefunden = 0
Zeile = 2
While Range("A" & Zeile) <> "Ende"
If Kundennummer = Range("A" & Zeile) Then
ZeileNeu = ActiveCell.Row
Cells(ZeileNeu, ActiveCell.Column + Gefunden) = Range("B" & Zeile)
Gefunden = Gefunden + 1
End If
Zeile = Zeile + 1
Wend
End Sub
die funktioniert auch.
Jetzt möchte ich das als Funktion haben
Gruß
Johann
Hallo,
sorry, habe mal wieder nicht aufgepasst, es geht ja hier um Excel, nicht um Access. Da muss ich jemand anders das Feld überlassen. ;D
Hallo Johann,
Bin zwar auch nicht der Excel-Spezialist,
aber
ZitatJetzt möchte ich das als Funktion haben
Das geht erstmal einfach, - ersetze
Sub durch
Function.
In die Klammern kommen die Übergabeparameter.
Durch die Deklaration
as Variant kannst Du auch
ein Array (= mehrere Werte) zurückgeben. Das Problem dürfte
aber sein, dass Du dort (bei Excel die aufrufende Zelle)
mit mehreren Werte nichts anfangen kannst (vermute ich
jedenfalls mal). Du müsstest also in der Function die anderen
Zellen befüllen, in dem Du die da explizit per Range
ansprichst.
Man kann es aber auch so machen, das man die
Zielfelder
auch als Parameter übergibt. Und zwar
ByRef DeineZelle as Range.
(Bin jetzt allerdings nicht sicher, ob
ByRef nicht sowieso Standard ist).
Dann kannst Du also schon beim Aufruf bestimmen welche Zellen
befüllt werden sollen.
In der Hoffnung nicht völlig daneben zu liegen, Berichtigungen erwünscht.
gruss ekkehard
Hallo,
eine Array macht keinen Sinn da ich bestimmte Felder füllen muss.
Ekkehard: Einfach Sub durch Function ersetzen klappt nicht. Bekomme immer die Meldung #Wert.
Nehme ich das Befüllen der anderen Felder weg kann ich das Ausgangsfeld mit den ersten Wert füllen.
Habe es mit Range und mit Cells probiert beides mit den gleichen Miserfolg.
Also scheint Excel hier den Sinn einer Funktion (Werte rein, ein Wert raus) Ernst zu nehmen.
Gruß
Johann
Hallo,
"die funktioniert auch."
gut
"Jetzt möchte ich das als Funktion haben"
warum?
Zitat von: Jonny am April 16, 2012, 08:38:22
Also scheint Excel hier den Sinn einer Funktion (Werte rein, ein Wert raus) Ernst zu nehmen.
Was machst Du in der oben geposteten Routine? Es sieht so aus, als ob da irgendwas gezählt wird (die Zeilen mit einer bestimmten Kundennummer). Dann gib halt den Gefunden-Wert zurück...
Meist löst sich ein Problem, indem man es sauber formuliert.
Hallo Franz und Wurliwurm,
die Routine ist fast so etwas wie ein erweiterter SVERWEIS. Man positioniert auf das Feld was das erste Ergebnis
bekommen soll. Dann startet man die Routine. Das Feld Links neben dem aktuellen Feld hat den Suchwert. Dieser Suchwert
kann in der Matrix mehrfach vorkommen. Jedesmal wenn er gefunden wird, wird ein weiteres Feld rechts neben dem Aktuellen Feld
gefüllt.
Die Handhabung ist so nicht elegant. Halt positionieren und VBA Starten.
Würde ich das als Funktion haben könnte der Anwender diese eingeben bzw. mit den Assi erstellen.
Das wäre erheblich eleganter und vor allem sicherer. Dazu kommt das man dann die Formel noch nach unten ziehen kann.
Natürlich muss ich dann noch Anpassungen machen damit alle Adressen der Funktion übergeben werden.
Gruß
Johann
Hallo,
naja, wie üblich halt:
in einem Modul(!):
Public Function xyz(cell1,cell2)
xyz = cell1 * cell2 'anstelle dieser Zeile Deine Berechnung
End Function
und Eintrag in einer Zelle (z. B. C1):
=xyz(A1;B1)
Hallo Johann,
Zitateine Array macht keinen Sinn da ich bestimmte Felder füllen muss.
Hatte ich ja schon angemerkt.
ZitatEinfach Sub durch Function ersetzen klappt nicht. Bekomme immer die Meldung #Wert.
Kann sein, dass Excel explizit einen Rückgabewert erwartet.
Dann belasse es bei einer Sub; - das ist für den Aufruf in
diesem Fall auch egal, nur Public sollte sie sein.
ZitatDie Handhabung ist so nicht elegant. Halt positionieren und VBA Starten.
Verstehe ich jetzt nicht;- Neuberechnung erfolgt doch einfach mit F5 (oder war's F9?)
ZitatWürde ich das als Funktion haben könnte der Anwender diese eingeben bzw. mit den Assi erstellen.
Das wäre erheblich eleganter und vor allem sicherer. Dazu kommt das man dann die Formel noch nach unten ziehen kann.
Da Deine Sub ja funzt, wie Du schon geschrieben hast, übergebe der Sub einfach die Startzelle,
dann wird die auch beim Kopieren angepasst.
Ob Du den Parameter im Code dann benutzt, oder nicht, spielt dabei dann keine Rolle.
So sollte die auch per Assistent zu erstellen sein.
Und einen Rückgabewert brauchst Du ja eigentlich auch nicht, da Du ja die Zellen rechts von
der aufrufenden Zelle direkt in der Sub befüllst (wenn ich dich richtig verstanden habe).
Ansonsten kann ich Dir mit meinem geringen Excel-Wissen wohl nicht weiterhelfen.
gruss ekkehard
Hallo,
ich lasse das Ganze als Sub.
Eine Function will wirklich nur einen Rückgabewert und erlaubt (zumindestens bei Excel 2007) und nicht andere Felder zu füllen.
Habs getestet. wenn ich das Füllen wegnehmen und nur einen Rückgabewert habe dann OK
Wenn ich füllen der anderen Felder mit reinnehme dann Meldung #Wert.
Gruß
Johann