Thema Datum  Von Nutzer Rating
Antwort
Rot Übergabe von Arrays in verschiedene Funktionen
26.11.2025 20:08:12 Mira
NotSolved
26.11.2025 20:33:00 Gast3142
NotSolved
26.11.2025 20:56:07 xlKing
NotSolved
26.11.2025 23:41:47 Gast72886
NotSolved

Ansicht des Beitrags:
Von:
Mira
Datum:
26.11.2025 20:08:12
Views:
46
Rating: Antwort:
  Ja
Thema:
Übergabe von Arrays in verschiedene Funktionen

Hallo, ich habe ein Problem mit meinem Code in VBA, den ich im folgenden auch angebe. Und zwar bekomme ich für GET_ETA_MIX, GET_LAMBDA_MIX und GET_CP_MIX einzenln aufgerufen immer Werte, allerding erhaltre ich für GET_PRANDTL_MIX immer #NX. Ich habe schon auf verschiedenen wegen versuch den Fehler zu finden, bekomme es aber nicht hin dies ist der letzte Stand meines Codes, außerdem ist ganz unten noch meine letzte Debugg Ausgabe. Vielen Dank für eure Hilfe im Voraus.

'======================================================================
' THERMODYNAMISCHE BERECHNUNGEN FÜR REINSTOFFE UND GASGEMISCHE
'======================================================================
'
' Autor   : Mira
' Version : 2.5
' Datum   : 26.11.25
'
' Beschreibung:
'   Dieses VBA-Modul stellt Funktionen zur Berechnung thermophysikalischer
'   Stoffdaten von Gasen und Gasgemischen bereit. Grundlage sind
'   Shomate-Gleichungen (NIST-Daten) und empirische Korrelationen aus dem VDI Wärmeatlas.
'
'   Bereitgestellt werden u.a.:
'     - Molare Masse
'     - Cp, Enthalpie und Delta-H
'     - Dichte
'     - Dynamische Viskosität
'     - Wärmeleitfähigkeit
'     - Mischungsregeln (Wilke, Mason-Saxena)
'     - Prandtl-Zahl
'
'======================================================================
' KONSTANTEN
'======================================================================

Public Const R_UNIV As Double = 8.314462618
' Universelle Gaskonstante [J/mol·K]

'======================================================================
' MOLARE MASSE FÜR EINZELKOMPONENTEN
'======================================================================
'
' Funktion: GET_MOLAR_MASS(species)
'
' Beschreibung:
'   Gibt die molare Masse eines Stoffes in [kg/mol] zurück.
'
' Eingabe:
'   species : String – chemische Formel (z.B. "CO2", "N2", "H2O")
'
' Ausgabe:
'   molare Masse [kg/mol]
'
'======================================================================

Public Function GET_MOLAR_MASS(ByVal species As String) As Double
    Select Case UCase(species)
        Case "H2": GET_MOLAR_MASS = 0.00202
        Case "O2": GET_MOLAR_MASS = 0.032
        Case "N2": GET_MOLAR_MASS = 0.02801
        Case "CO": GET_MOLAR_MASS = 0.02801
        Case "CO2": GET_MOLAR_MASS = 0.04401
        Case "H2O": GET_MOLAR_MASS = 0.01802
        Case "CH4": GET_MOLAR_MASS = 0.01604
        Case "NO": GET_MOLAR_MASS = 0.03001
        Case "NO2": GET_MOLAR_MASS = 0.04601
        Case "N2O4": GET_MOLAR_MASS = 0.09201
        Case "SO2": GET_MOLAR_MASS = 0.06406
        Case "AR": GET_MOLAR_MASS = 0.03995
        Case Else: GET_MOLAR_MASS = CVErr(xlErrNA)
    End Select
End Function

'======================================================================
' DICHTE EINES REINSTOFFS [kg/m³]
'======================================================================
'
' Funktion: GET_RHO(T, p, species)
'
' Beschreibung:
'   Berechnet die Dichte eines idealen Gases über das ideale Gasgesetz:
'       rho = p * M / (R * T)
'
' Eingabe:
'   T       : Temperatur [K]
'   p       : Druck [Pa]
'   species : String – Stoffname
'
' Ausgabe:
'   Dichte [kg/m³]
'
'======================================================================

Public Function GET_RHO(T As Double, p As Double, species As String) As Variant
    On Error GoTo ErrHandler
    Dim M As Double
    M = GET_MOLAR_MASS(species)
    GET_RHO = p * M / (R_UNIV * T)
    Exit Function
ErrHandler:
    GET_RHO = CVErr(xlErrNA)
End Function

