Array-Property - Argumenttyp ByRef unverträglich

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von bmn.

    Array-Property - Argumenttyp ByRef unverträglich

    Hallo,

    vor einigen Tagen hatte ich das Problem, Property mit einem Array zu belegen ( [Excel] Array als Property definieren? ). Das wurde soweit auch ganz gut gelöst, bisher hat alles wunderbar funktioniert.
    Nur kriege seit kurzem (und ich hab nichts an der clsMWert verändert) die Fehlermeldung: Fehler beim Kompilieren: Argumenttyp ByRef unverträglich
    Ich habe unten einmal die clsMWert und die relevanten Subs der UF aufgeführt.

    In die clsMWert habe ich exemplarisch eine unkritische Property und die vier fehlerhaften eingebracht. Im UF-Code sind die Fehlerstellen hervorgehoben.

    Vielleicht aber einmal zur Aufgabenstellung (die an sich recht simpel ist):
    Ich lese Werte in einer definierten Form aus einer Excel-Tabelle heraus. Das hat so auch ganz gut geplappt (selbst mit den arrays). Wer weiß, warum er jetzt auf einmal Zicken macht... Ich habe auch noch eine funktionierende Version, zu der ich allerdings keine Unterschiede erkennen kann (bei Wunsch poste ich das, sonst wirds hier einfach zu viel)


    clsMWert

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim mWNr, mORadBearb As String
    3. Dim mKFaktor, mVStrom(4), mORadL, mORadR, mKonf, i, mVNr As Integer
    4. Dim mDatum As Date
    5. Dim mMWert As Single
    6. Dim mVAbl(4), mVWahr(4), mFehler(4) As Single
    7. '********************************
    8. '***** Standardwerte setzen *****
    9. Private Sub Class_Initialize()
    10. mWNr = "xxxx"
    11. mKFaktor = 1
    12. mORadL = -1
    13. mORadR = -1
    14. mKonf = -1
    15. mORadBearb = -1
    16. mVStrom(1) = 10
    17. mVStrom(2) = 5
    18. mVStrom(3) = 2
    19. mVStrom(4) = 1
    20. mDatum = 0
    21. mMWert = 9.999
    22. For i = 1 To 4
    23. mVAbl(i) = -1
    24. mVWahr(i) = -1
    25. mFehler(i) = -1
    26. Next i
    27. End Sub
    28. '***************************
    29. '***** Let-Get für WNr *****
    30. Public Property Let WNr(ByVal DieWNr As String)
    31. mWNr = DieWNr
    32. End Property
    33. Public Property Get WNr() As String
    34. WNr = mWNr
    35. End Property
    36. '******************************
    37. '***** Let-Get für Fehler *****
    38. Public Property Let Fehler(index As Integer, derFehler As Single)
    39. If index > 0 And index <= 4 Then
    40. mFehler(index) = derFehler
    41. End If
    42. End Property
    43. Public Property Get Fehler(index As Integer) As Single
    44. If index > 0 And index <= 4 Then
    45. Fehler = mFehler(index)
    46. Else
    47. Fehler = -1
    48. End If
    49. End Property
    50. '*******************************
    51. '***** Let-Get für VAbl *****
    52. Public Property Let VAbl(index As Integer, DasVAbl As Single)
    53. If index > 0 And index <= 4 Then
    54. mVAbl(index) = DasVAbl
    55. End If
    56. End Property
    57. Public Property Get VAbl(index As Integer) As Single
    58. If index > 0 And index <= 4 Then
    59. VAbl = mVAbl(index)
    60. Else
    61. VAbl = -1
    62. End If
    63. End Property
    64. '*******************************
    65. '***** Let-Get für VWahr *****
    66. Public Property Let VWahr(index As Integer, DasVWahr As Single)
    67. If index > 0 And index <= 4 Then
    68. mVWahr(index) = DasVWahr
    69. End If
    70. End Property
    71. Public Property Get VWahr(index As Integer) As Single
    72. If index > 0 And index <= 4 Then
    73. VWahr = mVWahr(index)
    74. Else
    75. VWahr = -1
    76. End If
    77. End Property
    78. '*******************************
    79. '***** Let-Get für MVStrom *****
    80. Public Property Let VStrom(index As Integer, derVStrom As Integer)
    81. If index > 0 And index <= 4 Then
    82. mVStrom(index) = derVStrom
    83. End If
    84. End Property
    85. Public Property Get VStrom(index As Integer) As Integer
    86. If index > 0 And index <= 4 Then
    87. VStrom = mVStrom(index)
    88. Else
    89. VStrom = -1
    90. End If
    91. End Property


    UF

    Visual Basic-Quellcode

    1. Option Explicit
    2. ' cMReihen gibt die Größe des Feldes an
    3. Const cMReihen As Integer = 100
    4. Dim MWerte(cMReihen) As clsMWert
    5. Private Sub UserForm_Initialize()
    6. Dim iIndex As Integer
    7. Dim sVers, sVersA() As String
    8. iIndex = 1
    9. For i = 1 To cMReihen
    10. Set MWerte(i) = New clsMWert
    11. Next i
    12. '*******************************
    13. '***** Einlesen des Arrays *****
    14. While Cells(iIndex, 1).Value <> "" And Cells(iIndex + 1, 1).Value <> ""
    15. sVers = Cells(iIndex, 1).Value
    16. sVersA() = Split(sVers, "-")
    17. With MWerte((iIndex - 1) / 7 + 1)
    18. .Konf = CInt(sVersA(0))
    19. .WNr = sVersA(1)
    20. .VNr = CInt(Cells(iIndex + 1, 1).Value)
    21. .ORadL = CInt(sVersA(2))
    22. .ORadR = CInt(sVersA(3))
    23. .ORadBearb = sVersA(4)
    24. .Datum = Cells(iIndex, 2).Value ' + Format(Cells(iIndex, 3), "hh:mm:ss")
    25. .KFaktor = Cells(iIndex + 1, 2).Value
    26. .MWert = Cells(iIndex + 1, 4).Value
    27. For i = 1 To 4
    28. .VStrom(i) = Cells(iIndex + i + 1, 1).Value ' Hier
    29. .VWahr(i) = Cells(iIndex + i + 1, 2).Value ' treten
    30. .VAbl(i) = Cells(iIndex + i + 1, 3).Value ' Fehler
    31. .Fehler(i) = Cells(iIndex + i + 1, 4).Value ' auf
    32. Next i
    33. End With
    34. iIndex = iIndex + 7
    35. Wend
    36. End Sub


    Übrigens wird jeweils das i in den Klammern von VStrom etc. grau hinterlegt.

    Vielleicht könnt ihr mir helfen, bisher war ich sehr glücklich über eure Hilfe.

    PS: Ich bin das Wochenende über nicht da, kann also auch nicht antworten :S
    So, ich bin wieder da, aber leider hat sich ja nicht so viel getan? Gibt es keine Ideen?



    @INOPIAE: Die Deklaration für i hab ich wohl nicht mit in den Code oben übernommen, im Original ist sie aber vorhanden.



    EDIT: Ich hab das Problem gelöst. Standardmäßig wird in der Property offenbar ByRef angenommen und damit haut das nicht hin für mich.

    Visual Basic-Quellcode

    1. '*******************************
    2. '***** Let-Get für MVStrom *****
    3. Public Property Let VStrom(ByVal index As Integer, ByVal derVStrom As Integer)
    4. If index > 0 And index <= 4 Then
    5. mVStrom(index) = derVStrom
    6. End If
    7. End Property
    8. Public Property Get VStrom(ByVal index As Integer) As Integer
    9. If index > 0 And index <= 4 Then
    10. VStrom = mVStrom(index)
    11. Else
    12. VStrom = -1
    13. End If
    14. End Property


    Der Code zeigt eine Property, der Rest ist analog zu sehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bmn“ ()