Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Eigene Funktion

Begonnen von Jonny, April 13, 2012, 08:15:06

⏪ vorheriges - nächstes ⏩

Jonny

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

Wurliwurm

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)

Jonny

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

MzKlMu

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 = ....
Gruß Klaus

Wurliwurm

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

Jonny

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

MzKlMu

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
Gruß Klaus

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Jonny

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

DF6GL

Hallo,

"die funktioniert auch."
gut


"Jetzt möchte ich das als Funktion haben"
warum?



Wurliwurm

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.

Jonny

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

DF6GL

#12
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)

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Jonny

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