'======================================================================
' VISKOSITÄT [Pa·s]
'======================================================================
'
' Funktion: GET_ETA(T, species)
'
' Beschreibung:
'   Empirische Korrelation zur Temperaturabhängigkeit der
'   dynamischen Viskosität.
'
' Eingabe:
'   T       : Temperatur [K]
'   species : Stoffname
'
' Ausgabe:
'   eta [Pa·s]
'
'======================================================================
Public Function GET_ETA(T As Double, ByVal species As String) As Variant
    On Error GoTo ErrHandler
    Dim A As Double, B As Double, c As Double, D As Double, E As Double
    Select Case UCase(species)
        Case "H2": A = 0.18024: B = 0.27174: c = -0.13395: D = 0.00585: E = -0.00104
        Case "O2": A = -0.10257: B = 0.92625: c = -0.80657: D = 0.05113: E = -0.01295
        Case "N2": A = -0.0102: B = 0.74785: c = -0.59037: D = 0.0323: E = -0.00673
        Case "CO": A = 0.01384: B = 0.74306: c = -0.62996: D = 0.03948: E = -0.01032
        Case "CO2": A = -0.18024: B = 0.65989: c = -0.37108: D = 0.01586: E = -0.003
        Case "H2O": A = 0.64966: B = -0.15102: c = 1.15935: D = -0.1008: E = 0.031
        Case "CH4": A = -0.07759: B = 0.50484: c = -0.43101: D = 0.03118: E = -0.00981
        Case "NO": A = -0.09105: B = 0.84998: c = -0.71473: D = 0.0424: E = -0.0102
        Case "NO2": A = -2.28505: B = 1.75834: c = -2.29768: D = 0.17134: E = -0.0492
        Case "N2O4": A = -0.08683: B = 0.6745: c = -0.12834
        Case "SO2": A = -0.13559: B = 0.5123: c = -0.11626
        Case "AR": A = 0.16196: B = 0.81279: c = -0.41263: D = 0.01668: E = -0.00276
        Case Else: GET_ETA = CVErr(xlErrNA): Exit Function
    End Select

    A = A * 10 ^ -5
    B = B * 10 ^ -7
    c = c * 10 ^ -10
    D = D * 10 ^ -12
    E = E * 10 ^ -15

    GET_ETA = A + B * T + c * T ^ 2 + D * T ^ 3 + E * T ^ 4
    Exit Function
ErrHandler:
    GET_ETA = CVErr(xlErrNA)
End Function

'======================================================================
' WÄRMELEITFÄHIGKEIT [W/m·K]
'======================================================================
'
' Funktion: GET_LAMBDA(T, species)
'
' Beschreibung:
'   Temperaturabhängige Wärmeleitfähigkeit nach empirischen
'   Polynomfunktionen.
'
' Eingabe:
'   T       : Temperatur [K]
'   species : Stoffname
'
' Ausgabe:
'   lambda [W/m·K]
'
'======================================================================
Public Function GET_LAMBDA(T As Double, ByVal species As String) As Variant
    On Error GoTo ErrHandler
    Dim A As Double, B As Double, c As Double, D As Double, E As Double
    Select Case UCase(species)
        Case "H2": A = 0.651: B = 0.7673: c = -0.68705: D = 0.50651: E = -0.13854
        Case "O2": A = -1.285: B = 0.10655: c = -0.05263: D = 0.02568: E = -0.00504
        Case "N2": A = -0.133: B = 0.10149: c = -0.06065: D = 0.03361: E = -0.0071
        Case "CO": A = -0.783: B = 0.10317: c = -0.06759: D = 0.03945: E = -0.00947
        Case "CO2": A = -3.882: B = 0.05283: c = 0.07146: D = -0.07031: E = 0.01809
        Case "H2O": A = 13.918: B = -0.04699: c = 0.258066: D = -0.183149: E = 0.055092
        Case "CH4": A = 8.154: B = 0.00811: c = 0.35153: D = -0.33865: E = 0.14092
        Case "NO": A = 0.144: B = 0.09295: c = -0.02601
        Case "NO2": A = 66.085: B = -0.47937: c = 1.01124
        Case "N2O4": A = 66.085: B = -0.47937: c = 1.01124
        Case "SO2": A = 0.358: B = 0.01312: c = 0.06952: D = -0.03207: E = -0.0083
        Case "AR": A = 4.303: B = 0.04728: c = -0.00778
        Case Else: GET_LAMBDA = CVErr(xlErrNA): Exit Function
    End Select

    A = A * 10 ^ -3
    B = B * 10 ^ -3
    c = c * 10 ^ -6
    D = D * 10 ^ -9
    E = E * 10 ^ -12

    GET_LAMBDA = A + B * T + c * T ^ 2 + D * T ^ 3 + E * T ^ 4
    Exit Function
ErrHandler:
    GET_LAMBDA = CVErr(xlErrNA)
End Function

'======================================================================
' SHOMATE-KOEFFIZIENTEN
'======================================================================
'
' Sub: GET_SHOMATE_COEFF(species, T, A, B, C, D, E, F)
'
' Beschreibung:
'   Liefert die temperaturabhängigen Shomate-Koeffizienten für den
'   angegebenen Stoff gemäß NIST-Datenbank.
'
'======================================================================
Private Sub GET_SHOMATE_COEFF(species As String, T As Double, _
                              ByRef A As Double, ByRef B As Double, ByRef c As Double, _
                              ByRef D As Double, ByRef E As Double, ByRef F As Double)

    ' Initialisieren
    A = 0: B = 0: c = 0: D = 0: E = 0: F = 0: G = 0
    
    Select Case UCase(species)
        '------------------------------------------
        ' Kohlenmonoxid CO
        '------------------------------------------
        Case "CO"
            If T >= 298 And T <= 1300 Then
                A = 25.56759: B = 6.09613: c = 4.054656: D = -2.671301: E = 0.131021: F = -118.0089: G = 227.3665: H = -110.5271
            ElseIf T > 1300 And T <= 6000 Then
                A = 35.1507: B = 1.300095: c = -0.205921: D = 0.01355: E = -3.28278: F = -127.8375: G = 231.712: H = -110.5271
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Kohlendioxid CO2
        '------------------------------------------
        Case "CO2"
            If T >= 298 And T <= 1200 Then
                A = 24.99735: B = 55.18696: c = -33.69137: D = 7.948387: E = -0.136638: F = -403.6075: G = 228.2431: H = -393.5224
            ElseIf T > 1200 And T <= 6000 Then
                A = 58.16639: B = 2.720074: c = -0.492289: D = 0.038844: E = -6.447293: F = -425.9186: G = 263.6125: H = -393.5224
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
        
        '------------------------------------------
        ' Wasserstoff H2
        '------------------------------------------
        Case "H2"
            If T >= 298 And T <= 1000 Then
                A = 33.066178: B = -11.363417: c = 11.432816: D = -2.772874: E = -0.158558: F = -9.980797: G = 172.707974: H = 0
            ElseIf T > 1000 And T <= 2500 Then
                A = 18.563083: B = 12.257357: c = -2.859786: D = 0.268238: E = 1.97799: F = -1.147438: G = 156.288133: H = 0
            ElseIf T > 2500 And T <= 6000 Then
                A = 43.41356: B = -4.293079: c = 1.272428: D = -0.09876: E = -20.53386: F = -38.515158: G = 0
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Wasser H2O
        '------------------------------------------
        Case "H2O"
            If T >= 500 And T <= 1700 Then
                A = 30.092: B = 6.832514: c = 6.793435: D = -2.53448: E = 0.082139: F = -250.881: G = 223.3967: H = -241.8264
            ElseIf T > 1700 And T <= 6000 Then
                A = 41.96426: B = 8.622053: c = -1.49978: D = 0.098119: E = -11.15764: F = -272.1797: G = 219.7809: H = -241.8264
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Sauerstoff O2
        '------------------------------------------
        Case "O2"
            If T >= 100 And T <= 700 Then
                A = 31.32234: B = -20.23531: c = 57.86644: D = -36.50624: E = -0.007374: F = -8.903471: G = 246.7945: H = 0
            ElseIf T > 700 And T <= 2000 Then
                A = 30.03235: B = 8.772972: c = -3.988133: D = 0.788313: E = -0.741599: F = -11.32468: G = 236.1663: H = 0
            ElseIf T > 2000 And T <= 6000 Then
                A = 20.91111: B = 10.72071: c = -2.020498: D = 0.146449: E = 9.245722: F = 5.337651: G = 237.6185: H = 0
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Stickstoff N2
        '------------------------------------------
        Case "N2"
            If T >= 100 And T <= 500 Then
                A = 28.98641: B = 1.853978: c = -9.647459: D = 16.63537: E = 0.000117: F = -8.671914: G = 226.4168: H = 0
            ElseIf T > 500 And T <= 2000 Then
                A = 19.50583: B = 19.88705: c = -8.598535: D = 1.369784: E = 0.527601: F = -4.935202: G = 212.39: H = 0
            ElseIf T > 2000 And T <= 6000 Then
                A = 35.51872: B = 1.128728: c = -0.196103: D = 0.014662: E = -4.55376: F = -18.97091: G = 224.981: H = 0
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Stickstoffmonoxid NO
        '------------------------------------------
        Case "NO"
            If T >= 298 And T <= 1200 Then
                A = 23.83491: B = 12.58878: c = -1.139011: D = -1.497459: E = 0.214194: F = 83.35783: G = 237.1219: H = 90.29114
            ElseIf T > 1200 And T <= 6000 Then
                A = 35.99169: B = 0.95717: c = -0.148032: D = 0.009974: E = -3.004088: F = 73.10787: G = 246.1619: H = 90.29114
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
            
        '------------------------------------------
        ' Stickstoffdioxid NO2
        '------------------------------------------
        Case "NO2"
            If T >= 298 And T <= 1200 Then
                A = 16.10857: B = 75.89525: c = -54.3874: D = 14.30777: E = 0.239423: F = 26.17464: G = 240.5386: H = 33.09502
            ElseIf T > 1200 And T <= 6000 Then
                A = 56.82541: B = 0.738053: c = -0.144721: D = 0.009777: E = -5.459911: F = 2.846456: G = 290.5056: H = 33.09502
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
            
        '------------------------------------------
        ' Schwefeldioxid SO2
        '------------------------------------------
        Case "SO2"
            If T >= 298 And T <= 1200 Then
                A = 21.43049: B = 74.35094: c = -57.75217: D = 16.35534: E = 0.086731: F = -305.7688: G = 254.8872: H = -296.8422
            ElseIf T > 1200 And T <= 6000 Then
                A = 57.48188: B = 1.009328: c = -0.07629: D = 0.005174: E = -4.045401: F = -324.414: G = 302.7798: H = -296.8422
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
        
        '------------------------------------------
        ' Argon AR
        '------------------------------------------
        Case "AR"
            If T >= 298 And T <= 6000 Then
                A = 20.786: B = 0.0000002825911: c = -0.0000001464191: D = 0.000000010921331: E = -0.00000003661371: F = -6.19735: G = 179.999: H = 0
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
              
        '------------------------------------------
        ' Distickstofftetroxid N2O4
        '------------------------------------------
        Case "N2O4"
            If T >= 500 And T <= 1000 Then
                A = 34.05274: B = 191.9845: c = -151.0575: D = 44.3935: E = -0.158949: F = -8.893428: G = 293.7724: H = 9.078988
            ElseIf T > 1000 And T <= 6000 Then
                A = 128.622: B = 2.524345: c = -0.520883: D = 0.03663: E = -11.55704: F = -59.22619: G = 417.0444: H = 9.078988
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If
              
        '------------------------------------------
        ' Methan CH4
        '------------------------------------------
        Case "CH4"
            If T >= 298 And T <= 1300 Then
                A = -0.703029: B = 108.4773: c = -42.52157: D = 5.862788: E = 0.678565: F = -76.84376: G = 158.7163: H = -74.8731
            ElseIf T > 1300 And T <= 6000 Then
                A = 85.81217: B = 11.26467: c = -2.114146: D = 0.13819: E = -26.42221: F = -153.5327: G = 224.4143: H = -74.8731
            Else
                Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
            End If

        '------------------------------------------
        ' Standard-Fall: unbekannter Stoff
        '------------------------------------------
        Case Else
            A = 0: B = 0: c = 0: D = 0: E = 0: F = 0
            
    End Select
End Sub

'======================================================================
' WÄRMEKAPAZITÄT CP [J/kg·K]
'======================================================================
'
' Funktion: GET_CP(T, species)
'
' Beschreibung:
'   Berechnet die spezifische Wärmekapazität auf Massenbasis.
'
' Eingabe:
'   T       : Temperatur [K]
'   species : Stoffname
'
' Ausgabe:
'   cp [J/kg·K]
'
'======================================================================
Public Function GET_CP(T As Double, ByVal species As String) As Variant
    On Error GoTo ErrHandler
    Dim A As Double, B As Double, c As Double, D As Double, E As Double, F As Double
    Dim Tred As Double

    Tred = T / 1000
    Call GET_SHOMATE_COEFF(species, T, A, B, c, D, E, F)

    If A = 0 And B = 0 Then
        GET_CP = CVErr(xlErrNA)
        Exit Function
    End If

    cp = A + B * Tred + c * Tred ^ 2 + D * Tred ^ 3 + E / (Tred ^ 2)
    M = GET_MOLAR_MASS(species)
    GET_CP = cp / M
    Exit Function

ErrHandler:
    GET_CP = CVErr(xlErrNA)
End Function

'======================================================================
' MOLARE ENTHALPIE NACH DER SHOMATE-GLEICHUNG [J/mol]
'======================================================================
'
' Funktion: GET_H(T, species)
'
' Beschreibung:
'   Berechnet die molare Enthalpie H eines Reinstoffs in [J/mol]
'   nach der Shomate-Gleichung. Die Shomate-Koeffizienten werden
'   temperaturabhängig über GET_SHOMATE_COEFF bestimmt.
'
' Eingabe:
'   T        : Temperatur [K]
'   species  : Stoffbezeichnung (z. B. "CO2", "H2O", "O2", ...)
'
' Ausgabe:
'   H        : Molare Enthalpie [J/mol]
'
' Quelle:
'   NIST Chemistry WebBook – Shomate Equation
'
' Beispiel:
'   H = GET_H(1000, "CO2")
'
'======================================================================

Public Function GET_H(T As Double, ByVal species As String) As Variant
    On Error GoTo ErrHandler
    Dim A As Double, B As Double, c As Double, D As Double, E As Double, F As Double
    Dim Tred As Double
    Dim H As Double

    Tred = T / 1000
    Call GET_SHOMATE_COEFF(species, T, A, B, c, D, E, F)

    ' Shomate-Gleichung: H [kJ/mol]
    H = A * Tred + B * Tred ^ 2 / 2 + c * Tred ^ 3 / 3 + D * Tred ^ 4 / 4 - E / Tred + F

    GET_H = H * 1000
    Exit Function

ErrHandler:
    GET_H = CVErr(xlErrNA)
End Function


'======================================================================
' DELTA-ENTHALPIE delta_H GEGEN 298,15 K [J/mol]
'======================================================================
'
' Funktion: GET_DELTA_H(T, species)
'
' Beschreibung:
'   Berechnet die molare Enthalpiedifferenz delta_H = H(T) - H(298,15 K)
'   in [J/mol] unter Verwendung der Shomate-Gleichung.
'
' Eingabe:
'   T        : Temperatur [K]
'   species  : Stoffbezeichnung (z. B. "CO2", "H2O", "O2", ...)
'
' Ausgabe:
'   delta_H       : Enthalpiedifferenz [J/mol]
'
' Beispiel:
'   dH = GET_DELTA_H(1000, "H2O")
'
'======================================================================

Public Function GET_DELTA_H(T As Double, species As String) As Variant
    On Error GoTo ErrHandler
    Dim H_T As Double, H_ref As Double

    H_T = GET_H(T, species)
    
    If UCase(species) = "H2O" Then
        ' setzt referenztemperatur manuel
        H_ref = -241826
    Else
        ' Standard-Shomate-Referenz
        H_ref = GET_H(298.15, species)
    End If
    
    GET_DELTA_H = H_T - H_ref
    Exit Function

ErrHandler:
    GET_DELTA_H = CVErr(xlErrNA)
End Function


'======================================================================
' PRANDTL-ZAHL FÜR REINSTOFFE [-]
'======================================================================
'
' Funktion: GET_PR(T, species)
'
' Beschreibung:
'   Berechnet die dimensionslose Prandtl-Zahl eines Gases:
'
'       Pr = (cp * eta) / lambda
'
'   Dabei sind alle Größen auf Massenbasis:
'     cp [J/kg·K], eta [Pa·s], lambda [W/m·K]
'
' Eingabe:
'   T        : Temperatur [K]
'   species  : Stoffbezeichnung (z. B. "CO2", "O2", "N2", ...)
'
' Ausgabe:
'   Pr       : Prandtl-Zahl [-]
'
' Beispiel:
'   Pr = GET_PR(500, "CO2")
'
'======================================================================

Public Function GET_PR(T As Double, ByVal species As String) As Variant
    On Error GoTo ErrHandler
    Dim cp As Double, eta As Double, lam As Double

    cp = GET_CP(T, species)          ' [J/kg·K]
    eta = GET_ETA(T, species)        ' [Pa·s]
    lam = GET_LAMBDA(T, species)     ' [W/m·K]

    GET_PR = (cp * eta) / lam
    Exit Function

ErrHandler:
    GET_PR = CVErr(xlErrNA)
End Function


Public Function To1DArray(v As Variant) As Variant
    Dim arr() As Variant
    Dim r As Long, c As Long, n As Long

    ' Falls kein Array ? einfach in Array packen
    If Not IsArray(v) Then
        To1DArray = Array(v)
        Exit Function
    End If

    ' zweidimensionales Excel-Range-Array?
    If (LBound(v, 1) = 1 And LBound(v, 2) = 1) Then
        ' Bestimme Dimension
        If UBound(v, 1) > 1 And UBound(v, 2) = 1 Then
            ' Spaltenvektor
            ReDim arr(1 To UBound(v, 1))
            For r = 1 To UBound(v, 1)
                arr(r) = v(r, 1)
            Next r
            To1DArray = arr
            Exit Function
        ElseIf UBound(v, 2) > 1 And UBound(v, 1) = 1 Then
            ' Zeilenvektor
            ReDim arr(1 To UBound(v, 2))
            For c = 1 To UBound(v, 2)
                arr(c) = v(1, c)
            Next c
            To1DArray = arr
            Exit Function
        End If
    End If

    ' bereits 1D? ? direkt zurückgeben
    If UBound(v) >= LBound(v) Then
        To1DArray = v
    Else
        To1DArray = Array(v)
    End If
End Function



'-----------------------------------------------------------
' MOLARE MASSE VON GEMISCHEN [kg/mol]
'-----------------------------------------------------------
Public Function GET_MOLAR_MASS_MIX(speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long
    Dim lb As Long, ub As Long
    Dim Mmix As Double
    
    ' Bereinigung des Arrays
    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)
    
    ' Grenzen des Arrays ermitteln
    lb = LBound(speciesList)
    ub = UBound(speciesList)
    
    ' Schleife über die tatsächlichen Indizes
    For i = lb To ub
        Mmix = Mmix + yList(i) * GET_MOLAR_MASS(speciesList(i))
    Next i
    
    GET_MOLAR_MASS_MIX = Mmix
    Exit Function

ErrHandler:
    GET_MOLAR_MASS_MIX = CVErr(xlErrNA)
End Function


'======================================================================
' DICHTE VON GEMISCHEN [kg/m³]
'======================================================================
'
' Funktion: GET_RHO_MIX(T, P, speciesList, yList)
'
' Beschreibung:
'   Berechnet die Dichte eines idealen Gasgemisches [kg/m³] nach dem
'   idealen Gasgesetz. Die Berechnung erfolgt unter Annahme eines
'   idealen Gases mit bekannter Temperatur, Druck und Zusammensetzung
'   (Molanteile der Komponenten).
'
' Formel:
'   rho_mix = p * M_mix / (R_univ * T)
'
'   wobei:
'       p      = Druck [Pa]
'       M_mix  = mittlere molare Masse des Gemisches [kg/mol]
'       R_univ = universelle Gaskonstante [J/mol·K]
'       T      = Temperatur [K]
'
' Eingabe:
'   T           - Temperatur [K]
'   p           - Druck [Pa]
'   speciesList - Array der Stoffnamen (z. B. {"N2", "O2", "CO2"})
'   yList       - Array der Molanteile der jeweiligen Komponenten [-]
'
' Ausgabe:
'   GET_RHO_MIX - Dichte des Gasgemisches [kg/m³]
'
' Hinweise:
'   - Die Molanteile (yList) müssen sich zu 1 aufsummieren.
'   - Die Funktion nutzt intern GET_MOLAR_MASS_MIX zur Ermittlung der
'     mittleren molaren Masse.
'   - Rückgabe: CVErr(xlErrNA), falls Eingaben ungültig oder
'     Berechnung fehlschlägt.
'
' Beispiel:
'   =GET_RHO_MIX(300; 101325; {"N2"; "O2"}; {0.79; 0.21})
'
'======================================================================

Public Function GET_RHO_MIX(T As Double, p As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, M_mix As Double, yi As Double, species As String
    Dim r As Double, rho_mix As Double
    
    ' Bereinigung des Arrays
    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    r = 8.31446261815324 ' J/mol/K

    For i = LBound(speciesList) To UBound(speciesList)
        species = CStr(speciesList(i))
        yi = CDbl(yList(i))
        M_mix = M_mix + yi * GET_MOLAR_MASS(species)
    Next i

    rho_mix = (p * M_mix) / (r * T)
    GET_RHO_MIX = rho_mix
    Exit Function

ErrHandler:
    GET_RHO_MIX = CVErr(xlErrNA)
End Function



'======================================================================
' MISCHUNGSVISKOSITÄT NACH WILKE [Pa·s]
'======================================================================
'
' Funktion: GET_ETA_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die dynamische Viskosität eines Gasgemisches
'   nach der Wilke-Mischungsregel:
'
'       eta_mix = S [ y_i * eta_i / (S y_j * F_ij) ]
'
'   mit:
'       F_ij = [ 1 + (eta_i/eta_j)^(1/2) * (M_j/M_i)^(1/4) ]² /
'               [ v(8 * (1 + M_i/M_j)) ]
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array mit Stoffnamen
'   yList       : Molanteile der Komponenten
'
' Ausgabe:
'   eta_mix     : Dynamische Viskosität [Pa·s]
'
' Beispiel:
'   eta_mix = GET_ETA_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_ETA_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, j As Long
    Dim eta() As Double, M() As Double, Phi() As Double
    Dim denom As Double, sumOuter As Double

    ' 1) Normalisieren der Eingaben in 1D-Arrays
    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    ' 2) sichere Grenzen verwenden
    Dim lb As Long, ub As Long
    lb = LBound(speciesList): ub = UBound(speciesList)

    ReDim eta(lb To ub)
    ReDim M(lb To ub)
    ReDim Phi(lb To ub, lb To ub)

    sumOuter = 0#

    ' 3) Einzelwerte ermitteln und auf Errors prüfen
    For i = lb To ub
        Dim tmpEta As Variant, tmpM As Variant, yi As Double

        Debug.Print "speciesList("; i; ") = "; speciesList(i)
        Debug.Print "yList("; i; ") = "; yList(i)

        tmpEta = GET_ETA(T, CStr(speciesList(i)))
        Debug.Print "GET_ETA = "; tmpEta

        If VarType(tmpEta) = vbError Then
            GET_ETA_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        eta(i) = CDbl(tmpEta)

        tmpM = GET_MOLAR_MASS(CStr(speciesList(i)))
        If VarType(tmpM) = vbError Then
            GET_ETA_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        M(i) = CDbl(tmpM)

        ' yList-Eintrag prüfen und konvertieren
        If VarType(yList(i)) = vbError Then
            GET_ETA_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        On Error Resume Next
        Dim s As String
        s = CStr(yList(i))
        s = Replace(s, ",", ".")    ' lokales Dezimalzeichen normalisieren
        yi = CDbl(s)

        If Err.Number <> 0 Then
            Debug.Print "Fehler in CDbl(yList("; i; ")) ? "; yList(i)
            Err.Clear
            On Error GoTo ErrHandler
    GET_ETA_MIX = CVErr(xlErrNA)
    Exit Function
End If
On Error GoTo ErrHandler
        ' optional: du könntest hier prüfen, ob yi >= 0
    Next i

    ' 4) Phi-Matrix bilden (Wilke)
    For i = lb To ub
        For j = lb To ub
            If i = j Then
                Phi(i, j) = 1#
            Else
                ' zusätzliche Sicherheitsprüfungen gegen Division durch 0
                If eta(j) = 0 Or M(i) = 0 Or M(j) = 0 Then
                    GET_ETA_MIX = CVErr(xlErrDiv0)
                    Exit Function
                End If
                Debug.Print "Phi("; i; ","; j; ") inputs: eta(i)="; eta(i); " eta(j)="; eta(j); " M(i)="; M(i); " M(j)="; M(j)
                Phi(i, j) = ((1# + Sqr(eta(i) / eta(j)) * (M(j) / M(i)) ^ 0.25) ^ 2) / _
                            (Sqr(8# * (1# + M(i) / M(j))))
            End If
        Next j
    Next i

    ' 5) Wilke-Summe
    For i = lb To ub
        denom = 0#
        For j = lb To ub
            denom = denom + CDbl(yList(j)) * Phi(i, j)
        Next j
        If denom = 0# Then
            GET_ETA_MIX = CVErr(xlErrDiv0)
            Exit Function
        End If
        sumOuter = sumOuter + CDbl(yList(i)) * eta(i) / denom
    Next i

    GET_ETA_MIX = sumOuter
    Exit Function

ErrHandler:
    GET_ETA_MIX = CVErr(xlErrNA)
End Function





'======================================================================
' MISCHUNGSWÄRMELEITFÄHIGKEIT NACH Wassiljeva-MASON–SAXENA [W/m·K]
'======================================================================
'
' Funktion: GET_LAMBDA_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die Wärmeleitfähigkeit eines Gasgemisches nach
'   der Methode von Wassiljeva-Mason-Saxena, analog zur Wilke-Formel:
'
'       lambda_mix = S [ y_i * lambda_i / (S y_j * psi_ij) ]
'
'   mit:
'       psi_ij = [ 1 + (labda_i/lambda_j)^(1/2) * (M_j/M_i)^(1/4) ]² /
'               [ v(8 * (1 + M_i/M_j)) ]
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array mit Stoffnamen
'   yList       : Molanteile der Komponenten
'
' Ausgabe:
'   lambda_mix  : Wärmeleitfähigkeit [W/m·K]
'
' Beispiel:
'   lambda_mix = GET_LAMBDA_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_LAMBDA_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, j As Long
    Dim lam() As Double, M() As Double, Psi() As Double
    Dim denom As Double, sumOuter As Double

    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    Dim lb As Long, ub As Long
    lb = LBound(speciesList): ub = UBound(speciesList)

    ReDim lam(lb To ub)
    ReDim M(lb To ub)
    ReDim Psi(lb To ub, lb To ub)

    sumOuter = 0#

    ' Einzelwerte ermitteln und prüfen
    For i = lb To ub
        Dim tmpLam As Variant, tmpM As Variant
        tmpLam = GET_LAMBDA(T, CStr(speciesList(i)))
        If VarType(tmpLam) = vbError Then
            GET_LAMBDA_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        lam(i) = CDbl(tmpLam)

        tmpM = GET_MOLAR_MASS(CStr(speciesList(i)))
        If VarType(tmpM) = vbError Then
            GET_LAMBDA_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        M(i) = CDbl(tmpM)
    Next i

    ' Psi-Matrix berechnen (analog Mason–Saxena)
    For i = lb To ub
        For j = lb To ub
            If i = j Then
                Psi(i, j) = 1#
            Else
                If lam(j) = 0 Or M(i) = 0 Or M(j) = 0 Then
                    GET_LAMBDA_MIX = CVErr(xlErrDiv0)
                    Exit Function
                End If
                Psi(i, j) = ((1# + Sqr(lam(i) / lam(j)) * (M(j) / M(i)) ^ 0.25) ^ 2) / _
                            (Sqr(8# * (1# + M(i) / M(j))))
            End If
        Next j
    Next i

    ' Mason–Saxena-Summe
    For i = lb To ub
        denom = 0#
        For j = lb To ub
            denom = denom + CDbl(yList(j)) * Psi(i, j)
        Next j
        If denom = 0# Then
            GET_LAMBDA_MIX = CVErr(xlErrDiv0)
            Exit Function
        End If
        sumOuter = sumOuter + CDbl(yList(i)) * lam(i) / denom
    Next i

    GET_LAMBDA_MIX = sumOuter
    Exit Function

ErrHandler:
    GET_LAMBDA_MIX = CVErr(xlErrNA)
End Function


'======================================================================
' WÄRMEKAPAZITÄT EINES GASGEMISCHES [J/kg·K]
'======================================================================
'
' Funktion: GET_CP_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die massenspezifische Wärmekapazität eines idealen
'   Gasgemisches als molbruchgewichtetes Mittel der Einzelstoffe:
'
'       cp_mix = S y_i * cp_i
'
'   wobei cp_i [J/kg·K] durch GET_CP bestimmt wird.
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array der Komponenten (z. B. {"CO2","H2O","N2"})
'   yList       : Molanteile der Komponenten (Summe = 1)
'
' Ausgabe:
'   cp_mix      : Massenbezogene Wärmekapazität [J/kg·K]
'
' Beispiel:
'   cp_mix = GET_CP_MIX(900, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_CP_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, lb As Long, ub As Long
    Dim cp_mix As Double
    cp_mix = 0#

    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    lb = LBound(speciesList): ub = UBound(speciesList)

    For i = lb To ub
        Dim tmpCp As Variant
        tmpCp = GET_CP(T, CStr(speciesList(i)))
        If VarType(tmpCp) = vbError Then
            GET_CP_MIX = CVErr(xlErrNA)
            Exit Function
        End If
        cp_mix = cp_mix + CDbl(yList(i)) * CDbl(tmpCp)
    Next i

    GET_CP_MIX = cp_mix
    Exit Function

ErrHandler:
    GET_CP_MIX = CVErr(xlErrNA)
End Function


'======================================================================
' MOLARE ENTHALPIE EINES GASGEMISCHES [J/mol]
'======================================================================
'
' Funktion: GET_H_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die molare Enthalpie eines idealen Gasgemisches
'   aus den molaren Anteilen und den Einzel-Enthalpien:
'
'       H_mix = S y_i * H_i(T)
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array der Komponenten (z. B. {"CO2", "H2O", "N2"})
'   yList       : Molanteile der Komponenten (Summe = 1)
'
' Ausgabe:
'   H_mix       : Molare Enthalpie [J/mol]
'
' Beispiel:
'   Hmix = GET_H_MIX(1000, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_H_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, n As Long
    Dim Hmix As Double
    
    ' Bereinigung des Arrays
    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    n = UBound(speciesList) - LBound(speciesList) + 1
    For i = 1 To n
        Hmix = Hmix + yList(i) * GET_H(T, speciesList(i))
    Next i

    GET_H_MIX = Hmix
    Exit Function

ErrHandler:
    GET_H_MIX = CVErr(xlErrNA)
End Function


'======================================================================
' DELTA-ENTHALPIE delta_H EINES GASGEMISCHES [J/mol]
'======================================================================
'
' Funktion: GET_DELTA_H_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die Enthalpiedifferenz delta_H eines Gasgemisches relativ
'   zu 298,15 K über:
'
'       delta_H_mix = S y_i * [H_i(T) - H_i(298,15 K)]
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array der Komponenten
'   yList       : Molanteile der Komponenten
'
' Ausgabe:
'   delta_H_mix      : Enthalpiedifferenz des Gemisches [J/mol]
'
' Beispiel:
'   dHmix = GET_DELTA_H_MIX(1200, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_DELTA_H_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    On Error GoTo ErrHandler
    Dim i As Long, n As Long
    Dim dHmix As Double
    
    ' Bereinigung des Arrays
    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    n = UBound(speciesList) - LBound(speciesList) + 1
    For i = 1 To n
        dHmix = dHmix + yList(i) * GET_DELTA_H(T, speciesList(i))
    Next i

    GET_DELTA_H_MIX = dHmix
    Exit Function

ErrHandler:
    GET_DELTA_H_MIX = CVErr(xlErrNA)
End Function


'======================================================================
' PRANDTL-ZAHL FÜR GASGEMISCHE [-]
'======================================================================
'
' Funktion: GET_PR_MIX(T, speciesList, yList)
'
' Beschreibung:
'   Berechnet die dimensionslose Prandtl-Zahl eines Gasgemisches über:
'
'       Pr_mix = (cp_mix * eta_mix) / lambda_mix
'
'   Dabei:
'     cp_mix [J/kg·K]   – Molenbruch-gewichtete Wärmekapazität
'     eta_mix [Pa·s]      – Mischungsviskosität (Wilke)
'     lambda_mix [W/m·K]     – Mischungswärmeleitfähigkeit (Mason–Saxena)
'
' Eingabe:
'   T           : Temperatur [K]
'   speciesList : Zell-Array der Komponenten
'   yList       : Molanteile (Summe = 1)
'
' Ausgabe:
'   Pr_mix      : Prandtl-Zahl [-]
'
' Beispiel:
'   Pr_mix = GET_PR_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================

Public Function GET_PRANDTL_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
    
    On Error GoTo ErrHandler

    Dim eta_mix As Variant
    Dim lambda_mix As Variant
    Dim cp_mix As Variant
    Dim Pr As Double

    Debug.Print "---- GET_PRANDTL_MIX ----"
    Debug.Print "T = "; T

    speciesList = To1DArray(speciesList)
    yList = To1DArray(yList)

    ' 1) Viskosität
    eta_mix = GET_ETA_MIX(T, speciesList, yList)
    Debug.Print "eta_mix = "; eta_mix
    If VarType(eta_mix) = vbError Then
        Debug.Print "ERROR: eta_mix enthält Fehlerwert"
        GET_PRANDTL_MIX = eta_mix
        Exit Function
    End If

    ' 2) Wärmeleitfähigkeit
    lambda_mix = GET_LAMBDA_MIX(T, speciesList, yList)
    Debug.Print "lambda_mix = "; lambda_mix
    If VarType(lambda_mix) = vbError Then
        Debug.Print "ERROR: lambda_mix enthält Fehlerwert"
        GET_PRANDTL_MIX = lambda_mix
        Exit Function
    End If

    ' 3) Wärmekapazität
    cp_mix = GET_CP_MIX(T, speciesList, yList)
    Debug.Print "cp_mix = "; cp_mix
    If VarType(cp_mix) = vbError Then
        Debug.Print "ERROR: cp_mix enthält Fehlerwert"
        GET_PRANDTL_MIX = cp_mix
        Exit Function
    End If

    ' 4) Denominator prüfen
    If lambda_mix = 0 Then
        Debug.Print "ERROR: lambda_mix = 0"
        GET_PRANDTL_MIX = CVErr(xlErrDiv0)
        Exit Function
    End If

    Pr = (eta_mix * cp_mix) / lambda_mix

    Debug.Print "Mischungs-Prandtl: "; Pr
    GET_PRANDTL_MIX = Pr
    Exit Function

ErrHandler:
    Debug.Print "ERROR in GET_PRANDTL_MIX"
    GET_PRANDTL_MIX = CVErr(xlErrNA)
End Function



 

? GET_PRANDTL_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
---- GET_PRANDTL_MIX ----
T =  800 
ERROR in GET_PRANDTL_MIX
Fehler 2042

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Übergabe von Arrays in verschiedene Funktionen
26.11.2025 20:08:12 Mira
NotSolved
26.11.2025 20:33:00 Gast3142
NotSolved
26.11.2025 20:56:07 xlKing
NotSolved
26.11.2025 23:41:47 Gast72886
NotSolved