Typen Unverträglichkeit

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Typen Unverträglichkeit
von: Fabian
Geschrieben am: 06.06.2015 05:45:34

Hallo liebes Forum,
bin gerade dabei die Schnittmenge von zwei Verteilungen zu approximieren. Leider wird mir als Fehler eine Typenunverträglichkeit (Variablen i, j) angezeigt. Bei anderen Verteilungen funktioniert es bereits. Nachdem zuerst ein ByRef Fehler kam, habe ich vor die betroffenen Variablen ein ByVal geschrieben. Leider finde ich keinen Fehler. Ich hoffe ihr könnt mir helfen.

Sub main()
Dim s(2) As Double
s(1) = 100
s(2) = 101
MsgBox TriSchnittmenge(80, 20, 69, 80, 101, s)
End Sub
Function TriSchnittmenge(mittelwert As Double, standardabw As Double, min As Double, most As  _
Double, tmax As Double, VorperiodeDaten() As Double) As Double
Dim z As Double
Dim step As Double
Dim max As Double
max = WorksheetFunction.max(VorperiodeDaten)
step = 1
i = min
z = 0
Do Until (i > max)
    If WorksheetFunction.Norm_Dist(ByVal i, mittelwert, standardabw, False) >= TriDist(ByVal i,  _
 _
min, most, tmax, False) Then
        For j = i To max
            If WorksheetFunction.Norm_Dist(ByVal j, mittelwert, standardabw, False) < TriDist(  _
_
ByVal j, min, most, tmax, False) Or j > max - step Or 0 = TriDist(ByVal j, min, most, tmax,  _
False) Or 0 = WorksheetFunction.Norm_Dist(ByVal j, mittelwert, standardabw, False) Then
                If z = 0 Then
                    j = j - step
                    x = TriDist(ByVal j, min, most, tmax, True)
                    i = j
                    Exit For
                Else
                    j = j - step
                    x = x + TriDist(ByVal j, min, most, tmax, True) - TriDist(z, min, most,  _
tmax, True)
                    i = j
                    Exit For
                End If
            End If
        Next j
    Else
        For j = i To max
            If WorksheetFunction.Norm_Dist(ByVal j, mittelwert, standardabw, False) >= TriDist(  _
_
ByVal j, min, most, tmax, False) Or j > max - step Or 0 = TriDist(ByVal j, min, most, tmax,  _
False) Or 0 = WorksheetFunction.Norm_Dist(ByVal j, mittelwert, standardabw, False) Then
                j = j - step
                x = x + WorksheetFunction.Norm_Dist(ByVal j, mittelwert, standardabw, True) -   _
_
WorksheetFunction.Norm_Dist(z, mittelwert, standardabw, True)
                i = j
                Exit For
            End If
        Next j
    End If
    z = i
    i = i + step
    If i > max Then
        Exit Do
    End If
Loop
TriSchnittmenge = x
End Function
Function TriDist(x As Double, min As Double, most As Double, max As Double, kum As Boolean) As   _
_
Double
Dim k As Integer
Dim result As Double
If kum = True Then
    For k = min To x
        If min <= k And k <= most Then
            result = result + (2 * (k - min)) / ((max - min) * (most - min))
        ElseIf most < k And k < max Then
            result = result + (2 * (max - k)) / ((max - min) * (max - most))
        End If
    Next k
Else
    If min <= x And x <= most Then
        result = (2 * (x - min)) / ((max - min) * (most - min))
    ElseIf most <= x And x <= max Then
        result = (2 * (max - x)) / ((max - min) * (max - most))
    End If
End If
TriDist = result
End Function

Bild

Betrifft: Sieh dir mal die Deklarationen an, ...
von: Luc:-?
Geschrieben am: 06.06.2015 11:20:58
…Fabian!
1. ByRef, ByVal gehören zur Deklaration der Argumente einer Fkt, also in deren Kopf, nicht in einen FktsAufruf! Fehlen sie dort, wird automatisch ByRef verwendet! Du hast also mit deiner „Korrektur“ nichts erreicht, da an falscher Stelle vorgenommen.
2. wurden nicht alle Variablen deklariert!
3. ist es ungünstig, das Ergebnis einer Fkt auf einen bestimmten Typ festzulegen. Auf diese Weise kann sie keinen Fehlerwert zurückgeben (in einer ZellFml kann sie in diesem Fall nur #WERT! liefern, hier liefert sie dann wahrscheinl 0!).
4. (nur Tipp!) kann man statt VorperiodeDaten() As Double auch ParamArray VorperiodeDaten() verwenden, was immer (wie hier) zuletzt notiert wdn muss und davor keine optionalen Argumente verträgt, da es selber Optional ist. Ein solches Array ist übrigens stets vom Typ Variant, weil es beliebig viele Elemente (Skalare, Vektoren, Matrizen, n-Tensoren) enthalten kann. UBound(VorperiodeDaten) ergäbe hier dann 0, weil nur 1 Element (als Vektor, sein 1.Element könnte mit VorperiodeDaten(0)(0) identifiziert wdn, was hier ja nicht nötig ist) übergeben wird. Wird nichts übergeben, ergibt UBound übrigens -1.
Tipp: Eine gut pgmierte Fkt (die nur Berechnungen durchführt) kann man als sog UDF auch in einer ZellFml einsetzen. Man muss sie nicht unbedingt aus einer SubProzedur aufrufen. Dabei muss aber beachtet wdn, dass Xl-Bereiche aus mehr als 1er Zelle (auch alle Vektoren) stets 2dimensional sind (VBA-Arrays sind dagg primär immer 1dimensional, wenn man sie nicht als n-dimensional deklariert/dimensioniert, auch die sog Arrays aus Arrays!).
Noch ein forumsspezifischer Hinweis: Gepostete PgmCodes sollte man stets selbst in pre-Tags einschließen, sonst macht das die Forums­Software und die geht dabei sehr formal vor. Dabei sollte man auch die Zeilenlängen beachten und die Zeilen ggf selber mit Leerzeichen_ umbrechen, damit keine Darstel­lungs­fehler auftreten (das steht sogar in den Frage­Formular-Hinweisen!).
Sonst ist mir auf den 1.Blick nichts weiter aufgefallen.
Gruß, Luc :-?

Bild

Betrifft: AW: Typen Unverträglichkeit
von: Fabian
Geschrieben am: 06.06.2015 14:49:07
Vielen Dank Luc:-? :)

Bild

Betrifft: Bitte sehr! ;-) owT
von: Luc:-?
Geschrieben am: 06.06.2015 15:08:56
:-?

 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA Blätter vorhanden?"