Anzeige
Archiv - Navigation
1484to1488
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 in VBA (Excel 2016)

Funktion in VBA (Excel 2016)
27.03.2016 19:04:21
Ali

Hallo zusammen,
ich habe eine Verständnisfrage hinsichtlich Funktionen in VBA. Wie muss ich eine Variable deklarieren, wenn die Zelle entweder eine Zahl mit Nachkommastellen annehmen kann oder leer steht.
Public Function Schicht1(s1 As Double, tw As Variant, b1 As Double, ru As Double, t1 As _
Double, t2 As Double, t3 As Double, t4 As Double, vb1 As Double, vb2 As Double, vb3 As Double, vb4 As _
Double, b2 As Variant) As Double
In diesem Beispiel kann die letzte Variable b2 entweder eine Zahl oder leer sein. Ist die Deklaration "Variant" dann richtig? Ich hab sowohl "Variant" als auch "Double" versucht, allerdings wird mit der Fehler #Wert! angezeigt. Sobald ich in die Zelle eine Zahl eingebe, wird die Funktion richtig errechnet.
Danke schon mal für eure Hilfe.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Funktion in VBA (Excel 2016)
27.03.2016 19:25:03
Ali
PS: tw kann auch eine Zahl oder ein "-" sein. Sobald die Zellen für tw und b2 keine Zahl bzw. leer sind, wird die Fehlermeldung #WERT! angezeigt. Was genau muss ich umstellen, damit dies nicht mehr eintritt?

AW: Funktion in VBA (Excel 2016)
27.03.2016 19:40:18
Dirk
Hallo Ali,
ich antworte eigentlich nie, weil ich absoluter Anfänger bin. Ich habe mit einem VBA Kurs begonnen und da meine ich mich zu erinnern: Wenn du mehrere Variablen in einem Klammerausdruck dimensionierst, dann haben sie dennoch alle den Typ Variant. Du musst, meine ich, folgendes machen:
Dim S1 as Double
Dim tw as Variant
usw.
Vielleicht hilft dir das. Sonst bitte alle Ausführungen vergessen... :-)
Gruß
Dirk

Anzeige
Wie lautet die Funktion?
27.03.2016 20:13:02
RPP63
Hi!
Mit Function(…) As Double
muss die Funktion ja einen Double übergeben.
Die Kenntnis der Funktion wäre hilfreich!
Wenn ein Argument nicht immer benötigt wird, kommt folgendes in die Klammer:
Function(s1 As Double, Optional B2 As Double) As Double
Optionale Argumente kommen immer an der Schluss der Argumentliste.
Gruß Ralf

AW: Wie lautet die Funktion?
29.03.2016 16:40:43
Ali
Ich habe soweit alles eingefügt. Nun lautet meine Funktion wie folgt:
Option Explicit
Public Function Schicht1(s1 As Double, tw As Variant, b1 As Double, ru As Double, t1 As _
Double, t2 As Double, t3 As Double, t4 As Double, vb1 As Double, vb2 As Double, vb3 As Double,   _
_
vb4 As _
Double, Optional b2 As Variant) As Double
'mit    s1 = Schicht 1 Tiefe, tw = Tiefe Grundwasser, b1 = oberer Radius des Erdkegelsstumpfes
'        ru = unterer Radius des Erdkegelstumpfes, t1...t4 = einzelne Fund.höhen
'         vb1...vb4 = Betonvolumen 1...4, b2 = unterer Radius bei mehreren Schichten
Dim vol1 As Double, vol2 As Variant, Te2 As Double, Te3 As Double, Tges As Double
Dim vb1b2 As Double, vb1b3 As Double, vb1b4 As Double, p As Variant
Dim r1 As Variant, r2 As Variant, v1 As Variant, v2 As Variant
vol1 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * ru + ru ^ 2) * s1    'für Volumen Erde bei  _
_
Tges <= s1
vol2 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * b2 + b2 ^ 2) * s1    'für Volumen Erde bei  _
_
Tges > s1
Te2 = t1 + t2
Te3 = t1 + t2 + t3
Tges = t1 + t2 + t3 + t4
vb1b2 = vb1 + vb2
vb1b3 = vb1 + vb2 + vb3
vb1b4 = vb1 + vb2 + vb3 + vb4
r1 = (b1 - ru) / s1 * (s1 - tw) + ru        'unterer Radius auf Höhe Tw für Tges <= s1 ( _
Strahlensatz)
r2 = (b1 - b2) / s1 * (s1 - tw) + b2        'unterer Radius auf HöheTw für Tges > s1 ( _
Strahlensatz)
v1 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * r1 + r1 ^ 2)
v2 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * r2 + r2 ^ 2)
'prozentualer Anteil p des Erdvolumens über Wasser im Fall tw < s1
If tw < s1 And s1 >= Tges Then p = v1 / vol1
If tw < s1 And s1 < Tges Then p = v2 / vol2
' Erdvolumen für den Bereich tges <= s1  und tges > s1 > t3
If s1 >= Tges And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol1 - vb1b4
If s1 >= Tges And tw < s1 Then _
Schicht1 = (vol1 - vb1b4) * p                            'anteiliges Volumen über Wasser
If (s1 < Tges And s1 > Te3) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b4 * s1 / Tges
If (s1 < Tges And s1 > Te3) And tw < s1 Then _
Schicht1 = (vol2 - vb1b4 * s1 / Tges) * p          'anteiliges Volumen über Wasser
' Erdvolumen für den Bereich t3 >= s1 > t2
If (s1 <= t3 And s1 > Te2) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b3 * s1 / t3
If (s1 <= t3 And s1 > Te2) And tw < s1 Then _
Schicht1 = (vol2 - vb1b3 * s1 / t3) * p              'anteiliges Volumen über Wasser
' Erdvolumen für den Bere
If (s1 <= t2 And s1 > t1) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b2 * s1 / t2
If (s1 <= t2 And s1 > t1) And tw < s1 Then _
Schicht1 = (vol2 - vb1b2 * s1 / t2) * p               'anteiliges Volumen über Wasser
' Erdvolumen für den Bereich t1 >= s1 > 0
If (s1 <= t1 And s1 > 0) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1 * s1 / t1
If (s1 <= t1 And s1 > 0) And tw < s1 Then _
Schicht1 = (vol2 - vb1 * s1 / t1) * p              'anteiliges Volumen über Wasser
End Function

Ich habe alle Variablen in der Funktion, die von b2 abhängig sind, ebenfalls als Variant deklariert. Meines Erachtens nach sollte die Funktion jetzt eigentlich rechnen. Leider gibt er mit immer noch die Fehlermeldung #WERT! zurück. Hat vielleicht noch jemand eine Idee?

Anzeige
AW: Funktion in VBA (Excel 2016)
27.03.2016 20:15:28
Michael
Hi zusammen,
@Dirk: die Deklaration war schon in Ordnung so, die DIMs gibt es nur bei Deklarationen in einer Sub/Function.
Der Punkt ist: Dim a, b as long dimensioniert a als Variant und (nur) b als long.
Analog als Parameter in Functions würde (a, b as long) auch a als Variant und nur b als long übernehmen.
Ali HAT aber bei jeder Variablen den Typ angegeben, das ist so weit ok.
Wie in der Datei: https://www.herber.de/bbs/user/104626.xlsm
zu sehen ist, liegt der Fehler aber nicht daran, denn die
Public Function Schicht1(s1 As Double, tw As Variant, b1 As Double, ru As Double, _
t1 As Double, t2 As Double, t3 As Double, t4 As Double, vb1 As Double, _
vb2 As Double, vb3 As Double, vb4 As Double, b2 As Variant) As Double
MsgBox "übergeben wurden: " & vbLf & _
"s1: " & s1 & vbLf & _
"tw: " & tw & vbLf & _
"b1: " & b1 & vbLf & _
"ru: " & ru & vbLf & _
"t1: " & t1 & vbLf & _
"t2: " & t2 & vbLf & _
"t3: " & t3 & vbLf & _
"t4: " & t4 & vbLf & _
"vb1: " & vb1 & vbLf & _
"vb2: " & vb2 & vbLf & _
"vb3: " & vb3 & vbLf & _
"vb4: " & vb4 & vbLf & _
"b2: " & b2 & vbLf
' Was wird hier berechnet?
Schicht1 = 2
End Function
spuckt bei Text in tw und b2 keine Fehler aus.
Ich vermute eher, daß bei der Berechnung etwas anderes als Double herauskommt (die Function ist als As Double definiert) und deshalb der Fehler erzeugt wird.
Schöne Grüße,
Michael

Anzeige
AW: Funktion in VBA (Excel 2016)
27.03.2016 21:51:13
Peter Feustel
Hallo Ali,
wenn der Wert leer sein kann, solltest du Optional b2 As Variant schreiben und durch das Optional davor darf sie auch leer sein.
Gruß Peter

AW: Funktion in VBA (Excel 2016)
29.03.2016 10:53:45
Ali
Ich habe soweit alles eingefügt. Nun lautet meine Funktion wie folgt:
Option Explicit
Public Function Schicht1(s1 As Double, tw As Variant, b1 As Double, ru As Double, t1 As _
Double, t2 As Double, t3 As Double, t4 As Double, vb1 As Double, vb2 As Double, vb3 As Double,  _
vb4 As _
Double, Optional b2 As Variant) As Double
'mit    s1 = Schicht 1 Tiefe, tw = Tiefe Grundwasser, b1 = oberer Radius des Erdkegelsstumpfes
'        ru = unterer Radius des Erdkegelstumpfes, t1...t4 = einzelne Fund.höhen
'         vb1...vb4 = Betonvolumen 1...4, b2 = unterer Radius bei mehreren Schichten
Dim vol1 As Double, vol2 As Variant, Te2 As Double, Te3 As Double, Tges As Double
Dim vb1b2 As Double, vb1b3 As Double, vb1b4 As Double, p As Variant
Dim r1 As Variant, r2 As Variant, v1 As Variant, v2 As Variant
vol1 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * ru + ru ^ 2) * s1    'für Volumen Erde bei  _
Tges <= s1
vol2 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * b2 + b2 ^ 2) * s1    'für Volumen Erde bei  _
Tges > s1
Te2 = t1 + t2
Te3 = t1 + t2 + t3
Tges = t1 + t2 + t3 + t4
vb1b2 = vb1 + vb2
vb1b3 = vb1 + vb2 + vb3
vb1b4 = vb1 + vb2 + vb3 + vb4
r1 = (b1 - ru) / s1 * (s1 - tw) + ru        'unterer Radius auf Höhe Tw für Tges <= s1 ( _
Strahlensatz)
r2 = (b1 - b2) / s1 * (s1 - tw) + b2        'unterer Radius auf HöheTw für Tges > s1 ( _
Strahlensatz)
v1 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * r1 + r1 ^ 2)
v2 = WorksheetFunction.Pi / 3 * (b1 ^ 2 + b1 * r2 + r2 ^ 2)
'prozentualer Anteil p des Erdvolumens über Wasser im Fall tw < s1
If tw < s1 And s1 >= Tges Then p = v1 / vol1
If tw < s1 And s1 < Tges Then p = v2 / vol2
' Erdvolumen für den Bereich tges <= s1  und tges > s1 > t3
If s1 >= Tges And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol1 - vb1b4
If s1 >= Tges And tw < s1 Then _
Schicht1 = (vol1 - vb1b4) * p                            'anteiliges Volumen über Wasser
If (s1 < Tges And s1 > Te3) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b4 * s1 / Tges
If (s1 < Tges And s1 > Te3) And tw < s1 Then _
Schicht1 = (vol2 - vb1b4 * s1 / Tges) * p          'anteiliges Volumen über Wasser
' Erdvolumen für den Bereich t3 >= s1 > t2
If (s1 <= t3 And s1 > Te2) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b3 * s1 / t3
If (s1 <= t3 And s1 > Te2) And tw < s1 Then _
Schicht1 = (vol2 - vb1b3 * s1 / t3) * p              'anteiliges Volumen über Wasser
' Erdvolumen für den Bere
If (s1 <= t2 And s1 > t1) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1b2 * s1 / t2
If (s1 <= t2 And s1 > t1) And tw < s1 Then _
Schicht1 = (vol2 - vb1b2 * s1 / t2) * p               'anteiliges Volumen über Wasser
' Erdvolumen für den Bereich t1 >= s1 > 0
If (s1 <= t1 And s1 > 0) And (tw >= s1 Or tw = "-") Then _
Schicht1 = vol2 - vb1 * s1 / t1
If (s1 <= t1 And s1 > 0) And tw < s1 Then _
Schicht1 = (vol2 - vb1 * s1 / t1) * p              'anteiliges Volumen über Wasser
End Function
Ich habe alle Variablen in der Funktion, die von b2 abhängig sind, ebenfalls als Variant deklariert. Meines Erachtens nach sollte die Funktion jetzt eigentlich rechnen. Leider gibt er mit immer noch die Fehlermeldung #WERT! zurück. Hat vielleicht noch jemand eine Idee?

Anzeige
am besten mit Testdaten
30.03.2016 21:24:33
Michael
Hi Ali,
also, eines muß Dir klar sein: wenn tw ein TEXT (oder leer) ist, dann kann die Berechnung
r1 = (b1 - ru) / s1 * (s1 - tw) + ru

nicht hinhauen: hier müßte man eingangs erst Mal einen "validen" Wert zum Weiterrechnen erzeugen, z.B. mit
If IsEmpty(tw) Or (Not IsNumeric(tw)) Then
tw = 0
End If
Ob b2 übergeben wurde, ermittelst Du so:
If IsMissing(b2) Then b2 = 0
Wenn das alles nicht hilft, lad uns doch bitte mal ne Datei mit Beispielwerten hoch, dann kann man besser nachvollziehen, was passiert.
Grundsätzlich hast Du zwei Möglichkeiten: a) tw und b2 mit rechenbaren Werten belegen, falls nix Passendes übergeben wurde oder b) alle Formeln doppelt schreiben, einmal für vorhandene, einmal für nicht vorhandene Werte.
Schöne Grüße,
Michael

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige