Access-o-Mania

Office-Forum (Deutsch/German) => Microsoft Excel => Thema gestartet von: Jonny am April 13, 2012, 08:15:06

Titel: Eigene Funktion
Beitrag von: Jonny am April 13, 2012, 08:15:06
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
Titel: Re: Eigene Funktion
Beitrag von: Wurliwurm am April 13, 2012, 09:11:27
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)
Titel: Re: Eigene Funktion
Beitrag von: Jonny am April 13, 2012, 09:32:36
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
Titel: Re: Eigene Funktion
Beitrag von: MzKlMu am April 13, 2012, 09:41:54
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 = ....
Titel: Re: Eigene Funktion
Beitrag von: Wurliwurm am April 13, 2012, 09:43:23
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
Titel: Re: Eigene Funktion
Beitrag von: Jonny am April 13, 2012, 09:47:12
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
Titel: Re: Eigene Funktion
Beitrag von: MzKlMu am April 13, 2012, 09:49:54
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
Titel: Re: Eigene Funktion
Beitrag von: Beaker s.a. am April 13, 2012, 22:01:00
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
Titel: Re: Eigene Funktion
Beitrag von: Jonny am April 16, 2012, 08:38:22
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
Titel: Re: Eigene Funktion
Beitrag von: DF6GL am April 16, 2012, 10:56:18
Hallo,

"die funktioniert auch."
gut


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


Titel: Re: Eigene Funktion
Beitrag von: Wurliwurm am April 16, 2012, 15:12:56
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.
Titel: Re: Eigene Funktion
Beitrag von: Jonny am April 16, 2012, 16:20:36
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
Titel: Re: Eigene Funktion
Beitrag von: DF6GL am April 16, 2012, 19:30:20
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)
Titel: Re: Eigene Funktion
Beitrag von: Beaker s.a. am April 16, 2012, 21:19:02
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
Titel: Re: Eigene Funktion
Beitrag von: Jonny am April 22, 2012, 09:59:45
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