Mehrfachabfrage in einer IF-Bedingung

  • Sonstige

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Pascal.

    Mehrfachabfrage in einer IF-Bedingung

    Hi,
    melde mich früher als mir recht ist, aber wenn der Schuhe drückt...

    Also ich hänge jetzt bei einer Mehrfachabfrage

    Quellcode

    1. If Not sLRUCode1(i)= Cells(sZeile, 23) Or Cells(sZeile, 25) Or Cells(sZeile, 27) Or Cells(sZeile, 29) Then


    die Fehlermeldung die der Compiler scheißt ist folgende:

    Quellcode

    1. Laufzeitfehler '13'
    2. Typen unverträglichkeit


    Merkwürdigerweise funktioniert das Ganze ohne Probleme wenn ich nur eine Bedingung nehme
    z.B. If Not sLRUCode1(i)= Cells(sZeile, 23) Then

    Beim Debuggen makiert er mir die oben genannte Zeile.
    Ich hoffe, dass ihr mit weiterhelfen könnte.

    sLRUCode1 --> String
    i --> Integer
    sZeile --> String
    Hallo Hell666,

    leider muss ich immer wieder dasselbe erwähnen... kein lauffähiger Quelltext

    Bitte teste mein Bsp aus und versuche es in dein Problem einzubauen:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub test01()
    3. Dim oWks As Worksheet
    4. Dim strTest As String
    5. Dim i As Long
    6. Set oWks = ActiveWorkbook.Worksheets(1)
    7. 'Such-Wort
    8. strTest = "geheim"
    9. 'Durchlaufe die Zeile 1 bis 5
    10. For i = 1 To 5
    11. 'Wenn Spalte 1 und Spalte 2 den Eintrag nicht enthalten mache etwas
    12. If Not strTest = oWks.Cells(i, 1) Or Not strTest = oWks.Cells(i, 2) Then
    13. 'Färbe die beiden Zellenhintergründe in blau
    14. oWks.Range(oWks.Cells(i, 1), oWks.Cells(i, 2)).Interior.ColorIndex = 5
    15. End If
    16. Next i
    17. Set oWks = Nothing
    18. End Sub
    19. Sub test02()
    20. Dim oWks As Worksheet
    21. Dim strTest As String
    22. Dim i As Long
    23. Set oWks = ActiveWorkbook.Worksheets(1)
    24. 'Such-Wort
    25. strTest = "geheim"
    26. 'Durchlaufe die Zeile 1 bis 5
    27. For i = 1 To 5
    28. 'Wenn Spalte 1 und Spalte 2 den Eintrag nicht enthalten mache etwas
    29. If Not (strTest = oWks.Cells(i, 1) And strTest = oWks.Cells(i, 2)) Then
    30. 'Färbe die beiden Zellenhintergründe in blau
    31. oWks.Range(oWks.Cells(i, 1), oWks.Cells(i, 2)).Interior.ColorIndex = 5
    32. End If
    33. Next i
    34. Set oWks = Nothing
    35. End Sub


    sZeile ist bei dir ein String, dabei wirst du doch kaum einen String übergeben, oder? Bitte beachte auch dir genaue Verwendung der logischen Operatoren.

    Gruß Markus
    na wenn ich denn gesammten code posten würde, würde das doch recht lang werden und im moment ist dort noch recht viel müll drin. die eine und andere sache ist auch noch nicht richtig gecodet (sehr schlecht geschreiben).
    was ich jetzt wissen wollte hast du mir aber beantwortet:
    If Not strTest = oWks.Cells(i, 1) Or Not strTest = oWks.Cells(i, 2) Then

    bloß mit der logik die da hintersteckt kommeich noch nicht so mit zurecht, aber wird schon^^
    das mit sZeile hab ich jetzt geändert, war noch so ein "bad code" --> merci
    okay, Problem existiert immernoch.
    Kann zwar jetzt den ersten Wert (1. Durchlauf)vergleichen z.B.
    bei
    If Not sLRUCode1(i)= Cells(iZeile, 23) Or Cells(iZeile, 25) Or Cells(iZeile, 27) Or Cells(iZeile, 29) Then
    ist es der Wert "1" dieser Stehe in der Zelle "Cells(iZeile, 23)"
    bein nächsten Durchlauf ist es der Wert "CE4" und dieser Steht in der Zelle "Cells(iZeile, 25)". Leider findet, oder sieht er sie nicht und geht in den IF-Körper rein.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Option Compare Text
    3. Sub Vergleich()
    4. Dim wTabelleBDD As Worksheet
    5. Dim wTabelleHoche As Worksheet
    6. Dim wTabelleTorsten As Worksheet
    7. Dim vZeile As Variant
    8. Dim vSuchSheet As Variant
    9. Dim sID As String
    10. Dim sFMC As String
    11. Dim sClass As String
    12. Dim sFDCE_Code As String
    13. Dim sFDCE_Type As String
    14. Dim sLRU_Code1 As String
    15. Dim sLRU_Code2 As String
    16. Dim sLRU_Status As String
    17. Dim sProbability As String
    18. Dim sLogical As String
    19. Dim sSignalBit As String
    20. Dim sResetBit As String
    21. Dim sFMCXY As String
    22. Dim sFMC_Einz(9) As String
    23. Dim sVariablen(16) As String
    24. Dim sDummy1 As String
    25. Dim sDummy2 As String
    26. Dim stest As String
    27. Dim i As Integer
    28. Dim iAktuelleZeile As Integer
    29. Dim iZeile As Integer
    30. Dim Suchbegriff As Range
    31. Dim rngTest As Range
    32. Set wTabelleBDD = ThisWorkbook.Worksheets(1)
    33. Set wTabelleTorsten = ThisWorkbook.Worksheets(2)
    34. Set wTabelleHoche = ThisWorkbook.Worksheets(3)
    35. iAktuelleZeile = 3
    36. Do Until wTabelleHoche.Cells(iAktuelleZeile, 1) = ""
    37. vZeile = wTabelleHoche.Range(Cells(iAktuelleZeile, 1), Cells(iAktuelleZeile, 16))
    38. 'sID = CStr(vZeile(1, 2))
    39. 'sFMC = CStr(vZeile(1, 3))
    40. 'sClass = CStr(vZeile(1, 4))
    41. 'sFDCE_Code = CStr(vZeile(1, 5))
    42. 'sFDCE_Type = CStr(vZeile(1, 6))
    43. 'sLRU_Code1 = CStr(vZeile(1, 7))
    44. 'sLRU_Code2 = CStr(vZeile(1, 8))
    45. 'sLRU_Status = CStr(vZeile(1, 10))
    46. 'sProbability = CStr(vZeile(1, 11))
    47. 'sLogical = CStr(vZeile(1, 12))
    48. 'sSignalBit = CStr(vZeile(1, 15))
    49. 'sResetBit = CStr(vZeile(1, 16))
    50. For i = 2 To 16 Step 1
    51. sVariablen(i) = CStr(vZeile(1, i))
    52. Next
    53. sFMCXY = Mid$(sVariablen(3), 1, 2)
    54. If sFMCXY = "XY" Then
    55. sFMCXY = Mid$(sFMC, 3, 2)
    56. For i = 1 To 9 Step 1
    57. sFMC_Einz(i) = "1" & (i) & sFMCXY
    58. Next
    59. End If
    60. With Worksheets("BDD").Range("B1:B65536")
    61. If Not sFMC_Einz(1) = "" Then
    62. For i = 1 To 9 Step 1
    63. Set Suchbegriff = .Find(sFMC_Einz(i), LookIn:=xlValues)
    64. If Not Suchbegriff Is Nothing Then
    65. iZeile = Suchbegriff.Row
    66. End If
    67. ' Anweisung was er machen soll, nachdem er den FMC (XY)gefunden hat
    68. Next
    69. End If
    70. Set Suchbegriff = .Find(What:=sVariablen(3), LookIn:=xlValues)
    71. If Not Suchbegriff Is Nothing Then
    72. iZeile = Suchbegriff.Row
    73. End If
    74. ' Anweisung was er machen soll, nachdem er den FMC gefunden hat
    75. sDummy1 = VergleichBDD(sVariablen(2), iZeile, sVariablen(4), sVariablen(5), sVariablen(6), sVariablen(7) _
    76. , sVariablen(8), sVariablen(10))
    77. End With
    78. With Worksheets("Torsten").Range("C1:C65536")
    79. If Not sFMC_Einz(1) = "" Then
    80. For i = 1 To 9 Step 1
    81. Set Suchbegriff = .Find(sFMC_Einz(i), LookIn:=xlValues)
    82. If Not Suchbegriff Is Nothing Then
    83. iZeile = Suchbegriff.Row
    84. End If
    85. ' Anweisung was er machen soll, nachdem er den FMC (XY)gefunden hat
    86. Next
    87. End If
    88. Set Suchbegriff = .Find(What:=sVariablen(3), LookIn:=xlValues)
    89. If Not Suchbegriff Is Nothing Then
    90. iZeile = Suchbegriff.Row
    91. End If
    92. ' Anweisung was er machen soll, nachdem er den FMC gefunden hat
    93. sDummy2 = VergleichTorsten(sVariablen(2), iZeile, sVariablen(4), sVariablen(5), sVariablen(6))
    94. End With
    95. iAktuelleZeile = iAktuelleZeile + 1
    96. Loop
    97. End Sub

    Visual Basic-Quellcode

    1. Function VergleichBDD(sIDHoche, iZeile, sClassBDD, sFDCE_Code, sFDCE_Type, sLRU_Code1, sLRU_Code2, sLRU_Status) As String
    2. Dim sIDZeile As String
    3. Dim sIDBDD As String
    4. Dim sIDBDD1() As String
    5. Dim sClass() As String
    6. Dim sLRUCode1() As String
    7. Dim sLRUCode2() As String
    8. Dim sLRUStatus() As String
    9. Dim sMerkerTreffer As String
    10. Dim stest As String
    11. Dim i As Integer
    12. Dim itest As Integer
    13. Sheets("BDD").Select
    14. ' ID Vergleich
    15. sIDBDD = Cells(iZeile, 22)
    16. sIDBDD1() = Split(sIDBDD, ",")
    17. For i = 0 To UBound(sIDBDD1, 1) Step 1
    18. If Mid$(sIDBDD1(i), 1, 2) = "ID" Then
    19. sIDBDD1(i) = Mid$(sIDBDD1(i), 3, 4)
    20. End If
    21. sIDBDD1(i) = LTrim(sIDBDD1(i))
    22. If Not sIDHoche = sIDBDD1(i) Then ' Fehleranzeige funktioniert nicht
    23. sMerkerTreffer = "1"
    24. End If
    25. Next
    26. ' Class Vergleich
    27. sClass() = Split(sClassBDD)
    28. Select Case CInt(sClass(1))
    29. Case Is = 0
    30. sClass(0) = Cells(iZeile, 5)
    31. If Not sClass(0) = "Yes" Then
    32. sMerkerTreffer = sMerkerTreffer & "1"
    33. ' Fehlerbehandlung, z.B. Zelle makieren
    34. End If
    35. Case Is = 1
    36. sClass(0) = Cells(iZeile, 6)
    37. If Not sClass(0) = "Yes" Then
    38. sMerkerTreffer = sMerkerTreffer & "1"
    39. ' Fehlerbehandlung, z.B. Zelle makieren
    40. End If
    41. Case Is = 4
    42. sClass(0) = Cells(iZeile, 6)
    43. If Not sClass(0) = "Yes" Then
    44. sMerkerTreffer = sMerkerTreffer & "1"
    45. ' Fehlerbehandlung, z.B. Zelle makieren
    46. End If
    47. Case Is = 5
    48. sClass(0) = Cells(iZeile, 6)
    49. If Not sClass(0) = "Yes" Then
    50. sMerkerTreffer = sMerkerTreffer & "1"
    51. ' Fehlerbehandlung, z.B. Zelle makieren
    52. End If
    53. Case Is <> 0 Or 1 Or 4 Or 5
    54. ' Die Fehlerklasse ist nicht zulässig
    55. End Select
    56. ' FDCE_Code Vergleich
    57. If Not sFDCE_Code = Cells(iZeile, 64) Then
    58. If Not sFDCE_Code = "N/A" And Cells(iZeile, 64) = "" Then
    59. ' Fehlerbehandlung wenn die Werte nicht übereinstimmen
    60. End If
    61. End If
    62. ' sFDCE_Type Vergleich
    63. If Not sFDCE_Type = Cells(iZeile, 65) Then
    64. If Not sFDCE_Code = "N/A" And Cells(iZeile, 65) = "" Then
    65. ' Fehlerbehandlung
    66. End If
    67. End If
    68. ' sLRU_Code1 Vergleich
    69. sLRUCode1() = Split(sLRU_Code1, ",")
    70. For i = 0 To UBound(sLRUCode1, 1) Step 1
    71. sLRUCode1(i) = LTrim(sLRUCode1(i))
    72. sLRUCode1(i) = Hex(CInt(sLRUCode1(i))) ' Dezimalzahl nach Hexadezimal umwandeln
    73. If Len(sLRUCode1(i)) > 1 Then
    74. Select Case sLRUCode1(i)
    75. Case Is = 2
    76. sLRUCode1(i) = "00" & sLRUCode1(i)
    77. Case Is = 3
    78. sLRUCode1(i) = "0" & sLRUCode1(i)
    79. End Select
    80. End If
    81. If Not sLRUCode1(i) = Cells(iZeile, 23) Or sLRUCode1(i) = Cells(iZeile, 25) Or _
    82. sLRUCode1(i) = Cells(iZeile, 27) Or sLRUCode1(i) = Cells(iZeile, 29) Then
    83. Cells(1, 1).Select
    84. ' Fehlerbehandlung
    85. End If
    86. Next
    87. ' sLRU_Code2 Vergleich
    88. sLRUCode2() = Split(sLRU_Code2, ",")
    89. For i = 0 To UBound(sLRUCode2, 1) Step 1
    90. sLRUCode2(i) = LTrim(sLRUCode2(i))
    91. sLRUCode2(i) = Hex(CInt(sLRUCode2(i))) ' Dezimalzahl nach Hexadezimal umwandeln
    92. If Len(sLRUCode2(i)) > 1 Then
    93. Select Case sLRUCode2(i)
    94. Case Is = 2
    95. sLRUCode2(i) = "00" & sLRUCode2(i)
    96. Case Is = 3
    97. sLRUCode2(i) = "0" & sLRUCode2(i)
    98. End Select
    99. End If
    100. 'If Not sLRUCode2(i) = Cells(iZeile, 23) Or sLRUCode2(i) = Cells(iZeile, 25) _
    101. 'Or sLRUCode2(i) = Cells(iZeile, 27) Or sLRUCode2(i) = Cells(iZeile, 29) Then
    102. 'Cells(1, 1).Select
    103. ' Fehlerbehandlung
    104. 'End If
    105. Next
    106. ' sLRU_Status Vergleich
    107. sLRUStatus() = Split(sLRU_Status, ",")
    108. For i = 0 To UBound(sLRUStatus, 1) Step 1
    109. sLRUStatus(i) = LTrim(sLRUStatus(i))
    110. If Not sLRUStatus(i) = Cells(iZeile, 31) Or Not sLRUStatus(i) = Cells(iZeile, 33) _
    111. Or sLRUStatus(i) = Cells(iZeile, 35) Or sLRUStatus(i) = Cells(iZeile, 37) Then
    112. Cells(1, 1).Select
    113. ' Fehlermeldung
    114. End If
    115. Next
    116. If Not sMerkerTreffer = "1" Then
    117. ' Er läuft hier nur rein, wenn KEIN Fehler passiert ist.
    118. ' Egal wann der Fehler aufgetretten ist
    119. ' würde er hier reinlaufen
    120. End If
    121. VergleichBDD = sMerkerTreffer
    122. End Function
    123. Function VergleichTorsten(sIDHoche, iZeile, sClassTorsten, sFDCE_Code, sFDCE_Type)
    124. Dim sIDZeile As String
    125. Dim iZeileTorsten As String
    126. Dim sIDTorsten As String
    127. Dim sIDTorsten1() As String
    128. Dim sMerkerTreffer As String
    129. Dim i As Integer
    130. Sheets("Torsten").Select
    131. ' ID Vergleich
    132. sIDTorsten = Cells(iZeile, 2)
    133. sIDTorsten1() = Split(sIDTorsten, ",")
    134. For i = 0 To UBound(sIDTorsten1, 1) Step 1
    135. If Mid$(sIDTorsten1(i), 1, 2) = "ID" Then
    136. sIDTorsten1(i) = Mid$(sIDTorsten1(i), 3, 4)
    137. End If
    138. sIDTorsten1(i) = LTrim(sIDTorsten1(i))
    139. If Not sIDHoche = sIDTorsten1(i) Then
    140. sMerkerTreffer = "1"
    141. End If
    142. Next
    143. ' Class Vergleich
    144. If Not sClassTorsten = Cells(iZeile, 4) Then
    145. ' Fehlerbehandlung
    146. End If
    147. ' FDCE_Code Vergleich
    148. If Not sFDCE_Code = Cells(iZeile, 5) Then
    149. ' Fehlerbehandlung
    150. End If
    151. ' sFDCE_Type Vergleich
    152. If Not sFDCE_Type = Cells(iZeile, 6) Then
    153. ' Fehlerbehandlung
    154. End If
    155. If sMerkerTreffer = "1" Then
    156. ' Zelle auswählen und anschließend kenntlich machen das hier was nicht stimmt
    157. End If
    158. VergleichTorsten = sMerkerTreffer
    159. Sheets("Hoche").Select
    160. End Function

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

    Hallo,

    leider hast du vermutlich meinen Quelltext NICHT durchgearbeitet.....
    Was machst du denn hier:
    If Not sLRUCode1(i)= Cells(iZeile, 23) Or Cells(iZeile, 25) Or Cells(iZeile, 27) Or Cells(iZeile, 29) Then


    Mit Or Cells(iZeile, 25) versuchst du heraus zu finden ob der Zellinhalt (=ein String) TRUE oder FALSE ist. Möchtest du das wirklich? Ich kenne nicht den Inhalt deiner Datei! Versuche das Problem auf weniger Codezeilen zu reduzieren. Bringe komplett lauffähigen Code, niemand kann doch wissen, was in deinem Worksheet steht.

    Bitte benutze die Tags zur übersichtlichen Darstellung von Code in diesem Forum!

    Alternativ lade die komplette Datei auf einen Webspace deiner Wahl hoch und verlinke diese Datei entsprechend.

    Wenn du Hilfe möchtest, dann bereite doch deine Frage möglichst hilfreich auf.

    Gruß Markus
    Ich schätze mal du willst das so haben:

    Visual Basic-Quellcode

    1. If Not sLRUCode1(i)= Cells(sZeile, 23) Or Not sLRUCode1(i)= Cells(sZeile, 25) Or Not sLRUCode1(i)= Cells(sZeile, 27) Or Not sLRUCode1(i)= Cells(sZeile, 29) Then


    Übrigens viel einfacher gehts auch mit ner Zählschleife...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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

    gähn, streck, ..., moin

    sry leute das ich jetzt erst wieder antworte aber gestern war es mir einfach zu viel geworden, einfach kein plan mehr gehabt.
    die große erkenntnis aus der erholungsphase, ich weiß wie ich es machen kann^^ nämlich mit elseif und jeweils einen Counter der in der Abfrage hochzählt.
    @ alchimist
    werde versuchen mich zu bessern, versprochen

    @ Agent
    jup das hab ich gesucht, aber das was du geschrieben hast futzt leider nicht. darauf bin ich auch schon selber gekommen und dann gescheitert :)

    @ all
    merci für eure hilfe, mal sehen wann ich euch wieder brauche
    Ohne den Quelltext durchgelesen zu haben vermute ich, daß Dein Zellinhalt nicht immer ein String ist und deswegen auch Fehler 13 Typen unverträglich produziert wird.

    Mit CStr() kannst Du beliebigen Zellinhalt in Strings umkonvertieren, dann sollte der Fehler nicht mehr auftauchen.