Schleifen setzen für Makro-Aufzeichnung

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ereza.

    Schleifen setzen für Makro-Aufzeichnung

    Hallo liebe Community!

    Ich habe in Excel gezielt ein Makro aufgezeichnet. Dabei geht's darum, dass über INDEX und VERGLEICH gewisse Informationen in gewünschter Art und Weise referenziert und dargestellt werden sollen.

    Das bedeutet konkret folgendes:
    Ich beginne in der 2.ten Zeile über diese Formeln (INDEX, VERGLEICH) meine Informationen anzuzeigen. Nachdem ich mit der 2.ten Zeile, als Ausgangszeile, fertig bin, markiere ich die relevanten Zellen, dieser Zeile, und ziehe bis zu einer Zeilennummer X runter. Durch das automatische ausfüllen der Informationen habe ich dann, wie gewünscht, alles bis zur Zeile X, richtig befüllt!

    Im Grunde, eignet sich für dieses Vorgehen ein Makro ganz gut und so hab ich es aufgezeichnet:

    Visual Basic-Quellcode

    1. Sub Bestelltabelle_ergänzen()
    2. '
    3. ' Bestelltabelle_ergänzen Makro
    4. '
    5. ActiveWindow.ScrollColumn = 2
    6. ActiveWindow.ScrollColumn = 3
    7. ActiveWindow.ScrollColumn = 4
    8. ActiveWindow.ScrollColumn = 5
    9. ActiveWindow.ScrollColumn = 6
    10. ActiveWindow.ScrollColumn = 7
    11. ActiveWindow.ScrollColumn = 8
    12. ActiveWindow.ScrollColumn = 9
    13. ActiveWindow.ScrollColumn = 10
    14. ActiveWindow.ScrollColumn = 11
    15. ActiveWindow.ScrollColumn = 12
    16. ActiveWindow.ScrollColumn = 13
    17. Range("T2").Select
    18. ActiveCell.FormulaR1C1 = _
    19. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    20. Range("U2").Select
    21. ActiveCell.FormulaR1C1 = _
    22. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    23. Range("V2").Select
    24. ActiveCell.FormulaR1C1 = _
    25. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    26. Range("W2").Select
    27. ActiveCell.FormulaR1C1 = _
    28. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    29. Range("X2").Select
    30. ActiveCell.FormulaR1C1 = _
    31. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    32. Range("Y2").Select
    33. ActiveCell.FormulaR1C1 = _
    34. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    35. Range("Z2").Select
    36. ActiveCell.FormulaR1C1 = _
    37. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    38. Range("AA2").Select
    39. ActiveCell.FormulaR1C1 = _
    40. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    41. Range("AB2").Select
    42. ActiveCell.FormulaR1C1 = _
    43. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    44. Range("AC2").Select
    45. ActiveCell.FormulaR1C1 = _
    46. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-17],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    47. Range("AD2").Select
    48. ActiveCell.FormulaR1C1 = _
    49. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    50. Range("AD3").Select
    51. ActiveWindow.ScrollColumn = 14
    52. ActiveWindow.ScrollColumn = 15
    53. ActiveWindow.ScrollColumn = 16
    54. ActiveWindow.ScrollColumn = 17
    55. Range("AE2").Select
    56. ActiveCell.FormulaR1C1 = _
    57. "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-18],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    58. Range("T2:AE2").Select
    59. Selection.AutoFill Destination:=Range("T2:AE185"), Type:=xlFillDefault
    60. Range("T2:AE185").Select
    61. ActiveWindow.ScrollColumn = 12
    62. ActiveWindow.ScrollColumn = 11
    63. ActiveWindow.ScrollColumn = 10
    64. ActiveWindow.ScrollColumn = 9
    65. ActiveWindow.ScrollColumn = 8
    66. ActiveWindow.ScrollColumn = 7
    67. ActiveWindow.ScrollColumn = 6
    68. ActiveWindow.ScrollColumn = 5
    69. ActiveWindow.ScrollColumn = 4
    70. ActiveWindow.ScrollColumn = 3
    71. ActiveWindow.ScrollColumn = 2
    72. ActiveWindow.ScrollColumn = 1
    73. ActiveWindow.ScrollRow = 148
    74. ActiveWindow.ScrollRow = 147
    75. ActiveWindow.ScrollRow = 146
    76. ActiveWindow.ScrollRow = 145
    77. ActiveWindow.ScrollRow = 144
    78. ActiveWindow.ScrollRow = 143
    79. ActiveWindow.ScrollRow = 141
    80. ActiveWindow.ScrollRow = 140
    81. ActiveWindow.ScrollRow = 138
    82. ActiveWindow.ScrollRow = 136
    83. ActiveWindow.ScrollRow = 135
    84. ActiveWindow.ScrollRow = 133
    85. ActiveWindow.ScrollRow = 131
    86. ActiveWindow.ScrollRow = 128
    87. ActiveWindow.ScrollRow = 126
    88. ActiveWindow.ScrollRow = 124
    89. ActiveWindow.ScrollRow = 121
    90. ActiveWindow.ScrollRow = 118
    91. ActiveWindow.ScrollRow = 115
    92. ActiveWindow.ScrollRow = 113
    93. ActiveWindow.ScrollRow = 110
    94. ActiveWindow.ScrollRow = 107
    95. ActiveWindow.ScrollRow = 103
    96. ActiveWindow.ScrollRow = 100
    97. ActiveWindow.ScrollRow = 97
    98. ActiveWindow.ScrollRow = 94
    99. ActiveWindow.ScrollRow = 91
    100. ActiveWindow.ScrollRow = 88
    101. ActiveWindow.ScrollRow = 85
    102. ActiveWindow.ScrollRow = 82
    103. ActiveWindow.ScrollRow = 79
    104. ActiveWindow.ScrollRow = 76
    105. ActiveWindow.ScrollRow = 73
    106. ActiveWindow.ScrollRow = 71
    107. ActiveWindow.ScrollRow = 68
    108. ActiveWindow.ScrollRow = 65
    109. ActiveWindow.ScrollRow = 63
    110. ActiveWindow.ScrollRow = 60
    111. ActiveWindow.ScrollRow = 57
    112. ActiveWindow.ScrollRow = 55
    113. ActiveWindow.ScrollRow = 53
    114. ActiveWindow.ScrollRow = 51
    115. ActiveWindow.ScrollRow = 49
    116. ActiveWindow.ScrollRow = 47
    117. ActiveWindow.ScrollRow = 45
    118. ActiveWindow.ScrollRow = 43
    119. ActiveWindow.ScrollRow = 41
    120. ActiveWindow.ScrollRow = 40
    121. ActiveWindow.ScrollRow = 38
    122. ActiveWindow.ScrollRow = 37
    123. ActiveWindow.ScrollRow = 35
    124. ActiveWindow.ScrollRow = 33
    125. ActiveWindow.ScrollRow = 32
    126. ActiveWindow.ScrollRow = 31
    127. ActiveWindow.ScrollRow = 29
    128. ActiveWindow.ScrollRow = 28
    129. ActiveWindow.ScrollRow = 27
    130. ActiveWindow.ScrollRow = 25
    131. ActiveWindow.ScrollRow = 24
    132. ActiveWindow.ScrollRow = 22
    133. ActiveWindow.ScrollRow = 20
    134. ActiveWindow.ScrollRow = 19
    135. ActiveWindow.ScrollRow = 17
    136. ActiveWindow.ScrollRow = 16
    137. ActiveWindow.ScrollRow = 15
    138. ActiveWindow.ScrollRow = 13
    139. ActiveWindow.ScrollRow = 12
    140. ActiveWindow.ScrollRow = 11
    141. ActiveWindow.ScrollRow = 10
    142. ActiveWindow.ScrollRow = 8
    143. ActiveWindow.ScrollRow = 7
    144. ActiveWindow.ScrollRow = 6
    145. ActiveWindow.ScrollRow = 5
    146. ActiveWindow.ScrollRow = 4
    147. ActiveWindow.ScrollRow = 3
    148. ActiveWindow.ScrollRow = 2
    149. ActiveWindow.ScrollRow = 1
    150. Range("A1").Select
    151. End Sub



    Mein Problem bei dem ganzen ist nun, dass ich gerne keine "fixe" Zeilennummer als "Endpunkt" haben möchte, sondern dass ich stattdessen, eine Variable, der beliebig ein Wert zugewiesen werden kann, haben möchte.

    Meine Idee/Ansatz ist nun folgender:
    Ich möchte eigentlich durch die Row Count Funktion, das letzte befüllte Feld einer Spalte ermitteln. Dieser Wert muss dann in eine Variable gespeichert werden und soll durch eine Art Schleife, die Autofill-Funktionalität (also das Runterziehen) bis zu der "Endposition" laufen lassen. Diese "Endposition" wird durch den Wert der Variable (nur die Zeilennummer) definiert!


    Hat jemand eine Idee, wie ich das im Code umsetzen muss, damit ich "das runterziehen" von markierten Zellen, automatisiert, bis zu dem Wert, der eben auch automatisch durch die Row Count Funktionalität ermittelt wird, ausführen kann??

    Vorab noch: Ich bin totaler VBA Anfänger!


    Vielen Dank schon mal im Voraus an die Experten!!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ereza“ ()

    ereza schrieb:

    Ich bin totaler VBA Anfänger
    Wäre ich jetzt nicht drauf gekommen ;)

    ereza schrieb:

    Range("T2").Select
    ActiveCell.FormulaR1C1 = _
    "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"
    Solche Konstrukte sind tödlich
    Besser: Range("T2").FormulaR1C1 = "=INDEX('1_Alle_Aufträge_zu_Equipments'!C[-19],MATCH(RC1,'1_Alle_Aufträge_zu_Equipments'!C10,0))"

    Für den FillDown:

    ereza schrieb:

    das letzte befüllte Feld einer Spalte
    Welche Spalte? Ich nehme mal als Beispiel Spalte 1
    ​Range("T2:AD" & Cells(Rows.Count,1).End(xlUp).Row).FillDown
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja Hammer!! Das funktioniert ja perfekt!! - Obwohl ich noch nicht ganz begreife was
    Range("T2:AD" & Cells(Rows.Count,1).End(xlUp).Row).FillDown

    eigentlich genau macht... ich verstehs dass man schreibt im Bereich T2 bis AD, aber ich wusste nicht dass man mit .filldown dann einfach diesem Vorgang noch diese Art "Eigenschaft" dranhängen kann...

    Aber find ich echt cool! Und vor allem recht interessant, wie VBA "arbeitet"...


    Nochmaliges großes DANKESCHÖN an petaod !!


    Und ich hätte mir auch gar nicht gedacht, dass das von der Idee her so einfach sein kann... Ich dachte nämlich wirklich, dass man zuerst durch eine Funktion das "Zeilenende" rausfinden muss, dann diesen Wert in einer Variablen speichern muss und dann eine for-schleife bauen muss, die bis zu diesem Wert durchläuft... ALSO: WIEDER was GELERNT!! Großartig!!

    DANKE!!
    Indirekt ist's schon so ähnlich gemacht. Nur halt unter gnadenloser Ausnutzung des Excel-Objektmodells.
    ​Cells(Rows.Count,1).End(xlUp) nimmt die allerletzte Zeile und sucht nach oben die erste befüllte Zelle.
    ​Cells(Rows.Count,1).End(xlUp).Row ist die Zeilennummer dieser Zelle.
    Nehmen wir an diese Zeilennummer wäre 999
    Damit löst sich ​Range("T2:AD" & Cells(Rows.Count,1).End(xlUp).Row) auf zu ​Range("T2:AD999")
    Und ​Range("T2:AD999").FillDown ist einfach die Filldown-Methode angewandt auf diesen Bereich.

    Wenn ich es als Dreizeiler geschrieben hätte, wär's vielleicht einfacher zu lesen gewesen.
    Aber ich bin halt faul ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --