Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1288to1292
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

Funktion aufrufen mit Variable

Funktion aufrufen mit Variable
15.12.2012 19:21:12
Malte
Hallo,
ich habe eine Idee um mein Programm deutlich zu verkürzen und zwar in der folgenden Art:
Sub abc()
Dim ausgabe As Double
If Cells(1, 1) = 1 Then
ausgabe = berechnung("addition", 2, 2)
ElseIf Cells(1, 1) = 2 Then
ausgabe = berechnung("multiplikation", 2, 2)
End If
Cells(2, 1) = ausgabe
End Sub

Function berechnung(ByVal artderberechnung As String, wert1 As Double, wert2 As Double)
berechnung = artderberechnung(wert1, wert2)
End Function

Function addition(wert1, wert2)
addition = wert1 + wert2
End Function

Function multiplikation(wert1, wert2)
multiplikation = wert1 * wert2
End Function
ich möchte in einer Funktion, eine weitere Funktion durch einen übergebenden Wert aufrufen, jedoch steht als Fehler dort "Erwartet: Datenfeld"
kann ich dieses Problem irgendwie umgehen, oder ist meine Idee so nicht umsetzt bar?
Wie könnte es alternativ gehen?
Vielen Dank!

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Application.Run(Macro, Arg1,Arg2,Arg2...)
15.12.2012 19:29:40
ransi
HAllo
Versuch mal so:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub abc()
Dim ausgabe As Variant
Select Case Cells(1, 1)
    Case 1
        ausgabe = berechnung("addition", 2, 2)
    Case 2
        ausgabe = berechnung("multiplikation", 2, 2)
    Case Else
        ausgabe = "Irgendwas anderes"
        Cells(2, 1) = ausgabe
End Select
End Sub



Function berechnung(ByVal artderberechnung As String, wert1 As Double, wert2 As Double)
berechnung = Application.Run(artderberechnung, wert1, wert2)
End Function



Function addition(wert1, wert2)
addition = wert1 + wert2
End Function



Function multiplikation(wert1, wert2)
multiplikation = wert1 * wert2
End Function


ransi

Anzeige
AW: Application.Run(Macro, Arg1,Arg2,Arg2...)
15.12.2012 19:46:56
ransi
HAllo
Korektur:
Option Explicit

Sub abc()
Dim ausgabe As Variant
Select Case Cells(1, 1)
    Case 1
        ausgabe = berechnung("addition", 2, 2)
    Case 2
        ausgabe = berechnung("multiplikation", 2, 2)
    Case Else
        ausgabe = "Irgendwas anderes"
End Select
Cells(2, 1) = ausgabe
End Sub



Function berechnung(ByVal artderberechnung As String, wert1 As Double, wert2 As Double)
berechnung = Application.Run(artderberechnung, wert1, wert2)
End Function



Function addition(wert1, wert2)
addition = wert1 + wert2
End Function



Function multiplikation(wert1, wert2)
multiplikation = wert1 * wert2
End Function


ransi

Anzeige
Nett, dass du einen 4.Weg versuchst, ...
15.12.2012 20:13:30
Luc:-?
…Ransi! ;-)
Gruß + schö3AdWE, Luc :-?

AW: Nett, dass du einen 4.Weg versuchst, ...
15.12.2012 20:17:20
Malte
Hallo,
bei mir kam ein Laufzeitfehler bei dem Code, ging es bei dir?
Danke für die Hilfe!

Ich habe das nicht getestet, weil ich ...
15.12.2012 20:22:35
Luc:-?
…1. das zZ nicht kann ohne den PC neu zu starten und
2. glaube, dass das wahrscheinl gar nicht funktioniert!
Sieh dir meinen Beitrag an, Malte!
Gruß Luc :-?

das funzt. ...
15.12.2012 20:25:46
ransi
Hallo Malte
Das funktioniert.
Schau selber:
Userbild
ransi

