Bestimmte Spalten bei der Suche ausschließen

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bestimmte Spalten bei der Suche ausschließen

    Hallo,

    habe ein Problem beim Durchsuchen von bestimmten Spalten. Ich habe folgendes Makro bzw. einen Auszug davon:

    Visual Basic-Quellcode

    1. With Sheets("Termine")
    2. For Zeile = 9 To 149
    3. If UCase(.Cells(Zeile, 2)) = UCase(Cells(2, 1)) Then
    4. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    5. For Spalte = 6 To 158
    6. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    7. Cells(k, 8) = .Cells(7, Spalte)
    8. Cells(k, 9) = .Cells(Zeile, Spalte)
    9. Cells(k, 9).NumberFormat = "dd/mm/yyyy"
    10. k = k + 1
    11. End If
    12. Next Spalte
    13. Exit For
    14. End If
    15. Next Zeile
    16. End With
    17. End Sub


    Anhand der Zeile 5 "For Spalte = 6 To 158" wird ja genau dieser Bereich durchsucht. Ich möchte aber nur, dass in den Spalten von 6 bis 11 und von 20 bis 158 gesucht wird. Den Bereich dazwischen möchte ich ausschließen.

    Ich hoffe, dass mir da jemand weiterhelfen kann.
    Danke schonmal.

    Gruß
    Miss Leela
    probierma

    Visual Basic-Quellcode

    1. With Sheets("Termine")
    2. For Zeile = 9 To 149
    3. If UCase(.Cells(Zeile, 2)) = UCase(Cells(2, 1)) Then
    4. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    5. For Spalte = 6 To 11
    6. CheckCell k, Zeile, Spalte
    7. Next Spalte
    8. For Spalte = 20 To 158
    9. CheckCell k, Zeile, Spalte
    10. Next Spalte
    11. Exit For
    12. End If
    13. Next Zeile
    14. End With
    15. End Sub
    16. Private Sub CheckCell(ByRef k as Integer, Zeile as Integer, Spalte as Integer
    17. With Sheets("Termine")
    18. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    19. Cells(k, 8) = .Cells(7, Spalte)
    20. Cells(k, 9) = .Cells(Zeile, Spalte)
    21. Cells(k, 9).NumberFormat = "dd/mm/yyyy"
    22. k = k + 1
    23. End If
    24. End With
    25. End Sub
    ungetestet
    Hey, danke für deine Antwort.

    Dein Code funktioniert leider nicht. :(

    Ich bekomme folgende Fehlermeldung: "Fehler beim Kompilieren: Argumenttyp ByRef unverträglich". Zusätzlich wird das k im oberen Teil markiert. Keine Ahnung was mir das sagen soll.

    Hat vll noch jemand eine Idee?

    Gruß MissLeela
    Hey,
    ist wohl doch noch nicht erledigt das Thema.
    Hab versucht das Makro zu erweitern und hab jetzt Probleme mit dem CheckCell. Ich wollte das mehrmals verwenden,weil ich nicht nur ein Suchfeld habe, sondern drei. Aber das geht wohl nicht mit dem mehrfach verwenden. Hier mal das komplette Makro. Dann wird das vll deutlicher. Er meckert halt rum wegen dem CheckCell.

    Visual Basic-Quellcode

    1. Public Sub SucheUnterweisungen()
    2. Dim i As Long
    3. Dim j As Long
    4. Dim k As Long
    5. Dim l As Long
    6. Dim m As Long
    7. Dim n As Long
    8. Const Anfang = 23
    9. Dim Ende As Long
    10. Dim Zeile As Long
    11. Dim Spalte As Long
    12. Dim Heute As Date
    13. stopp = True
    14. i = 6
    15. j = 6
    16. k = 6
    17. l = 6
    18. m = 6
    19. n = 6
    20. Range("A6:J100").ClearContents
    21. With Sheets("Instandh")
    22. 'Suchfeld A2
    23. For Zeile = 8 To 148
    24. If UCase(.Cells(Zeile, 3)) = UCase(Cells(2, 1)) Then
    25. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    26. For Spalte = Anfang To 28
    27. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    28. Cells(i, 2) = .Cells(6, Spalte)
    29. Cells(i, 3) = .Cells(Zeile, Spalte)
    30. Cells(i, 3).NumberFormat = "dd/mm/yyyy"
    31. i = i + 1
    32. End If
    33. Next Spalte
    34. Exit For
    35. End If
    36. Next Zeile
    37. 'Suchfeld A3
    38. For Zeile = 8 To 148
    39. If UCase(.Cells(Zeile, 3)) = UCase(Cells(3, 1)) Then
    40. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    41. For Spalte = Anfang To 28
    42. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    43. Cells(j, 5) = .Cells(6, Spalte)
    44. Cells(j, 6) = .Cells(Zeile, Spalte)
    45. Cells(j, 6).NumberFormat = "dd/mm/yyyy"
    46. j = j + 1
    47. End If
    48. Next Spalte
    49. Exit For
    50. End If
    51. Next Zeile
    52. 'Suchfeld A4
    53. For Zeile = 8 To 148
    54. If UCase(.Cells(Zeile, 3)) = UCase(Cells(4, 1)) Then
    55. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    56. For Spalte = Anfang To 28
    57. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    58. Cells(k, 8) = .Cells(6, Spalte)
    59. Cells(k, 9) = .Cells(Zeile, Spalte)
    60. Cells(k, 9).NumberFormat = "dd/mm/yyyy"
    61. k = k + 1
    62. End If
    63. Next Spalte
    64. Exit For
    65. End If
    66. Next Zeile
    67. End With
    68. With Sheets("Termine")
    69. 'Suchfeld A2
    70. For Zeile = 9 To 149
    71. If UCase(.Cells(Zeile, 2)) = UCase(Cells(2, 1)) Then
    72. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    73. For Spalte = 6 To 11
    74. CheckCell l, Zeile, Spalte
    75. Next Spalte
    76. For Spalte = 20 To 158
    77. CheckCell l, Zeile, Spalte
    78. Next Spalte
    79. Exit For
    80. End If
    81. Next Zeile
    82. 'Suchfeld A3
    83. For Zeile = 9 To 149
    84. If UCase(.Cells(Zeile, 2)) = UCase(Cells(3, 1)) Then
    85. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    86. For Spalte = 6 To 11
    87. CheckCell m, Zeile, Spalte
    88. Next Spalte
    89. For Spalte = 20 To 158
    90. CheckCell m, Zeile, Spalte
    91. Next Spalte
    92. Exit For
    93. End If
    94. Next Zeile
    95. 'Suchfeld A4
    96. For Zeile = 9 To 149
    97. If UCase(.Cells(Zeile, 2)) = UCase(Cells(4, 1)) Then
    98. Ende = .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    99. For Spalte = 6 To 11
    100. CheckCell n, Zeile, Spalte
    101. Next Spalte
    102. For Spalte = 20 To 158
    103. CheckCell n, Zeile, Spalte
    104. Next Spalte
    105. Exit For
    106. End If
    107. Next Zeile
    108. End With
    109. End Sub
    110. Public Sub CheckCell(ByRef l As Long, Zeile As Long, Spalte As Long)
    111. With Sheets("Termine")
    112. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    113. Cells(l, 8) = .Cells(7, Spalte)
    114. Cells(l, 9) = .Cells(Zeile, Spalte)
    115. Cells(l, 9).NumberFormat = "dd/mm/yyyy"
    116. l = l + 1
    117. End If
    118. End With
    119. End Sub
    120. Public Sub CheckCell(ByRef m As Long, Zeile As Long, Spalte As Long)
    121. With Sheets("Termine")
    122. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    123. Cells(m, 11) = .Cells(7, Spalte)
    124. Cells(m, 12) = .Cells(Zeile, Spalte)
    125. Cells(m, 12).NumberFormat = "dd/mm/yyyy"
    126. m = m + 1
    127. End If
    128. End With
    129. End Sub
    130. Public Sub CheckCell(ByRef n As Long, Zeile As Long, Spalte As Long)
    131. With Sheets("Termine")
    132. If Not IsEmpty(.Cells(Zeile, Spalte)) Then
    133. Cells(n, 14) = .Cells(7, Spalte)
    134. Cells(n, 15) = .Cells(Zeile, Spalte)
    135. Cells(n, 15).NumberFormat = "dd/mm/yyyy"
    136. n = n + 1
    137. End If
    138. End With
    139. End Sub


    Ne Idee wie ich das hinbekomme?

    Gruß
    MissLeela
    Doch, das ist mir schon klar,weil ja CheckCell in drei Durchläufen genutzt wird, aber benutz ich jetzt statt CheckCell beim zweiten und dritten Durchlauf einfach ein anderen Namen oder wie? Wahrscheinlich nicht, aber ich weiß halt nicht was ich anders machen soll.

    MissLeela schrieb:

    Doch, das ist mir schon klar,weil ja CheckCell in drei Durchläufen genutzt wird

    bitte präzise denken!
    Von "Durchläufen" ist nirgends die Rede, sondern das Problem war, das da 3 Methoden mit demselben Namen herumfahren.

    Ich kann mir übrigens nicht vorstellen, dass du dieses Problem nicht inzwischen selbst gelöst hast.

    Nur möglicherweise bist du mit deiner Lsg. unzufrieden.
    Also gelöst hab ich das Problem.

    Ob ich damit unzufrieden bin weiß ich noch nicht. Bin erstmal froh, dass es überhaupt funktioniert.
    Wahrscheinlich gibt es ne elegantere Lösung als den Namen der Methode einfach nur ein bißchen abzuändern, aber dafür kenn ich mich einfach zu wenig aus.

    Danke nochmal für deine Hilfe.

    Gruß
    MissLeela
    Ha nur, du könntest hier Prinzipien des Programmierens aus innerer Motivation heraus entwickeln.
    Der bereits vollzogene Schritt hieß "Extrahieren von Code in eine Methode" (nämlich in die Methode CheckCell)

    Nun käme dran, mehrere fast identische Methoden durch eine einzige, variable Methode zu ersetzen. Dazu identifiziert man, welches Element die Methoden unterscheidet, und gibt genau dieses als Parameter hinein - "Parametrisieren von Methoden" heißt das.

    Bei deinen 3 Methoden unterscheidet sich nur das Sheet, was angesprochen wird. also könnteste einen Methode basteln, wo das Sheet von aussen reingegeben wird - der Kopf (die "Signatur") sähe so aus:

    Visual Basic-Quellcode

    1. Public Sub CheckCell(wks As WorkSheet, ByRef n As Long, Zeile As Long, Spalte As Long)