AW: das funzt. ...
15.12.2012 20:29:44
Malte
Hallo,
darf ich fragen, wie du diese gif so schnell und gut hinbekommen hast? :-)
Wenn ich das Programm mit Haltepunkten abfrage kommt bei mir an folgender Stelle ein Laufzeitfehler 1004:
berechnung = Application.Run(artderberechnung, wert1, wert2)
Gruß!

Anzeige
AW: das funzt. ...
15.12.2012 20:34:12
Malte
Hallo,
es geht, wenn ich ich das ganze in ein Modul lege. Ich hatte den Code immer in den Tabellenblättern direkt.
Ich schaue orientiere mich mal weiter an deiner Lösung.
Vielen Dank!

Das wäre die Voraussetzung für Var3 gewesen! owT
15.12.2012 21:01:32
Luc:-?
:-?

...denn es gibt ja neben dem 0. noch ...
15.12.2012 20:17:49
Luc:-?
…einen 5.Weg, aber den verraten wir ihm lieber nicht, denn der ist am kritischsten! ;-)
Luc :-?

Na, sehr fraglich, ob das dadurch ...
15.12.2012 20:10:01
Luc:-?
…wirklich kürzer wird, Malte,
das hängt wohl auch davon ab, wie das ursprgl Pgm aussieht bzw aussehen sollte, und ob das dann nicht anders formuliert kürzer wäre. Aber als Idee ist das schon ganz nett, nur gilt es dabei einiges zu beachten, wobei die Fktt addition und multiplikation eigentl überflüssig sind, denn dafür kann die WorksheetFunction-Methode für die xlStandardFktt .Sum und .Product benutzt wdn.
Aber tun wir mal so, als ob es die nicht gäbe.
Fehleranalyse:
Der Fkt berechnung übergibst du als 1.Argument artderberechnung als String → damit ist das ein Text. Ein Text kann aber nicht als Name agieren, schon gar nicht als der einer weiteren Fkt! Dazu benötigt man weitere Hilfsmittel:
1.Var: Du legst in der Fkt berechnung ein Select Case-Konstrukt an
Select Case artderberechnung
Case "addition": berechnung = addition(wert1, wert2)
Case "multiplikation": berechnung = multiplikation(wert1, wert2)
End Select

2.Var: Du rechnest in der Fkt berechnung immer beide Fktt aus und wählst dann nur das richtige Ergebnis
Const txBerArt$ = "addition multiplikation"
Dim abNr As Integer, abVgl
abVgl = Split(txBerArt)
For abNr = 0 To Ubound(abVgl)
If abVgl = artderberechnung then Exit For
Next abNr
berechnung = Array(addition(wert1, wert2), multiplikation(wert1, wert2))(abNr)

3.Var: Die Fktt addition und multiplikation wdn in ein Dokument-Klassenmodul (zB der Arbeitsmappe) eingetragen. Dann können sie auch mit ihrem Namenstext mittels der vbFkt CallByName aufgerufen wdn, da sie dann quasi Eigenschaften der Mappe sind
Dim aWb As Workbook
Set aWb = ActiveWorkbook
berechnung = CallByName(aWb, artderberechnung, vbGet, wert1, wert2)

Da es sich hier um Grundsätzliches handelt, habe ich das mal länger ausgeführt, obwohl das für dein aktuelles Problem sicher irrelevant ist. Da greife dann lieber auf bereits Existierendes, Universelleres zurück (denn das ist noch nicht alles, da gibt's noch mehr zu bedenken!) und reserviere diese Ansätze besser für echte Novitäten.
Gruß + schö3AdWE, Luc :-?

Anzeige
AW: Na, sehr fraglich, ob das dadurch ...
15.12.2012 20:23:09
Malte
Hallo,
vielen Dank für deinen Lösungsvorschlag!
Das Problem daran ist, dass dies ja nur ein Beispiel war.
Das reale Problem bezieht sich auf das implizierte Eulerverfahren um Differentialgleichungen zu lösen. Dabei muss die Gleichung ja iterative z.B. durch das Newton-Verfahren gelöst werden.
Das alles in ein Array zu packen, ist nicht sinnvoll, oder?
a) Größeses Array, das je nach Iterationsverlauf Größenmäßig angepasst werden muss
b) Es müsste Mehrdimensional sein um weitere dazugehörige Daten zu speichern
Würde es dennoch Sinn machen?

Aha, das ist also das Problem! Ja, ...
15.12.2012 20:57:59
Luc:-?
…dann ist das Ganze wohl doch nicht so das Richtige, Malte;
man kann aber eine Fkt aus sich selbst heraus erneut aufrufen (Rekursion) und dabei immer die Argumente an den Stand der Berechnung anpassen. Dazu müssen dann wohl auch Iterationen in den xlEinstellungen zugelassen wdn, falls du das mit einer ZellFml, die solche udFktt enthält, lösen willst.
Mit n-dimensionalen Arrays (Tensoren) kann man in VBA schon arbeiten, sie nur nicht mit einer Fml im Blatt darstellen (max n=2). Dann ist dein Bsp aber leider zu trivial gewesen. Ich schrieb ja, da wäre dann noch mehr zu beachten. Versuche erst mal in der rekursiven Richtung weiter zu denken! Dafür gibt's auch Bspp wie die Sortierroutine QuickSort.
Größenmässige Anpassung eines Arrays geht auch in VBA, allerdings immer nur für die letzte Dimension (mit ReDim). Dabei wäre aber zu überlegen, welche Art von Array sinnvoll wäre, ein arX(i, j, …, z) oder ein Variant mit einem Array avX(i)(j)(…)(z)! Mach dich mal in der VBE-Hilfe kundig!
Übrigens ist vbGet in meiner 3.Variante wahrscheinlich falsch. Es gibt wohl 4 Arten (vbLet, vbGet, vbSet, vb?). Die nichtgenannte wird's wohl sein.
Gruß Luc :-?
PS: Falls es dich interessiert; bisher hatte ich es nur mal geschafft, eine meiner udFktt zur Simulierung des Kronecker-Tensorprodukts zu (miss-)brauchen. Ansonsten noch ein paar Fktt, die sich mit 3dTensoren beschäftigen, aber eben keine Differenzialgleichungen. Aber dafür gibt's in MathLab garantiert was, viell auch auf http://www.excelformeln.de .

Anzeige
AW: Aha, das ist also das Problem! Ja, ...
15.12.2012 21:13:43
Malte
Hm.. Ok, vielen Dank für Deine Antwort auch wenn ich einige deiner Apsekte nicht ganz nachvollziehen kann (bin eher der Hobbyprogrammierer) :-)
Mit ReDim habe ich auch schon gespielt, jedoch löscht ReDim ja meine Arrayeinträge, das ist bei einem iterativen Verfahren ungünstig :-))
Ich versuche es mit der Lösung Application.Run in dem Modul..
Vielen Dank!

Naja, so richtig kann ich mir nicht vorstellen ...
16.12.2012 00:07:08
Luc:-?
…wie das bei dem Problem nur mit diesem Hilfsmittel fktionieren soll, Malte;
das ist sicher nicht der günstigste Weg, sondern resultiert allein aus der Beschränkung deiner Anfrage, für die die anderen WegVarianten genauso gut wären.
Es ist ein Fehler, sich (noch dazu bei relativ geringen Kenntnissen) schon einen festen (Pgmier-)Weg vorzunehmen und dann nur darauf seine Fragen auszurichten, denn das schließt möglicherweise effizientere Lösungswege aus. Hier im Forum verkehrt auch der eine oder andere Wirtschaftsmathematiker und ProfiPgmierer (mW gehört Ransi zu Letzteren, könnte dir also höchstwahrscheinlich auch noch effektiver helfen).
Viel Erfolg! Luc :-?

Anzeige
das Stimmt allerdings, Vielen Dank, owT
16.12.2012 10:49:34
Malte

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige