Excel / VBA - beschleunigen

  • Excel

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Excel / VBA - beschleunigen

    Liebes Forum,

    Ich habe einen ziemlich langen Code...

    und wenn ich diesen ausführe und ich habe sehr viele Daten (somit wirklich sehr viele befüllte Zeilen... die abgearbeitet werden....) dann friert Excel "offiziell" ein.... - also man möchte meinen, dass Excel abgestürzt ist... jedoch arbeitet es im Hintergrund weiter! Das habe ich schon mit bereits weniger Daten ausprobiert... da ist es auch so... Excel friert ein... und dann nach einer gewissen Zeit, ist er fertig und alles wieder OK!

    So...

    Nun habe ich aber das Problem, dass ich eine Megaberechnung habe... die bereits schon über 20Tage lang non-stop läuft...

    der Witz an der Sache ist der... dass... wenn ich mir beim Taskmanager die Prozessor-Auslastung von Excel ansehe... dann habe ich lediglich 13%

    Kann mir jemand von euch sagen, was ich tun kann, damit ich Excel, bzw. VBA, mehr Rechenleistung zuweisen kann??
    Habe im Inet recherchiert... und mal eine Idee aufgeschnappt... von wegen... man müsste wohl über die Registry was drehen...??!

    Achja... und Code-Verbesserung schließe ich jz mal bewusst aus... mir geht's wirklich darum, dass ich meine Hardware, die ich habe, auch vernünftig auslasten kann...

    alles läuft auf Excel 2013 (Office 64 bit) mit einem Intel i7 Quadcore Rechner... und genüüüügend Arbeitsspeicher... alles auf Win 7

    Wäre dankbar für einen gezielten Vorschlag, wie ich das wohl anstellen könnte!

    Vielen Dank!

    VG Tim

    PS:
    Multithreading ist im Excel natürlich auch aktiviert... (falls jemand auf die Idee kommen sollte...)
    Hallo,

    so ohne Code kann man da nicht viel zu sagen. 13 Prozent sind bei 8 Kernen ein voll ausgelasteter Kern. Was Du da seit zwanzig Tagen berechnet lässt, geht evtl. mit einer anderen Programmierspache schneller.

    Selbst wenn jetzt Tipps wie Fensteraktualisierung abschalten, keine Zellen als Variablen mißbrauchen, Code optimieren,... kommen, müsstest Du wohl wieder von vorne rechnen lassen. In zwanzig Tagen weißt Du dann, ob es was genützt hat. :D
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Also wenn ich das hier lese:

    ​So...Nun habe ich aber das Problem, dass ich eine Megaberechnung habe... die bereits schon über 20Tage lang non-stop läuft...


    Dann muss ich schon schmunzeln. Versuchst du einen 256 Bit Schlüssel zu knacken oder die Zukunft voraus zu sehen ? :D

    Nein also ernsthaft, sicher das du das mit Excel machen willst? Mir fällt hardware mäßig nicht viel ein bezüglich Excel außer das man die Prozess Priorität vll noch auf High setzen könnte.
    Das ist meine Signatur und sie wird wunderbar sein!

    ereza schrieb:

    Code-Verbesserung schließe ich jz mal bewusst aus
    Wenn du das als Lasttest verwenden willst, darfst du vielleicht genau das nicht.
    Dann musst du ggf. dafür sorgen, dass alle Funktionen, die in einen Waitstate gelangen können, vermieden werden.
    Was erzeugt den deine Grundlast?
    Wenn du das in reinem VBA versuchst, wird's eng, da du ohne Tricks kein Multithreading (und damit keine Parallelverarbeitung) machen kannst.
    Da passen die 13% (bzw. 12.5%) zu einem voll ausgelasteten Kern eines 8-Kern-System.

    Wenn du mehrere Kerne auslasten willst, musst du Excel die Last nativ erzeugen lassen, und wenn mit VBA dann höchstens durch parallel ausgeführte UDFs.

    Kannst du vielleicht mal präzisieren, wie deine bisherigen Versuche aussehen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    hi Leute...

    naja... also... Zukunft will ich ja nicht vorrausssehen... hahaha... aber... es reicht schon bei folgendem:

    im gebastelten screenshot... mal nur ein kleiner auszug... es soll bei den Aufträgen geschaut werden wie sich die Gesamtsummen (Euro-Beträge) zusammensetzen... dafür muss für jeden einzelnen Eintrag eine weitere Tabelle durchgegangen werden... bei der jeweils wieder alle zugehörigen Einzelbeträge rausgesucht werden und im 1.Durchlauf summiert werden... stimmt dann die Gesamtsumme mit der Summe der Teilsummen überein, so werden die Teilbeträge grün eingefärbelt usw....

    das ist jz aber nur ein kleiner auschnitt.... aber ich möchte damit sagen... dass eben viele Daten 100.000de von Zeilen sehr oft durchgeschaut werden müssen und verglichen wird, summiert wird oder ähnliches... und oftmals ist es so... dass eine zeile nach einer anderen von einer Megatabelle durchlaufen wird... dann wird für einen bestimmten Umstand/Wert etc. wieder eine andere Megatabelle durchgegangen... und für diese dann wieder eine... usw...
    --> also im Grunde ist es eine wahnsinnige Durchlauf bzw. Ablaufarbeit....

    Aber... ich habe das auch bewusst so programmiert, damit ich Fehler ausschließen kann etc.. und es oftmals gar nicht anders geht....

    Das ist aber auch der Grund, warum das ganze so aufwendig und langwierig ist....

    @petaod

    Wenn du mehrere Kerne auslasten willst, musst du Excel die Last nativ erzeugen lassen, und wenn mit VBA dann höchstens durch parallel ausgeführte UDFs.


    das klingt ja mal interessant.... was meinst du damit genau... und was sind UDF's?
    kannst du mir hierfür ein einfaches Beispiel nennen?


    und... wollte mal generell fragen... gibt's da echt keinen Schmäh wie ich Excel pimpen kann... vl. gibt's ja spezielle Modifikationen in der Registry etc.? oder vl. eine Art plugin etc., so dass man die Verarbeitung multithreading gestützt laufen lassen kann...??!

    Vielen Dank, schon mal für die bisherigen Ideen....



    PS:

    Wenn es hilfreich ist... hier mein Code...
    Aber... der ist vieeel zu lange... also... soll nur dazu dienen... dass ihr a bissl die Struktur von dem ganzen seht... und seht... dass hier viele schleifen abgearbeitet werden müssen usw.... - also nix jz zum reindenken...

    Spoiler anzeigen

    Quellcode

    1. '------------------------------------------------------------------------------------------------------------------------
    2. '- Falls bis zum Schritt 3 alles ausgeführt wurde... (Anweisungen, für die Bereinigung, aus Schritt 3 entnommen.... -
    3. '------------------------------------------------------------------------------------------------------------------------
    4. 'Ermittlung der letzten Trennspalte
    5. LetzteTrennSpalte = Tabelle17.Cells(1, Columns.Count).End(xlToLeft).Column + 1
    6. 'Ermittlung letzter Spalte... --> einfach LetzteTrennSpalte + 20
    7. LetzteSpalte = LetzteTrennSpalte + 20
    8. For a = 6 To LetzteTrennSpalte
    9. If Tabelle17.Cells(1, a).Interior.Pattern = xlGrid Then
    10. y_TrennSpalte = übergabe(a)
    11. Else
    12. End If
    13. Next
    14. If y_TrennSpalte > 6 Then
    15. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Interior.Pattern = xlNone
    16. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlDiagonalDown).LineStyle = xlNone
    17. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlDiagonalUp).LineStyle = xlNone
    18. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlEdgeLeft).LineStyle = xlNone
    19. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlEdgeTop).LineStyle = xlNone
    20. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlEdgeBottom).LineStyle = xlNone
    21. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlEdgeRight).LineStyle = xlNone
    22. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlInsideVertical).LineStyle = xlNone
    23. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, y_TrennSpalte)).Borders(xlInsideHorizontal).LineStyle = xlNone
    24. Tabelle17.Range(Tabelle17.Cells(1, y_TrennSpalte), Tabelle17.Cells(1048576, LetzteSpalte)).ClearContents
    25. Else
    26. End If
    27. Range("D2:D1048576").ClearContents
    28. Range(Tabelle17.Cells(2, 130), Tabelle17.Cells(1048576, 130)).ClearContents
    29. Range("E2:Z1048576").Interior.Color = xlNone
    30. Tabelle13.Range("BG2:BG1048576").ClearContents
    31. Tabelle13.Range("BG2:BG1048576").Font.Color = -11489280
    32. 'Vermeintliche Daten von vorher aus Tabelle13 löschen....
    33. Tabelle13.Range("BI1:BO1048576").ClearContents
    34. b = Tabelle13.Cells(Rows.Count, 55).End(xlUp).Row
    35. d = Tabelle17.Cells(Rows.Count, 5).End(xlUp).Row
    36. h = Tabelle17.Cells(1, Columns.Count).End(xlToLeft).Column
    37. anzahl_gesamt = b - 1
    38. Kennzeichen1 = False
    39. Kennzeichen2 = False
    40. kz_ü = False
    41. kz_BetragGleichGesamtbetrag = False
    42. hilfswert_index = 2
    43. 'Schaue Tabelle von "6 - Sämtliche Bestellungen" --> Spalte BB und BD an....
    44. For a = 2 To b
    45. AUFNR_BC = Tabelle13.Cells(a, 55)
    46. Gesamtbetrag_BD = Tabelle13.Cells(a, 56)
    47. 'Schaue Tabelle von "7 - Erw. Darstellung Aufträge" --> Zeile für Zeile, von Zeile 2 weg, aus an....
    48. For c = 2 To d
    49. AUFNR_aktuell = Tabelle17.Cells(c, 5)
    50. 'Wenn Auftragsnummer von "7 - Erw. Darstellung Aufträge" = Auftragsnummer von "6 - Sämtliche Bestellungen"
    51. If AUFNR_aktuell = AUFNR_BC Then
    52. 'Schaue dir jeweils alle Spaltenwerte von der betroffenen Zeile an...
    53. Gesamtbetrag_BD_gerundet = Round(Gesamtbetrag_BD, 2)
    54. 'Prüfe zuerst ob einer von den Spalteneinträgen dem Gesamtbetrag entspricht....
    55. For k = 6 To h
    56. Betrag_aktuell = Tabelle17.Cells(c, k)
    57. Betrag_aktuell_gerundet = Round(Betrag_aktuell, 2)
    58. If Betrag_aktuell_gerundet = Gesamtbetrag_BD_gerundet And Tabelle17.Cells(1, k) <> "Lohnkosten, eigen" Then
    59. kz_BetragGleichGesamtbetrag = True
    60. Else
    61. End If
    62. Next
    63. 'Fall 1: Der Gesamtbetrag von "6 - Sämtliche Bestellungen" entspricht dem aktuell betrachteten Betrag
    64. If kz_BetragGleichGesamtbetrag = True Then
    65. For y = 6 To h
    66. Betrag_aktuell = Tabelle17.Cells(c, y)
    67. Betrag_aktuell_gerundet = Round(Betrag_aktuell, 2)
    68. If Betrag_aktuell_gerundet = Gesamtbetrag_BD_gerundet And Tabelle17.Cells(1, y) <> "Lohnkosten, eigen" Then
    69. Kennzeichen1 = True
    70. 'Wert für Löschkennzeichen Eintragen...
    71. Tabelle17.Cells(c, 4) = Tabelle13.Cells(a, 53)
    72. 'Auftragsnummer in gelb einfärben...
    73. Tabelle17.Range(Tabelle17.Cells(c, 5), Tabelle17.Cells(c, 5)).Interior.Color = 65535
    74. 'Betrag in grün einfärben...
    75. Tabelle17.Range(Tabelle17.Cells(c, y), Tabelle17.Cells(c, y)).Interior.Color = 5287936
    76. Else
    77. Kennzeichen1 = False
    78. End If
    79. Next
    80. Else
    81. End If
    82. 'Fall 2: Prüfe ob Zeile eingefärbelt ist.... Wenn nicht, dann..
    83. ' Addiere die Beträge und schaue ob Summe gleich Gesamtbetrag von "6 - Sämtliche Bestellungen" entspricht...
    84. If kz_BetragGleichGesamtbetrag = False Then
    85. For y = 6 To h
    86. If Kennzeichen1 = False Then
    87. If Tabelle17.Cells(1, y) <> "Lohnkosten, eigen" Then
    88. Betrag_aktuell = Tabelle17.Cells(c, y)
    89. Gesamtbetrag_aktuell = Gesamtbetrag_aktuell + Betrag_aktuell
    90. Gesamtbetrag_aktuell_gerundet = Round(Gesamtbetrag_aktuell, 2)
    91. If Gesamtbetrag_aktuell_gerundet = Gesamtbetrag_BD_gerundet Then
    92. 'Wert für Löschkennzeichen Eintragen...
    93. Tabelle17.Cells(c, 4) = Tabelle13.Cells(a, 53)
    94. 'Auftragsnummer in gelb einfärben...
    95. Tabelle17.Range(Tabelle17.Cells(c, 5), Tabelle17.Cells(c, 5)).Interior.Color = 65535
    96. 'Betrag in grün einfärben...
    97. Tabelle17.Range(Tabelle17.Cells(c, y), Tabelle17.Cells(c, y)).Interior.Color = 5287936
    98. If Kennzeichen2 = True And Tabelle17.Range(Tabelle17.Cells(c, 5), Tabelle17.Cells(c, 5)).Interior.Color = 65535 Then
    99. For f = 2 To Tabelle17.Cells(Rows.Count, 130).End(xlUp).Row
    100. merke_y = Cells(f, 130)
    101. Tabelle17.Range(Tabelle17.Cells(c, merke_y), Tabelle17.Cells(c, merke_y)).Interior.Color = 5287936
    102. Next
    103. Kennzeichen2 = False
    104. Tabelle17.Range(Tabelle17.Cells(2, 130), Tabelle17.Cells(1048576, 130)).ClearContents
    105. Else
    106. End If
    107. Else
    108. 'Wenn später die Teilsummen markiert werden müssen, wird hier der Index in die Spalte "DZ"
    109. Tabelle17.Cells(hilfswert_index, 130).Value = y
    110. Kennzeichen2 = True
    111. hilfswert_index = hilfswert_index + 1
    112. End If
    113. Else
    114. End If
    115. Else
    116. End If
    117. Next
    118. Gesamtbetrag_aktuell = 0
    119. hilfswert_index = 2
    120. End If
    121. 'kz_BetragGleichGesamtbetrag wieder für den nächsten Schleifendurchgang auf False setzen!
    122. kz_BetragGleichGesamtbetrag = False
    123. Else
    124. End If
    125. 'Fehlerhafte 0€-Einfärbungen entfernen...
    126. For g = 6 To h
    127. If Tabelle17.Cells(c, g).Value = "" Or Tabelle17.Cells(c, g).Value = 0 And Tabelle17.Range(Tabelle17.Cells(c, g), Tabelle17.Cells(c, g)).Interior.Color <> xlNone Then
    128. Tabelle17.Range(Tabelle17.Cells(c, g), Tabelle17.Cells(c, g)).Interior.Color = xlNone
    129. Else
    130. End If
    131. Next
    132. Next
    133. anzahl_durchgang = anzahl_durchgang + 1
    134. prozentwert = Round(((anzahl_durchgang / anzahl_gesamt) * 100), 2)
    135. Tabelle17.Range("B22").Value = "Vorgang 1/4: " & prozentwert & "%"
    136. Next
    137. '------------------------------------------------------------------------------------------------
    138. '- Überprüfung ob wirklich alle Auftragsnummer, wo Bestellungen drauf waren eingefärbt wurden!! -
    139. '------------------------------------------------------------------------------------------------
    140. 'Schleife für Tabelle13... --> Zeilen:
    141. anzahl_durchgang = 0
    142. anzahl_gesamt = b - 1
    143. For a = 2 To b
    144. AUFNR_BC = Tabelle13.Cells(a, 55)
    145. Gesamtbetrag_tab13 = Tabelle13.Cells(a, 56)
    146. Gesamtbetrag_tab13_gerundet = Round(Gesamtbetrag_tab13, 2)
    147. WertFürLKZ_tab13 = Tabelle13.Cells(a, 53)
    148. 'Schleife für Tabelle17... --> Zeilen:
    149. For c = 2 To d
    150. AUFNR_aktuell = Tabelle17.Cells(c, 5)
    151. If AUFNR_aktuell = AUFNR_BC Then
    152. 'Auftragsnummer gelb eingefärbt?
    153. If Tabelle17.Cells(c, 5).Interior.Color <> 65535 Then
    154. kz_gelb_NichtMarkiert = True
    155. Else
    156. End If
    157. 'aktuell betrachtete Auftragsnummer in Tabelle17 ist gelb markiert...
    158. If kz_gelb_NichtMarkiert = False Then
    159. 'Schleife für Tabelle17... --> Spalte:
    160. For y = 6 To h
    161. 'Betrag die grün sind ergeben Gesamtsumme?...
    162. If Tabelle17.Cells(c, y).Interior.Color = 5287936 Then
    163. BetragInGrün_Aktuell = Tabelle17.Cells(c, y)
    164. BetragInGrün_Gesamt = BetragInGrün_Gesamt + BetragInGrün_Aktuell
    165. Else
    166. End If
    167. Next
    168. Else
    169. End If
    170. 'Stimmt Gesamtbetrag von Tabelle13 mit den "grünen Gesamtbetrag" überein?
    171. BetragInGrün_Gesamt_gerundet = Round(BetragInGrün_Gesamt, 2)
    172. If BetragInGrün_Gesamt_gerundet = Gesamtbetrag_tab13_gerundet Then
    173. kz_GesamtbetragAusBestellungPasst = True
    174. Else
    175. kz_GesamtbetragAusBestellungPasst = False
    176. End If
    177. 'Stimmt Wert für Löschkennzeichen überein?
    178. WertFürLKZ_tab17 = Tabelle17.Cells(c, 4)
    179. If WertFürLKZ_tab17 = WertFürLKZ_tab13 Then
    180. kz_WertFürLKZPasst = True
    181. Else
    182. kz_WertFürLKZPasst = False
    183. End If
    184. 'Wenn alles Passt wird der grüne Haken gesetzt...
    185. If kz_gelb_NichtMarkiert = False And kz_GesamtbetragAusBestellungPasst = True And kz_WertFürLKZPasst = True Then
    186. Tabelle13.Cells(a, 59).Value = "ü"
    187. 'Wenn zwar gelb markiert wurde und der Wert für das Löschkennzeichen richtig gesetzt wurde... aber die Gesamtsummen nicht übereinstimmen...
    188. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = True And kz_GesamtbetragAusBestellungPasst = False Then
    189. Tabelle13.Cells(a, 59).Value = "x"
    190. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    191. 'Überschrift...
    192. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    193. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    194. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    195. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    196. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    197. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    198. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    199. 'Einträge...
    200. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    201. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    202. Tabelle13.Cells(indx, 62).Value = "JA"
    203. Tabelle13.Cells(indx, 63).Value = "JA"
    204. Tabelle13.Cells(indx, 64).Value = "NEIN"
    205. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    206. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    207. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    208. 'Wenn zwar gelb markiert wurde aber der Wert für das Löschkennzeichen nicht richtig gesetzt wurde... und die Gesamtsummen nicht übereinstimmen...
    209. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = False Then
    210. Tabelle13.Cells(a, 59).Value = "x"
    211. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    212. 'Überschrift...
    213. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    214. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    215. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    216. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    217. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    218. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    219. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    220. 'Einträge...
    221. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    222. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    223. Tabelle13.Cells(indx, 62).Value = "JA"
    224. Tabelle13.Cells(indx, 63).Value = "NEIN"
    225. Tabelle13.Cells(indx, 64).Value = "NEIN"
    226. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    227. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    228. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    229. 'Wenn zwar gelb markiert wurde aber der Wert für das Löschkennzeichen nicht richtig gesetzt wurde... aber die Gesamtsummen übereinstimmen...
    230. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = True Then
    231. Tabelle13.Cells(a, 59).Value = "x"
    232. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    233. 'Überschrift...
    234. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    235. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    236. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    237. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    238. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    239. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    240. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    241. 'Einträge...
    242. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    243. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    244. Tabelle13.Cells(indx, 62).Value = "JA"
    245. Tabelle13.Cells(indx, 63).Value = "NEIN"
    246. Tabelle13.Cells(indx, 64).Value = "JA"
    247. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    248. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    249. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    250. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ nicht gesetzt wurde und die Gesamtsummen nicht übereinstimmen....
    251. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = False Then
    252. Tabelle13.Cells(a, 59).Value = "x"
    253. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    254. 'Überschrift...
    255. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    256. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    257. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    258. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    259. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    260. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    261. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    262. 'Einträge...
    263. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    264. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    265. Tabelle13.Cells(indx, 62).Value = "NEIN"
    266. Tabelle13.Cells(indx, 63).Value = "NEIN"
    267. Tabelle13.Cells(indx, 64).Value = "NEIN"
    268. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    269. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    270. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    271. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ aber richtigt gesetzt wurde, die Gesamtsummen aber nicht übereinstimmen....
    272. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = True And kz_GesamtbetragAusBestellungPasst = False Then
    273. Tabelle13.Cells(a, 59).Value = "x"
    274. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    275. 'Überschrift...
    276. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    277. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    278. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    279. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    280. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    281. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    282. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    283. 'Einträge...
    284. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    285. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    286. Tabelle13.Cells(indx, 62).Value = "NEIN"
    287. Tabelle13.Cells(indx, 63).Value = "JA"
    288. Tabelle13.Cells(indx, 64).Value = "NEIN"
    289. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    290. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    291. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    292. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ nicht gesetzt wurde, aber die Gesamtsummen übereinstimmen....
    293. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = True Then
    294. Tabelle13.Cells(a, 59).Value = "x"
    295. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    296. 'Überschrift...
    297. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    298. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    299. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    300. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    301. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    302. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    303. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    304. 'Einträge...
    305. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    306. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    307. Tabelle13.Cells(indx, 62).Value = "NEIN"
    308. Tabelle13.Cells(indx, 63).Value = "NEIN"
    309. Tabelle13.Cells(indx, 64).Value = "JA"
    310. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    311. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    312. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    313. Else
    314. Tabelle13.Cells(a, 59).Value = "x"
    315. 'Überschrift...
    316. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    317. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    318. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    319. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    320. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    321. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    322. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    323. 'Einträge...
    324. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    325. Tabelle13.Cells(indx, 61).Value = "Fehler in der Zeile: "
    326. Tabelle13.Cells(indx, 62).Value = c
    327. Tabelle13.Cells(indx, 63).Value = "im Tab 7!"
    328. Tabelle13.Cells(indx, 64).Value = "--> diese AufNR:"
    329. Tabelle13.Cells(indx, 65).Value = "AUFNR_aktuell"
    330. Tabelle13.Cells(indx, 66).Value = "muss überprüft"
    331. Tabelle13.Cells(indx, 67).Value = "werden!!"
    332. End If
    333. Else
    334. End If
    335. BetragInGrün_Gesamt = 0
    336. BetragInGrün_Gesamt_gerundet = 0
    337. kz_gelb_NichtMarkiert = False
    338. kz_GesamtbetragAusBestellungPasst = False
    339. kz_WertFürLKZPasst = False
    340. Next
    341. WertFürLKZ_tab13 = ""
    342. anzahl_durchgang = anzahl_durchgang + 1
    343. prozentwert = Round(((anzahl_durchgang / anzahl_gesamt) * 100), 2)
    344. Tabelle17.Range("B22").Value = "Vorgang 2/4: " & prozentwert & "%"
    345. Next
    346. 'Überprüfen ob alles einwandfrei abgearbeitet wurde...
    347. kz_ü = False
    348. For a = 2 To b
    349. If Tabelle13.Cells(a, 59) = "x" Then
    350. kz_ü = True
    351. Else
    352. End If
    353. Next
    354. '---------------------------------
    355. '- KORREKTUR -
    356. '---------------------------------
    357. 'Automatisiert Fehler berichtigen...., indem, dass alle Einzelwerte in der betroffenen Zeile von Tabelle17 addiert werden... außer, wenn das Feld leer ist oder wenn es sich
    358. 'unter der Überschriftsspalte "Lohnkosten, eigen" befindet...
    359. If kz_ü = True Then
    360. zeilenmaxBI = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row
    361. d = Tabelle17.Cells(Rows.Count, 5).End(xlUp).Row
    362. h = Tabelle17.Cells(1, Columns.Count).End(xlToLeft).Column
    363. anzahl_durchgang = 0
    364. anzahl_gesamt = zeilenmaxBI - 1
    365. For a = 2 To zeilenmaxBI
    366. GelbJaNein = Tabelle13.Cells(a, 62)
    367. If GelbJaNein = "NEIN" Then
    368. Referenzsumme = Round(Tabelle13.Cells(a, 66), 2)
    369. AufNr_tab13_BI = Tabelle13.Cells(a, 61)
    370. WertFürLKZ_tab13 = Tabelle13.Cells(a, 67)
    371. 'ZeilenSchleife für Tab 7....
    372. For b = 2 To d
    373. AufrNr_tab17 = Tabelle17.Cells(b, 5)
    374. If AufrNr_tab17 = AufNr_tab13_BI Then
    375. 'SpaltenSchleife für Tab 7....
    376. For y = 6 To h
    377. If Tabelle17.Cells(1, y).Value <> "Lohnkosten, eigen" And Tabelle17.Cells(b, y) <> "" Then
    378. WertAktuell_tab17 = Round(Tabelle17.Cells(b, y), 2)
    379. GesamtWertAktuell_tab17 = Round((GesamtWertAktuell_tab17 + WertAktuell_tab17), 2)
    380. If GesamtWertAktuell_tab17 = Referenzsumme Then
    381. 'Wert für Löschkennzeichen Eintragen...
    382. Tabelle17.Cells(b, 4) = WertFürLKZ_tab13
    383. 'Auftragsnummer in gelb einfärben...
    384. Tabelle17.Cells(b, 5).Interior.Color = 65535
    385. 'Betrag in grün einfärben...
    386. Tabelle17.Cells(b, y).Interior.Color = 5287936
    387. 'wenn es sich nicht um die 'erste Spalte mit einem Wert' --> Spalte 6 handelt...
    388. If y > 6 Then
    389. kz_NachträglichEinfärben = True
    390. Else
    391. End If
    392. 'merke dir die Spaltennummern, wo Beträge standen, welche aufsummiert wurden...
    393. Else
    394. Tabelle17.Cells(1, 500).Value = "Hilfsspalte - Spaltennummern für später...:"
    395. indx2 = Tabelle17.Cells(Rows.Count, 500).End(xlUp).Row + 1
    396. Tabelle17.Cells(indx2, 500).Value = y
    397. End If
    398. Else
    399. End If
    400. Next
    401. Else
    402. End If
    403. If kz_NachträglichEinfärben = True Then
    404. zeilenEndeHSp = Tabelle17.Cells(Rows.Count, 500).End(xlUp).Row
    405. For aa = 2 To zeilenEndeHSp
    406. 'hole abgearbeitete Spaltenwerte von betroffener Zeile...
    407. yy = Tabelle17.Cells(aa, 500)
    408. 'Färbe Betrag in grün einfärben...
    409. Tabelle17.Cells(b, yy).Interior.Color = 5287936
    410. Next
    411. Else
    412. End If
    413. 'Lösche Hilfsspalte...
    414. Tabelle17.Range(Tabelle17.Cells(1, 500), Tabelle17.Cells(1048576, 500)).ClearContents
    415. kz_NachträglichEinfärben = False
    416. Next
    417. 'Werte rücksetzen... für nächsten Zeilendurchgang...
    418. kz_NachträglichEinfärben = False
    419. WertAktuell_tab17 = 0
    420. GesamtWertAktuell_tab17 = 0
    421. Referenzsumme = 0
    422. WertFürLKZ_tab13 = ""
    423. zeilenEndeHSp = 0
    424. yy = 0
    425. 'Lösche Hilfsspalte...
    426. Tabelle17.Range(Tabelle17.Cells(1, 500), Tabelle17.Cells(1048576, 500)).ClearContents
    427. Else
    428. End If
    429. anzahl_durchgang = anzahl_durchgang + 1
    430. prozentwert = Round(((anzahl_durchgang / anzahl_gesamt) * 100), 2)
    431. Tabelle17.Range("B22").Value = "Vorgang 3/4: " & prozentwert & "%"
    432. Next
    433. Else
    434. Tabelle17.Range("B22").Value = "Vorgang 3/4: 100%"
    435. End If
    436. 'Löschung der Informationen, worauf die Korrektur sich bezogen hat....:
    437. Tabelle13.Range(Tabelle13.Cells(1, 61), Tabelle13.Cells(1048576, 67)).ClearContents
    438. 'Sämtliche Felder in Tabelle 17, welche grün markiert wurden, jedoch leer sind...
    439. 'd = Tabelle17.Cells(Rows.Count, 5).End(xlUp).Row
    440. h = Tabelle17.Cells(1, Columns.Count).End(xlToLeft).Column
    441. For a = 2 To d
    442. For y = 6 To h
    443. If Tabelle17.Cells(a, y) = "" Then
    444. Tabelle17.Cells(a, y).Interior.Color = xlNone
    445. Else
    446. End If
    447. Next
    448. Next
    449. '-----------------------------------------------------------------
    450. '- ERNEUTE (nach der autom. Korrektur) ÜBERPRÜFUNG -
    451. '-----------------------------------------------------------------
    452. 'Löschung der Hakerln und "x" vom vorherigen Durchgang...
    453. Tabelle13.Range(Tabelle13.Cells(2, 59), Tabelle13.Cells(1048576, 59)).ClearContents
    454. 'Schleife für Tabelle13... --> Zeilen:
    455. anzahl_durchgang = 0
    456. anzahl_gesamt = b - 1
    457. For a = 2 To b
    458. AUFNR_BC = Tabelle13.Cells(a, 55)
    459. Gesamtbetrag_tab13 = Tabelle13.Cells(a, 56)
    460. Gesamtbetrag_tab13_gerundet = Round(Gesamtbetrag_tab13, 2)
    461. WertFürLKZ_tab13 = Tabelle13.Cells(a, 53)
    462. 'Schleife für Tabelle17... --> Zeilen:
    463. For c = 2 To d
    464. AUFNR_aktuell = Tabelle17.Cells(c, 5)
    465. If AUFNR_aktuell = AUFNR_BC Then
    466. 'Auftragsnummer gelb eingefärbt?
    467. If Tabelle17.Cells(c, 5).Interior.Color <> 65535 Then
    468. kz_gelb_NichtMarkiert = True
    469. Else
    470. End If
    471. 'aktuell betrachtete Auftragsnummer in Tabelle17 ist gelb markiert...
    472. If kz_gelb_NichtMarkiert = False Then
    473. 'Schleife für Tabelle17... --> Spalte:
    474. For y = 6 To h
    475. 'Betrag die grün sind ergeben Gesamtsumme?...
    476. If Tabelle17.Cells(c, y).Interior.Color = 5287936 Then
    477. BetragInGrün_Aktuell = Tabelle17.Cells(c, y)
    478. BetragInGrün_Gesamt = BetragInGrün_Gesamt + BetragInGrün_Aktuell
    479. Else
    480. End If
    481. Next
    482. Else
    483. End If
    484. 'Stimmt Gesamtbetrag von Tabelle13 mit den "grünen Gesamtbetrag" überein?
    485. BetragInGrün_Gesamt_gerundet = Round(BetragInGrün_Gesamt, 2)
    486. If BetragInGrün_Gesamt_gerundet = Gesamtbetrag_tab13_gerundet Then
    487. kz_GesamtbetragAusBestellungPasst = True
    488. Else
    489. kz_GesamtbetragAusBestellungPasst = False
    490. End If
    491. 'Stimmt Wert für Löschkennzeichen überein?
    492. WertFürLKZ_tab17 = Tabelle17.Cells(c, 4)
    493. If WertFürLKZ_tab17 = WertFürLKZ_tab13 Then
    494. kz_WertFürLKZPasst = True
    495. Else
    496. kz_WertFürLKZPasst = False
    497. End If
    498. 'Wenn alles Passt wird der grüne Haken gesetzt...
    499. If kz_gelb_NichtMarkiert = False And kz_GesamtbetragAusBestellungPasst = True And kz_WertFürLKZPasst = True Then
    500. Tabelle13.Cells(a, 59).Value = "ü"
    501. 'grüne Schriftfarbe...
    502. Tabelle13.Cells(a, 59).Font.Color = -11489280
    503. 'Wenn zwar gelb markiert wurde und der Wert für das Löschkennzeichen richtig gesetzt wurde... aber die Gesamtsummen nicht übereinstimmen...
    504. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = True And kz_GesamtbetragAusBestellungPasst = False Then
    505. Tabelle13.Cells(a, 59).Value = "x"
    506. 'rote Schriftfarbe...
    507. Tabelle13.Cells(a, 59).Font.Color = -16776961
    508. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    509. 'Überschrift...
    510. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    511. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    512. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    513. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    514. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    515. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    516. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    517. 'Einträge...
    518. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    519. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    520. Tabelle13.Cells(indx, 62).Value = "JA"
    521. Tabelle13.Cells(indx, 63).Value = "JA"
    522. Tabelle13.Cells(indx, 64).Value = "NEIN"
    523. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    524. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    525. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    526. 'Wenn zwar gelb markiert wurde aber der Wert für das Löschkennzeichen nicht richtig gesetzt wurde... und die Gesamtsummen nicht übereinstimmen...
    527. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = False Then
    528. Tabelle13.Cells(a, 59).Value = "x"
    529. 'rote Schriftfarbe...
    530. Tabelle13.Cells(a, 59).Font.Color = -16776961
    531. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    532. 'Überschrift...
    533. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    534. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    535. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    536. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    537. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    538. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    539. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    540. 'Einträge...
    541. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    542. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    543. Tabelle13.Cells(indx, 62).Value = "JA"
    544. Tabelle13.Cells(indx, 63).Value = "NEIN"
    545. Tabelle13.Cells(indx, 64).Value = "NEIN"
    546. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    547. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    548. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    549. 'Wenn zwar gelb markiert wurde aber der Wert für das Löschkennzeichen nicht richtig gesetzt wurde... aber die Gesamtsummen übereinstimmen...
    550. ElseIf kz_gelb_NichtMarkiert = False And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = True Then
    551. Tabelle13.Cells(a, 59).Value = "x"
    552. 'rote Schriftfarbe...
    553. Tabelle13.Cells(a, 59).Font.Color = -16776961
    554. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    555. 'Überschrift...
    556. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    557. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    558. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    559. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    560. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    561. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    562. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    563. 'Einträge...
    564. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    565. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    566. Tabelle13.Cells(indx, 62).Value = "JA"
    567. Tabelle13.Cells(indx, 63).Value = "NEIN"
    568. Tabelle13.Cells(indx, 64).Value = "JA"
    569. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    570. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    571. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    572. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ nicht gesetzt wurde und die Gesamtsummen nicht übereinstimmen....
    573. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = False Then
    574. Tabelle13.Cells(a, 59).Value = "x"
    575. 'rote Schriftfarbe...
    576. Tabelle13.Cells(a, 59).Font.Color = -16776961
    577. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    578. 'Überschrift...
    579. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    580. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    581. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    582. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    583. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    584. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    585. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    586. 'Einträge...
    587. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    588. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    589. Tabelle13.Cells(indx, 62).Value = "NEIN"
    590. Tabelle13.Cells(indx, 63).Value = "NEIN"
    591. Tabelle13.Cells(indx, 64).Value = "NEIN"
    592. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    593. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    594. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    595. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ aber richtigt gesetzt wurde, die Gesamtsummen aber nicht übereinstimmen....
    596. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = True And kz_GesamtbetragAusBestellungPasst = False Then
    597. Tabelle13.Cells(a, 59).Value = "x"
    598. 'rote Schriftfarbe...
    599. Tabelle13.Cells(a, 59).Font.Color = -16776961
    600. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    601. 'Überschrift...
    602. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    603. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    604. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    605. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    606. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    607. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    608. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    609. 'Einträge...
    610. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    611. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    612. Tabelle13.Cells(indx, 62).Value = "NEIN"
    613. Tabelle13.Cells(indx, 63).Value = "JA"
    614. Tabelle13.Cells(indx, 64).Value = "NEIN"
    615. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    616. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    617. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    618. 'Wenn NICHT gelb markiert wurde, der Wert für LKZ nicht gesetzt wurde, aber die Gesamtsummen übereinstimmen....
    619. ElseIf kz_gelb_NichtMarkiert = True And kz_WertFürLKZPasst = False And kz_GesamtbetragAusBestellungPasst = True Then
    620. Tabelle13.Cells(a, 59).Value = "x"
    621. 'rote Schriftfarbe...
    622. Tabelle13.Cells(a, 59).Font.Color = -16776961
    623. 'Liste für misslungene Einträge... bzw. Einträge die manuell korrigiert werden müssen....
    624. 'Überschrift...
    625. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    626. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    627. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    628. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    629. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    630. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    631. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    632. 'Einträge...
    633. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    634. Tabelle13.Cells(indx, 61).Value = AUFNR_aktuell
    635. Tabelle13.Cells(indx, 62).Value = "NEIN"
    636. Tabelle13.Cells(indx, 63).Value = "NEIN"
    637. Tabelle13.Cells(indx, 64).Value = "JA"
    638. Tabelle13.Cells(indx, 65).Value = BetragInGrün_Gesamt
    639. Tabelle13.Cells(indx, 66).Value = Gesamtbetrag_tab13_gerundet
    640. Tabelle13.Cells(indx, 67).Value = WertFürLKZ_tab13
    641. Else
    642. Tabelle13.Cells(a, 59).Value = "x"
    643. 'rote Schriftfarbe...
    644. Tabelle13.Cells(a, 59).Font.Color = -16776961
    645. 'Überschrift...
    646. Tabelle13.Cells(1, 61).Value = "Auftragsnummer, bei der manuell korrigiert werden muss:"
    647. Tabelle13.Cells(1, 62).Value = "AUFNR wurde gelb markiert? (JA/NEIN):"
    648. Tabelle13.Cells(1, 63).Value = "Wert für Löschkennzeichen wurde richtig gesetzt? (JA/NEIN):"
    649. Tabelle13.Cells(1, 64).Value = "Gesamtbetrag aus Bestellung stimmt überein? (JA/NEIN):"
    650. Tabelle13.Cells(1, 65).Value = "Aufsummierter Gesamtbetrag aus Tab 7:"
    651. Tabelle13.Cells(1, 66).Value = "Referenz-Gesamtbetrag aus diesem Tab:"
    652. Tabelle13.Cells(1, 67).Value = "Referenz-Wert für Löschkennzeichen aus diesem Tab:"
    653. 'Einträge...
    654. indx = Tabelle13.Cells(Rows.Count, 61).End(xlUp).Row + 1
    655. Tabelle13.Cells(indx, 61).Value = "Fehler in der Zeile: "
    656. Tabelle13.Cells(indx, 62).Value = c
    657. Tabelle13.Cells(indx, 63).Value = "im Tab 7!"
    658. Tabelle13.Cells(indx, 64).Value = "--> diese AufNR:"
    659. Tabelle13.Cells(indx, 65).Value = "AUFNR_aktuell"
    660. Tabelle13.Cells(indx, 66).Value = "muss überprüft"
    661. Tabelle13.Cells(indx, 67).Value = "werden!!"
    662. End If
    663. Else
    664. End If
    665. BetragInGrün_Gesamt = 0
    666. BetragInGrün_Gesamt_gerundet = 0
    667. kz_gelb_NichtMarkiert = False
    668. kz_GesamtbetragAusBestellungPasst = False
    669. kz_WertFürLKZPasst = False
    670. Next
    671. anzahl_durchgang = anzahl_durchgang + 1
    672. prozentwert = Round(((anzahl_durchgang / anzahl_gesamt) * 100), 2)
    673. Tabelle17.Range("B22").Value = "Vorgang 4/4: " & prozentwert & "%"
    674. Next
    675. 'Überprüfen ob alles einwandfrei abgearbeitet wurde...
    676. kz_ü = False
    677. For a = 2 To b
    678. If Tabelle13.Cells(a, 59) = "x" Then
    679. kz_ü = True
    680. Else
    681. End If
    682. Next



    NACHTRAG:

    @petaod
    Meinst du mit UDF user defined function?

    Falls ja... wie kann ich das parallelisieren?? wie geht das??
    Bilder
    • Zeichnung1.jpg

      435,17 kB, 2.196×985, 238 mal angesehen

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

    ereza schrieb:

    Meinst du mit UDF user defined function?
    Falls ja... wie kann ich das parallelisieren?
    Du kannst es nicht parallelisieren.
    Das kann nur Excel selbst.
    Wenn du viele Formeln hast, die unabhängig voneinander berechnet werden können, werden die von Excel während der Kalkulationsphase parallelisiert.
    Ob Excel so schlau ist, das auch für UDFs zu analysieren, weiss ich nicht.

    Generell gilt für Parallelisierung:
    Was parallel läuft, muss unabhängig voneinander sein.
    Wenn du das willst, musst du deinen Code erst mal in mehrere (8) verschiedene Elemente aufteilen, die zumindest theoretisch unabhängig voneinander laufen können müssen, also nicht voneinander abhängig sind.
    Das ist bei dir schon mal nicht gegeben, da du alles sequentiell abarbeitest.

    Stell dir eine Methode vor, die als Aufrufparameter einen bestimmten Range mit bekommt (beispielsweise die Zeilen 1-100).
    In dieser Funktion arbeitest du diesen Bereich ab.

    Visual Basic-Quellcode

    1. ​Sub ProcessRange(ByVal Rng As Range)
    2. For Each c in Rng
    3. Debug.Print c.Value 'do whatever you want
    4. Next
    5. End Sub


    Diese Methode kann von mehreren Methoden aufgerufen werden.

    Visual Basic-Quellcode

    1. ​Sub ProcessFirst
    2. ProcessRange Range("1:200")
    3. End Sub
    4. Sub ProcessSecond
    5. ProcessRange Range("201:400")
    6. End Sub

    Damit wäre zumindest rein theoretisch eine parallele Verarbeitung möglich.

    Nur kann VBA halt nicht mehrere Threads parallel fahren.


    Falls du dich zu den VBA-Gurus zählst (was ich aufgrund deines obigen Codes allerdings bezweifle):
    Es gibt einen VonHintenDurchDieBrustInsAugeTrick, der allerdings etwas Programmiererfahrung erfordert.
    Du kannst einem WinApi-Timer eine Callback-Routine aus deinem Code mitgeben. (Stichwort SetTimer)
    Der Clou bei der Sache ist, dass die Abarbeitung der Eventroutine in einem eigenen Thread erfolgt.

    Wenn du genügend Timer aufsetzt, kannst du damit beliebig viele Threads erzeugen.
    Achte aber darauf, dass jeder Timer nur einmal feuert (und am besten beim ersten Feuern wieder gestoppt wird), sonst wirst du von der Parallelität erschlagen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Hi petaod!

    Also... Ich zähle mich definitiv NICHT zu den VBA-Gurus - da bin ich noch seeeehhr weit entfernt... ;)

    Aber ich denke ich kann der Grundidee von dir folgen... meinst du folgendes?:

    Ich teile einen Schleifendurchlauf in, sagen wir mal 4 Teile auf... - durch set range...
    Dann erzeuge ich durch SetTimer 4 verschiedene Threads, in dem dann durch eine Rückruffunktion der jeweilige Bereich abgearbeitet wird... --> somit... pro Range, 1 Thread... oder?
    und dadurch könnte ich dann die Arbeit aufteilen und gleichzeitig laufen lassen...

    Hab ich das jz richtig verstanden?




    NACHTRAG:

    Ich habe soeben noch eine andere Herangehensweise aufgeschnappt.... nämlich... dass man ein Addin für Excel über VSTO (Visual Studio for Office) programmieren könnte... denn da hätte ich anscheinend die volle Leistungsfähigkeit von Visual Studio zur Verfügung...

    was haltet ihr von dem Ansatz? würde so was Sinn machen? und vor allem, kann man dadurch erheblich bessere Performanz erreichen??


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

    Hallo,

    ich sehe das Problem eher in dem aktuellen Lösungsweg. Zugriffe auf Zellen dauern wesentlich länger als Zugriffe auf Variablen. Bei solchen 'Monsterberechungen' lade ich alles in Variablen und sperre die Autoberechnung und die Bildschirmaktualisierung. Nachdem ich die Zellen am Ende wieder befüllt habe, schalte ich das wieder ein.

    Plan B:
    So wie ich das verstanden habe, gab es Anfangs mal einige Summen, die wurden dann in Teilbeträge zerlegt und nun versuchst Du per Makro die Teilbeträge wieder zu den Summen zusammenzugruppieren. Da wäre es besser, wenn schon beim Aufteilen irgendwo ein 'GruppenMerker' gesetzt wird.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    hallo peterfido,

    es ist leider verkehrt rum... man hat als vorgabe einen Gesamtbetrag... und die Teilbeträge kommen wo anders her... haben aber eben einen Zusammenhang... - nämlich das sie möglicherweise teil des Gesamtbetrags sein können...
    und das checke ich damit eben...

    das Problem bei dem ganzen ist leider, dass die Daten eben in Zellen stehen müssen und so, muss jeder Wert erstmals eingelesen werden.... von dem her kann ich da leider nix bzw. nicht noch "mehr" in variablen packen.... :((

    aber danke für deinen vorschlag!

    aber... EINE FRAGE...:
    habe ich eigentlich auch eine Autoberechnung, wenn ich KEINE Formel da stehen habe?? weil sonst, könnte ich das zumindest mal probieren... mit dem Abschalten... ^^ ??

    VG Tim
    Hallo,

    keine Ahnung, nie ausgetestet. Wenn Du mehrere Durchläufe mit immer den selben Zellen hast, dann bringt es in jedem Fall etwas, die Werte in Variablen zwischenzuspeichern und dann damit die mehreren Durchläufe zu machen. Je nach Größe der Summen ist es auch schneller mit Ganzzahlen zu arbeiten. Dafür einfach alles mal 100 nehmen und probieren lassen. Rundungsfehler musst du evtl. progammtechnisch tolerieren. Machnmal fehlt ja am Ende ein Cent, wenn man die Einzelsummern addiert.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    hmm...

    naja... mal schauen...

    ich werds jz eh mal ausprobieren... bei einem anderen, simpleren Tab.... da lasse ich jz mal alle werte die da stehen in Arrays einlesen und dann arbeite ich damit (lasse was vergleichen....) - ich werde dann auch noch die "normale" variante programmieren.... und dann werde ich mal mit meiner Stoppuhr stoppen... *gggg* - mal schauen, was ich da für einen Performance-Anstieg erhalte.... werde euch noch bescheid geben, wenn ichs fertig habe...

    Frage hierzu.... kann ein Array beliebig groß sein?? gibt's da keine Speicherprobleme, bei großen Datensätzen? - also wenn ich beispielsweise die 1'048'576 Zeilen einlesen lassen möchte.... - theoretisch.... geht das dann, wenn die Länge von meinem Array so groß gewählt wird, oder gibt's da in der Praxis Komplikationen??

    VG Tim
    Hallo,

    wenn Du wirklich über eine Million Beträge zu einer Summe zuordnen möchtest, dann gehe ich davon aus, dass das Ergebnis so oder so nicht stimmen wird. Da werden dann viele Beträge (oder Lösungsmöglichkeiten) mehrfach vorhanden sein. Ansonsten probier es einfach aus. Kann nichts kaputtgehen, wenn Du mit Kopien der Daten testest.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    hallo,

    danke für eure Ideen...

    wie gesagt... ich teste es jz gerade.... allerdings bei einem anderen Tab, bei dem aber das idente Grundproblem, vom Prinzip her, vorliegt...:

    Man hat 2 Tabellen (Tabs), in welchen Nummern stehen....
    In der ersten befinden sich 22493 Einträge und in der zweiten 22543 Einträge. Wobei in der zweiten duplikate Nummern stehen...
    Es soll nun ein "Delta" ermittelt werden... Somit:
    Es sollen jene Nummern aus der ersten Tabelle ermittelt werden, welche unikat in der zweiten NICHT VORKOMMEN...

    Achja und bevor das alles gemacht wird... müssen die Rohdaten vom Format her erst mal umgewandelt werden, da diese leider nur als Text vorkommen...

    Der Lösungsweg wäre nun der, dass zuerst mal die Daten umgewandelt werden und dann die Kernaufgabe gelöst wird. Dafür, werden die Einträge bei der "herkömmlichen" Methode einfach aus Zeilen eingelesen, in Zeilen geschrieben usw... Somit, wird in den Tabellen drinnen gearbeitet....

    Bei der "schnellen" Methode... wird zuerst mal alles in Arrays eingelesen und dann wird mit den Arrays gearbeitet und am Schluss wird alles einfach ausgegeben, also Sprich, in die Zeilen geschrieben....

    Für diese Vorgänge wird eben die Zeit gestoppt...

    Ich mache also 4 Testdurchläufe:

    1.) Test der "herkömmlichen" Methode, OHNE DEAKTIVIERUNG des ScreenUpdates und der automatischen Berechnung
    2.) Test der "herkömmlichen" Methode, MIT DEAKTIVIERUNG des ScreenUpdates und der automatischen Berechnung
    3.) Test der Array-Methode, OHNE DEAKTIVIERUNG des ScreenUpdates und der automatischen Berechnung
    4.) Test der Array-Methode, MIT DEAKTIVIERUNG des ScreenUpdates und der automatischen Berechnung

    Also ich bin mal gespannt was da rauskommen wird...
    Ich lasse es euch wissen, weil falls es signifikante Unterschiede gäbe, ist ja mal ganz gut, dass man so was dokumentiert... ;)
    Mal ein ganz anderer Anstoss - willst Du vielleicht nicht explizit so hören, würde aber Dein Problem lösen:

    Wenn Du die Daten ohnehin erst aus Textdateien einlesen musst dann nimm doch gleich eine Datenbank! Excel ist nun mal nicht für solche DAtenmengen geschaffen. Und das was Du hier umständlich und zeitaufwendig programmierst das kann im Wesentlichen eine Datenbank mit Bordmitteln und wesentlich performanter als Excel erledigen.
    Am einfachsten für dich wäre vermutlich MS Access, das ist zwar auch nicht DIE Datenbank aber mit der genannten Menge an Daten kommt es noch locker zurecht und du müsstest dich nicht weiter umgewöhnen da Access auch VBA verwendet.

    Das nur mal am Rande...
    Es sieht so aus, als würdest Du irgendwie Duplikate suchen. Da kann man in Excel mit der Funktion 'Duplikate entfernen' oder der 'bedingten Formatierung' operieren (funktioniert ziemlich schnell) . Etwas versteckter ist der 'Zeilenvergleich' über 2 markierten Spalten. Mal so als Denkanstoß...Wenn das als Methode irgendwie klar ist, kann man später versuchen, das in VBA umzusetzen.
    hi Thisoft...

    naja.. so ist es ja nicht... ich habe meine Rohdaten als Excel Tabelle... Mir ist schon klar, dass ich das auch im Access lösen könnte... nur... das Problem bei dem Ganzen ist:
    das ich damals als Grundlage Excel gewählt habe. Wenn ich jz anfange Teile davon ins Access auszulagern, dann kann ich eigentlich gleich hergehen und das komplette Ding NEU in Access programmieren... und bevor ich das wirklich mache... muss ich erst mal alle anderen Möglichkeiten abwägen und prüfen... weil... dieses Fass aufzumachen wäre nur denkbar wenn nix anderes dran vorbeiführt...
    Excel bietet mir generell, bis auf die Performanz bei wirklich großen Datensätzen, alles was ich brauche... und das wesentlich unkomplizierter als Access...

    @oliver3121
    Ja das ist mir schon klar, dass es diese Funktion gibt... - die wende ich ja auch schon bereits an... ;)
    aber danke für den Tipp! - ich werde später dann eh meinen code posten, wenn ich die testläufe fertig habe... ;)

    VG Tim







    ERGEBNIS:

    So Leute... Jz ist's soweit.. und ich muss ehrlich sagen ich bin sprachlos (im positiven Sinne...)!!

    Hier zunächst mal der CODE:

    "Herkömmliche Methode" - FALL 1:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub CommandButton3_Click()
    2. Dim a As Long
    3. Dim b As Long
    4. Dim zeilenmax_tab2 As Long
    5. Dim zeilenmax_tab3 As Long
    6. Dim Aufnr_tab2 As Long
    7. Dim Aufnr_tab3 As Long
    8. Dim kz_gefunden As Boolean
    9. Dim zeilenmax_hsp As Long
    10. Dim indx As Long
    11. Dim kz_LVexistiert As Boolean
    12. 'Schalte automatische Berechnung aus...
    13. 'Application.Calculation = xlCalculationManual
    14. 'Schalte automatische Bildschirmaktualisierung aus...
    15. 'Application.ScreenUpdating = False
    16. 'Lösche Inhalt...
    17. Tabelle4.Range(Tabelle4.Cells(2, 4), Tabelle4.Cells(1048576, 4)).ClearContents
    18. zeilenmax_tab2 = Tabelle2.Cells(Rows.Count, 10).End(xlUp).Row
    19. zeilenmax_tab3 = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row
    20. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 2
    21. 'und... Kontrolle ob ein Auftrag mit Löschvormerkung existiert...
    22. For a = 2 To zeilenmax_tab2
    23. If Tabelle2.Cells(a, 3) <> "" Then
    24. 'Planungswerk von Text in Zahl umwandeln...
    25. Tabelle2.Cells(a, 3).Value = Tabelle2.Cells(a, 3) * 1
    26. Else
    27. End If
    28. If Tabelle2.Cells(a, 4) <> "" Then
    29. 'Planergruppe von Text in Zahl umwandeln...
    30. Tabelle2.Cells(a, 4).Value = Tabelle2.Cells(a, 4) * 1
    31. Else
    32. End If
    33. If Tabelle2.Cells(a, 5) <> "" Then
    34. 'Kostenstelle von Text in Zahl umwandeln...
    35. Tabelle2.Cells(a, 5).Value = Tabelle2.Cells(a, 5) * 1
    36. Else
    37. End If
    38. If Tabelle2.Cells(a, 6) <> "" Then
    39. 'Verantwortliche Kostenstelle von Text in Zahl umwandeln...
    40. Tabelle2.Cells(a, 6).Value = Tabelle2.Cells(a, 6) * 1
    41. Else
    42. End If
    43. If Tabelle2.Cells(a, 7) <> "" Then
    44. 'Equipment von Text in Zahl umwandeln...
    45. Tabelle2.Cells(a, 7).Value = Tabelle2.Cells(a, 7) * 1
    46. Else
    47. End If
    48. If Tabelle2.Cells(a, 10) <> "" Then
    49. 'Auftragsnummern von Text in Zahl umwandeln...
    50. Tabelle2.Cells(a, 10).Value = Tabelle2.Cells(a, 10) * 1
    51. Else
    52. End If
    53. If Tabelle2.Cells(a, 2) <> "" Then
    54. kz_LVexistiert = True
    55. Else
    56. End If
    57. Next
    58. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 3
    59. For b = 2 To zeilenmax_tab3
    60. If Tabelle3.Cells(b, 1) <> "" Then
    61. 'Auftragsnummern von Text in Zahl umwandeln...
    62. Tabelle3.Cells(b, 1).Value = Tabelle3.Cells(b, 1) * 1
    63. Else
    64. End If
    65. If Tabelle3.Cells(b, 2) <> "" Then
    66. 'Jahr von Text in Zahl umwandeln...
    67. Tabelle3.Cells(b, 2).Value = Tabelle3.Cells(b, 2) * 1
    68. Else
    69. End If
    70. If Tabelle3.Cells(b, 3) <> "" Then
    71. 'Werttyp von Text in Zahl umwandeln...
    72. Tabelle3.Cells(b, 3).Value = Tabelle3.Cells(b, 3) * 1
    73. Else
    74. End If
    75. Next
    76. 'Kopieren in Hilfsspalte...
    77. Tabelle3.Cells(1, 52).Value = "Hilfsspalte für unikate Darstellung:"
    78. For b = 2 To zeilenmax_tab3
    79. Tabelle3.Cells(b, 52).Value = Tabelle3.Cells(b, 1)
    80. Next
    81. Tabelle3.Range(Tabelle3.Cells(2, 52), Tabelle3.Cells(zeilenmax_tab3, 52)).RemoveDuplicates Columns:=1, Header:=xlNo
    82. zeilenmax_hsp = Tabelle3.Cells(Rows.Count, 52).End(xlUp).Row
    83. For a = 2 To zeilenmax_tab2
    84. Aufnr_tab2 = Tabelle2.Cells(a, 10)
    85. For b = 2 To zeilenmax_hsp
    86. Aufnr_tab3 = Tabelle2.Cells(b, 10)
    87. If Aufnr_tab3 = Aufnr_tab2 Then
    88. kz_gefunden = True
    89. Exit For
    90. Else
    91. End If
    92. Next
    93. If kz_gefunden = False Then
    94. indx = Tabelle4.Cells(Rows.Count, 4).End(xlUp).Row + 1
    95. Tabelle4.Cells(indx, 4).Value = Aufnr_tab2
    96. Else
    97. End If
    98. kz_gefunden = False
    99. Next
    100. 'Löschen der Hilfsspalte
    101. Tabelle3.Range(Tabelle3.Cells(1, 52), Tabelle3.Cells(1048576, 52)).ClearContents
    102. 'Schalte automatische Berechnung wieder ein...
    103. 'Application.Calculation = xlCalculationAutomatic
    104. 'Schalte automatische Bildschirmaktualisierung wieder ein...
    105. 'Application.ScreenUpdating = True
    106. If kz_LVexistiert = True Then
    107. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang ausgeführt! - ABER, ACHTUNG!! - Es existiert mind. 1 Eintrag im Tab: '1 - Alle Aufträge zu Equipments', welcher einen Löschvormerk aufweist!! --> Daher:" & vbNewLine & vbNewLine & "Manuelle Überprüfung notwendig!!"), vbOKOnly
    108. Else
    109. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang erfolgreich ausgeführt!"), vbOKOnly
    110. End If
    111. End Sub



    Dann die Optimierung von diesem Code indem man ScreenUpdate und die autom. Berechnung deaktiviert und dann wieder aktiviert:

    "Herkömmliche Methode" mit Deaktivierung der autom. Berechnung und des ScreenUpdates - FALL 2:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub CommandButton3_Click()
    2. Dim a As Long
    3. Dim b As Long
    4. Dim zeilenmax_tab2 As Long
    5. Dim zeilenmax_tab3 As Long
    6. Dim Aufnr_tab2 As Long
    7. Dim Aufnr_tab3 As Long
    8. Dim kz_gefunden As Boolean
    9. Dim zeilenmax_hsp As Long
    10. Dim indx As Long
    11. Dim kz_LVexistiert As Boolean
    12. 'Schalte automatische Berechnung aus...
    13. Application.Calculation = xlCalculationManual
    14. 'Schalte automatische Bildschirmaktualisierung aus...
    15. Application.ScreenUpdating = False
    16. 'Lösche Inhalt...
    17. Tabelle4.Range(Tabelle4.Cells(2, 4), Tabelle4.Cells(1048576, 4)).ClearContents
    18. zeilenmax_tab2 = Tabelle2.Cells(Rows.Count, 10).End(xlUp).Row
    19. zeilenmax_tab3 = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row
    20. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 2
    21. 'und... Kontrolle ob ein Auftrag mit Löschvormerkung existiert...
    22. For a = 2 To zeilenmax_tab2
    23. If Tabelle2.Cells(a, 3) <> "" Then
    24. 'Planungswerk von Text in Zahl umwandeln...
    25. Tabelle2.Cells(a, 3).Value = Tabelle2.Cells(a, 3) * 1
    26. Else
    27. End If
    28. If Tabelle2.Cells(a, 4) <> "" Then
    29. 'Planergruppe von Text in Zahl umwandeln...
    30. Tabelle2.Cells(a, 4).Value = Tabelle2.Cells(a, 4) * 1
    31. Else
    32. End If
    33. If Tabelle2.Cells(a, 5) <> "" Then
    34. 'Kostenstelle von Text in Zahl umwandeln...
    35. Tabelle2.Cells(a, 5).Value = Tabelle2.Cells(a, 5) * 1
    36. Else
    37. End If
    38. If Tabelle2.Cells(a, 6) <> "" Then
    39. 'Verantwortliche Kostenstelle von Text in Zahl umwandeln...
    40. Tabelle2.Cells(a, 6).Value = Tabelle2.Cells(a, 6) * 1
    41. Else
    42. End If
    43. If Tabelle2.Cells(a, 7) <> "" Then
    44. 'Equipment von Text in Zahl umwandeln...
    45. Tabelle2.Cells(a, 7).Value = Tabelle2.Cells(a, 7) * 1
    46. Else
    47. End If
    48. If Tabelle2.Cells(a, 10) <> "" Then
    49. 'Auftragsnummern von Text in Zahl umwandeln...
    50. Tabelle2.Cells(a, 10).Value = Tabelle2.Cells(a, 10) * 1
    51. Else
    52. End If
    53. If Tabelle2.Cells(a, 2) <> "" Then
    54. kz_LVexistiert = True
    55. Else
    56. End If
    57. Next
    58. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 3
    59. For b = 2 To zeilenmax_tab3
    60. If Tabelle3.Cells(b, 1) <> "" Then
    61. 'Auftragsnummern von Text in Zahl umwandeln...
    62. Tabelle3.Cells(b, 1).Value = Tabelle3.Cells(b, 1) * 1
    63. Else
    64. End If
    65. If Tabelle3.Cells(b, 2) <> "" Then
    66. 'Jahr von Text in Zahl umwandeln...
    67. Tabelle3.Cells(b, 2).Value = Tabelle3.Cells(b, 2) * 1
    68. Else
    69. End If
    70. If Tabelle3.Cells(b, 3) <> "" Then
    71. 'Werttyp von Text in Zahl umwandeln...
    72. Tabelle3.Cells(b, 3).Value = Tabelle3.Cells(b, 3) * 1
    73. Else
    74. End If
    75. Next
    76. 'Kopieren in Hilfsspalte...
    77. Tabelle3.Cells(1, 52).Value = "Hilfsspalte für unikate Darstellung:"
    78. For b = 2 To zeilenmax_tab3
    79. Tabelle3.Cells(b, 52).Value = Tabelle3.Cells(b, 1)
    80. Next
    81. Tabelle3.Range(Tabelle3.Cells(2, 52), Tabelle3.Cells(zeilenmax_tab3, 52)).RemoveDuplicates Columns:=1, Header:=xlNo
    82. zeilenmax_hsp = Tabelle3.Cells(Rows.Count, 52).End(xlUp).Row
    83. For a = 2 To zeilenmax_tab2
    84. Aufnr_tab2 = Tabelle2.Cells(a, 10)
    85. For b = 2 To zeilenmax_hsp
    86. Aufnr_tab3 = Tabelle2.Cells(b, 10)
    87. If Aufnr_tab3 = Aufnr_tab2 Then
    88. kz_gefunden = True
    89. Exit For
    90. Else
    91. End If
    92. Next
    93. If kz_gefunden = False Then
    94. indx = Tabelle4.Cells(Rows.Count, 4).End(xlUp).Row + 1
    95. Tabelle4.Cells(indx, 4).Value = Aufnr_tab2
    96. Else
    97. End If
    98. kz_gefunden = False
    99. Next
    100. 'Löschen der Hilfsspalte
    101. Tabelle3.Range(Tabelle3.Cells(1, 52), Tabelle3.Cells(1048576, 52)).ClearContents
    102. 'Schalte automatische Berechnung wieder ein...
    103. Application.Calculation = xlCalculationAutomatic
    104. 'Schalte automatische Bildschirmaktualisierung wieder ein...
    105. Application.ScreenUpdating = True
    106. If kz_LVexistiert = True Then
    107. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang ausgeführt! - ABER, ACHTUNG!! - Es existiert mind. 1 Eintrag im Tab: '1 - Alle Aufträge zu Equipments', welcher einen Löschvormerk aufweist!! --> Daher:" & vbNewLine & vbNewLine & "Manuelle Überprüfung notwendig!!"), vbOKOnly
    108. Else
    109. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang erfolgreich ausgeführt!"), vbOKOnly
    110. End If
    111. End Sub



    Dann die Umsetzung mit Arrays...

    "Array Code" OHNE Deaktivierung von autom. Berechnung und ScreenUpdate - FALL 3:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub CommandButton2_Click()
    2. 'Button:
    3. Dim zeilenmax_tab2 As Long
    4. Dim zeilenmax_tab3 As Long
    5. Dim a As Long
    6. Dim b As Long
    7. Dim c As Long
    8. Dim d As Long
    9. Dim MaxLängeArray_tab2 As Long
    10. Dim MaxLängeArray_tab3 As Long
    11. Dim kz_LVexistiert As Boolean
    12. Dim Array_AUFNR_tab2() As Long
    13. Dim Array_AUFNR_tab3() As Long
    14. Dim zeilenmax_tab3_hilfsspalte As Long
    15. Dim arrayindex As Long
    16. Dim ErgebnisArray() As Long
    17. Dim arrayindex_1 As Long
    18. Dim arrayindex_2 As Long
    19. Dim KommtVor As Boolean
    20. Dim DifferenzAnzahl As Long
    21. Dim arrayindex_ergebnisarray As Long
    22. Dim Aufnr_aktuell_arrayTab2 As Long
    23. Dim Aufnr_aktuell_arrayTab3 As Long
    24. Dim Index As Long
    25. Dim indx As Long
    26. 'Schalte automatische Berechnung aus...
    27. 'Application.Calculation = xlCalculationManual
    28. 'Schalte automatische Bildschirmaktualisierung aus...
    29. 'Application.ScreenUpdating = False
    30. 'Lösche Inhalt...
    31. Tabelle4.Range(Tabelle4.Cells(2, 4), Tabelle4.Cells(1048576, 4)).ClearContents
    32. zeilenmax_tab2 = Tabelle2.Cells(Rows.Count, 10).End(xlUp).Row
    33. zeilenmax_tab3 = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row
    34. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 2
    35. 'und... Kontrolle ob ein Auftrag mit Löschvormerkung existiert...
    36. For a = 2 To zeilenmax_tab2
    37. If Tabelle2.Cells(a, 3) <> "" Then
    38. 'Planungswerk von Text in Zahl umwandeln...
    39. Tabelle2.Cells(a, 3).Value = Tabelle2.Cells(a, 3) * 1
    40. Else
    41. End If
    42. If Tabelle2.Cells(a, 4) <> "" Then
    43. 'Planergruppe von Text in Zahl umwandeln...
    44. Tabelle2.Cells(a, 4).Value = Tabelle2.Cells(a, 4) * 1
    45. Else
    46. End If
    47. If Tabelle2.Cells(a, 5) <> "" Then
    48. 'Kostenstelle von Text in Zahl umwandeln...
    49. Tabelle2.Cells(a, 5).Value = Tabelle2.Cells(a, 5) * 1
    50. Else
    51. End If
    52. If Tabelle2.Cells(a, 6) <> "" Then
    53. 'Verantwortliche Kostenstelle von Text in Zahl umwandeln...
    54. Tabelle2.Cells(a, 6).Value = Tabelle2.Cells(a, 6) * 1
    55. Else
    56. End If
    57. If Tabelle2.Cells(a, 7) <> "" Then
    58. 'Equipment von Text in Zahl umwandeln...
    59. Tabelle2.Cells(a, 7).Value = Tabelle2.Cells(a, 7) * 1
    60. Else
    61. End If
    62. If Tabelle2.Cells(a, 10) <> "" Then
    63. 'Auftragsnummern von Text in Zahl umwandeln...
    64. Tabelle2.Cells(a, 10).Value = Tabelle2.Cells(a, 10) * 1
    65. Else
    66. End If
    67. If Tabelle2.Cells(a, 2) <> "" Then
    68. kz_LVexistiert = True
    69. Else
    70. End If
    71. Next
    72. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 3
    73. For b = 2 To zeilenmax_tab3
    74. If Tabelle3.Cells(b, 1) <> "" Then
    75. 'Auftragsnummern von Text in Zahl umwandeln...
    76. Tabelle3.Cells(b, 1).Value = Tabelle3.Cells(b, 1) * 1
    77. Else
    78. End If
    79. If Tabelle3.Cells(b, 2) <> "" Then
    80. 'Jahr von Text in Zahl umwandeln...
    81. Tabelle3.Cells(b, 2).Value = Tabelle3.Cells(b, 2) * 1
    82. Else
    83. End If
    84. If Tabelle3.Cells(b, 3) <> "" Then
    85. 'Werttyp von Text in Zahl umwandeln...
    86. Tabelle3.Cells(b, 3).Value = Tabelle3.Cells(b, 3) * 1
    87. Else
    88. End If
    89. Next
    90. 'Einlesen aller Auftragsnummern und befüllen, des Arrays für Tabelle 2
    91. MaxLängeArray_tab2 = zeilenmax_tab2 - 1
    92. ReDim Array_AUFNR_tab2(1 To MaxLängeArray_tab2)
    93. arrayindex = 1
    94. For a = 2 To zeilenmax_tab2
    95. Array_AUFNR_tab2(arrayindex) = Tabelle2.Cells(a, 10)
    96. arrayindex = arrayindex + 1
    97. Next
    98. 'Kopieren der Auftragsnummern in die Hilfsspalte "AZ" in Tabelle 3
    99. 'Überschrift von AZ:
    100. Tabelle3.Cells(1, 52).Value = "Hilfsspalte (Unikate für Array...):"
    101. 'Kopieren der Auftragsnummern:
    102. For b = 2 To zeilenmax_tab3
    103. Tabelle3.Cells(b, 52).Value = Tabelle3.Cells(b, 1)
    104. Next
    105. Tabelle3.Range(Tabelle3.Cells(2, 52), Tabelle3.Cells(zeilenmax_tab3, 52)).RemoveDuplicates Columns:=1, Header:=xlNo
    106. 'Einlesen aller Auftragsnummern und befüllen, des Arrays für Tabelle 3
    107. zeilenmax_tab3_hilfsspalte = Tabelle3.Cells(Rows.Count, 52).End(xlUp).Row
    108. MaxLängeArray_tab3 = zeilenmax_tab3_hilfsspalte - 1
    109. ReDim Array_AUFNR_tab3(1 To MaxLängeArray_tab3)
    110. arrayindex = 1
    111. For b = 2 To zeilenmax_tab3_hilfsspalte
    112. Array_AUFNR_tab3(arrayindex) = Tabelle3.Cells(b, 52)
    113. arrayindex = arrayindex + 1
    114. Next
    115. 'Löschen der Hilfsspalte...
    116. Tabelle3.Range(Tabelle3.Cells(1, 52), Tabelle3.Cells(1048576, 52)).ClearContents
    117. 'Schau ob Auftragsnummer von Array für Tabelle 2 in Array für Tabelle 3 vorkommt...
    118. arrayindex_1 = 1
    119. arrayindex_2 = 1
    120. KommtVor = False
    121. 'Initial wird die Größe vom ErgebnisArray als DifferenzAnzahl von Einträgen von Tab2 zu UNIKATEN Einträgen von Tab3 dimensioniert...
    122. DifferenzAnzahl = zeilenmax_tab2 - zeilenmax_tab3_hilfsspalte
    123. ReDim ErgebnisArray(1 To DifferenzAnzahl)
    124. arrayindex_ergebnisarray = 1
    125. For c = 1 To MaxLängeArray_tab2
    126. Aufnr_aktuell_arrayTab2 = Array_AUFNR_tab2(arrayindex_1)
    127. For d = 1 To MaxLängeArray_tab3
    128. Aufnr_aktuell_arrayTab3 = Array_AUFNR_tab3(arrayindex_2)
    129. If Aufnr_aktuell_arrayTab3 = Aufnr_aktuell_arrayTab2 Then
    130. KommtVor = True
    131. Exit For
    132. Else
    133. arrayindex_2 = arrayindex_2 + 1
    134. End If
    135. Next
    136. 'Falls VBA den ganzen Schleifendurchgang von "For d = 1 To MaxLängeArray_tab3" nix gefunden haben sollte....
    137. 'schreibe die betroffenen Auftragsnummern in ein ErgebnisArray
    138. If KommtVor = False Then
    139. ErgebnisArray(arrayindex_ergebnisarray) = Aufnr_aktuell_arrayTab2
    140. arrayindex_ergebnisarray = arrayindex_ergebnisarray + 1
    141. Else
    142. End If
    143. arrayindex_1 = arrayindex_1 + 1
    144. arrayindex_2 = 1
    145. KommtVor = False
    146. Next
    147. 'Ausgabe der betroffenen Auftragsnummern...
    148. For Index = 1 To DifferenzAnzahl
    149. indx = Tabelle4.Cells(Rows.Count, 4).End(xlUp).Row + 1
    150. Tabelle4.Cells(indx, 4).Value = ErgebnisArray(Index)
    151. Next
    152. 'Schalte automatische Berechnung wieder ein...
    153. 'Application.Calculation = xlCalculationAutomatic
    154. 'Schalte automatische Bildschirmaktualisierung wieder ein...
    155. 'Application.ScreenUpdating = True
    156. If kz_LVexistiert = True Then
    157. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang ausgeführt! - ABER, ACHTUNG!! - Es existiert mind. 1 Eintrag im Tab: '1 - Alle Aufträge zu Equipments', welcher einen Löschvormerk aufweist!! --> Daher:" & vbNewLine & vbNewLine & "Manuelle Überprüfung notwendig!!"), vbOKOnly
    158. Else
    159. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang erfolgreich ausgeführt!"), vbOKOnly
    160. End If
    161. End Sub



    "Array Code" MIT Deaktivierung von autom. Berechnung und ScreenUpdate - FALL 4:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub CommandButton2_Click()
    2. 'Button:
    3. Dim zeilenmax_tab2 As Long
    4. Dim zeilenmax_tab3 As Long
    5. Dim a As Long
    6. Dim b As Long
    7. Dim c As Long
    8. Dim d As Long
    9. Dim MaxLängeArray_tab2 As Long
    10. Dim MaxLängeArray_tab3 As Long
    11. Dim kz_LVexistiert As Boolean
    12. Dim Array_AUFNR_tab2() As Long
    13. Dim Array_AUFNR_tab3() As Long
    14. Dim zeilenmax_tab3_hilfsspalte As Long
    15. Dim arrayindex As Long
    16. Dim ErgebnisArray() As Long
    17. Dim arrayindex_1 As Long
    18. Dim arrayindex_2 As Long
    19. Dim KommtVor As Boolean
    20. Dim DifferenzAnzahl As Long
    21. Dim arrayindex_ergebnisarray As Long
    22. Dim Aufnr_aktuell_arrayTab2 As Long
    23. Dim Aufnr_aktuell_arrayTab3 As Long
    24. Dim Index As Long
    25. Dim indx As Long
    26. 'Schalte automatische Berechnung aus...
    27. Application.Calculation = xlCalculationManual
    28. 'Schalte automatische Bildschirmaktualisierung aus...
    29. Application.ScreenUpdating = False
    30. 'Lösche Inhalt...
    31. Tabelle4.Range(Tabelle4.Cells(2, 4), Tabelle4.Cells(1048576, 4)).ClearContents
    32. zeilenmax_tab2 = Tabelle2.Cells(Rows.Count, 10).End(xlUp).Row
    33. zeilenmax_tab3 = Tabelle3.Cells(Rows.Count, 1).End(xlUp).Row
    34. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 2
    35. 'und... Kontrolle ob ein Auftrag mit Löschvormerkung existiert...
    36. For a = 2 To zeilenmax_tab2
    37. If Tabelle2.Cells(a, 3) <> "" Then
    38. 'Planungswerk von Text in Zahl umwandeln...
    39. Tabelle2.Cells(a, 3).Value = Tabelle2.Cells(a, 3) * 1
    40. Else
    41. End If
    42. If Tabelle2.Cells(a, 4) <> "" Then
    43. 'Planergruppe von Text in Zahl umwandeln...
    44. Tabelle2.Cells(a, 4).Value = Tabelle2.Cells(a, 4) * 1
    45. Else
    46. End If
    47. If Tabelle2.Cells(a, 5) <> "" Then
    48. 'Kostenstelle von Text in Zahl umwandeln...
    49. Tabelle2.Cells(a, 5).Value = Tabelle2.Cells(a, 5) * 1
    50. Else
    51. End If
    52. If Tabelle2.Cells(a, 6) <> "" Then
    53. 'Verantwortliche Kostenstelle von Text in Zahl umwandeln...
    54. Tabelle2.Cells(a, 6).Value = Tabelle2.Cells(a, 6) * 1
    55. Else
    56. End If
    57. If Tabelle2.Cells(a, 7) <> "" Then
    58. 'Equipment von Text in Zahl umwandeln...
    59. Tabelle2.Cells(a, 7).Value = Tabelle2.Cells(a, 7) * 1
    60. Else
    61. End If
    62. If Tabelle2.Cells(a, 10) <> "" Then
    63. 'Auftragsnummern von Text in Zahl umwandeln...
    64. Tabelle2.Cells(a, 10).Value = Tabelle2.Cells(a, 10) * 1
    65. Else
    66. End If
    67. If Tabelle2.Cells(a, 2) <> "" Then
    68. kz_LVexistiert = True
    69. Else
    70. End If
    71. Next
    72. 'Umwandeln der Auftragsnummern, usw. von Text in Zahl von Tabelle 3
    73. For b = 2 To zeilenmax_tab3
    74. If Tabelle3.Cells(b, 1) <> "" Then
    75. 'Auftragsnummern von Text in Zahl umwandeln...
    76. Tabelle3.Cells(b, 1).Value = Tabelle3.Cells(b, 1) * 1
    77. Else
    78. End If
    79. If Tabelle3.Cells(b, 2) <> "" Then
    80. 'Jahr von Text in Zahl umwandeln...
    81. Tabelle3.Cells(b, 2).Value = Tabelle3.Cells(b, 2) * 1
    82. Else
    83. End If
    84. If Tabelle3.Cells(b, 3) <> "" Then
    85. 'Werttyp von Text in Zahl umwandeln...
    86. Tabelle3.Cells(b, 3).Value = Tabelle3.Cells(b, 3) * 1
    87. Else
    88. End If
    89. Next
    90. 'Einlesen aller Auftragsnummern und befüllen, des Arrays für Tabelle 2
    91. MaxLängeArray_tab2 = zeilenmax_tab2 - 1
    92. ReDim Array_AUFNR_tab2(1 To MaxLängeArray_tab2)
    93. arrayindex = 1
    94. For a = 2 To zeilenmax_tab2
    95. Array_AUFNR_tab2(arrayindex) = Tabelle2.Cells(a, 10)
    96. arrayindex = arrayindex + 1
    97. Next
    98. 'Kopieren der Auftragsnummern in die Hilfsspalte "AZ" in Tabelle 3
    99. 'Überschrift von AZ:
    100. Tabelle3.Cells(1, 52).Value = "Hilfsspalte (Unikate für Array...):"
    101. 'Kopieren der Auftragsnummern:
    102. For b = 2 To zeilenmax_tab3
    103. Tabelle3.Cells(b, 52).Value = Tabelle3.Cells(b, 1)
    104. Next
    105. Tabelle3.Range(Tabelle3.Cells(2, 52), Tabelle3.Cells(zeilenmax_tab3, 52)).RemoveDuplicates Columns:=1, Header:=xlNo
    106. 'Einlesen aller Auftragsnummern und befüllen, des Arrays für Tabelle 3
    107. zeilenmax_tab3_hilfsspalte = Tabelle3.Cells(Rows.Count, 52).End(xlUp).Row
    108. MaxLängeArray_tab3 = zeilenmax_tab3_hilfsspalte - 1
    109. ReDim Array_AUFNR_tab3(1 To MaxLängeArray_tab3)
    110. arrayindex = 1
    111. For b = 2 To zeilenmax_tab3_hilfsspalte
    112. Array_AUFNR_tab3(arrayindex) = Tabelle3.Cells(b, 52)
    113. arrayindex = arrayindex + 1
    114. Next
    115. 'Löschen der Hilfsspalte...
    116. Tabelle3.Range(Tabelle3.Cells(1, 52), Tabelle3.Cells(1048576, 52)).ClearContents
    117. 'Schau ob Auftragsnummer von Array für Tabelle 2 in Array für Tabelle 3 vorkommt...
    118. arrayindex_1 = 1
    119. arrayindex_2 = 1
    120. KommtVor = False
    121. 'Initial wird die Größe vom ErgebnisArray als DifferenzAnzahl von Einträgen von Tab2 zu UNIKATEN Einträgen von Tab3 dimensioniert...
    122. DifferenzAnzahl = zeilenmax_tab2 - zeilenmax_tab3_hilfsspalte
    123. ReDim ErgebnisArray(1 To DifferenzAnzahl)
    124. arrayindex_ergebnisarray = 1
    125. For c = 1 To MaxLängeArray_tab2
    126. Aufnr_aktuell_arrayTab2 = Array_AUFNR_tab2(arrayindex_1)
    127. For d = 1 To MaxLängeArray_tab3
    128. Aufnr_aktuell_arrayTab3 = Array_AUFNR_tab3(arrayindex_2)
    129. If Aufnr_aktuell_arrayTab3 = Aufnr_aktuell_arrayTab2 Then
    130. KommtVor = True
    131. Exit For
    132. Else
    133. arrayindex_2 = arrayindex_2 + 1
    134. End If
    135. Next
    136. 'Falls VBA den ganzen Schleifendurchgang von "For d = 1 To MaxLängeArray_tab3" nix gefunden haben sollte....
    137. 'schreibe die betroffenen Auftragsnummern in ein ErgebnisArray
    138. If KommtVor = False Then
    139. ErgebnisArray(arrayindex_ergebnisarray) = Aufnr_aktuell_arrayTab2
    140. arrayindex_ergebnisarray = arrayindex_ergebnisarray + 1
    141. Else
    142. End If
    143. arrayindex_1 = arrayindex_1 + 1
    144. arrayindex_2 = 1
    145. KommtVor = False
    146. Next
    147. 'Ausgabe der betroffenen Auftragsnummern...
    148. For Index = 1 To DifferenzAnzahl
    149. indx = Tabelle4.Cells(Rows.Count, 4).End(xlUp).Row + 1
    150. Tabelle4.Cells(indx, 4).Value = ErgebnisArray(Index)
    151. Next
    152. 'Schalte automatische Berechnung wieder ein...
    153. Application.Calculation = xlCalculationAutomatic
    154. 'Schalte automatische Bildschirmaktualisierung wieder ein...
    155. Application.ScreenUpdating = True
    156. If kz_LVexistiert = True Then
    157. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang ausgeführt! - ABER, ACHTUNG!! - Es existiert mind. 1 Eintrag im Tab: '1 - Alle Aufträge zu Equipments', welcher einen Löschvormerk aufweist!! --> Daher:" & vbNewLine & vbNewLine & "Manuelle Überprüfung notwendig!!"), vbOKOnly
    158. Else
    159. MsgBox ("Schritt 1:" & vbNewLine & vbNewLine & "Vorgang erfolgreich ausgeführt!"), vbOKOnly
    160. End If
    161. End Sub




    So... Ich habe alle 4 Fälle unter gleichen Bedingungen getestet und das waren die Zeiten:

    Welcher Fall?:
    gemessene Zeit:
    FALL 1
    47 min, 4 sec., 58 hund.sec
    FALL 2
    12 min, 57 sec., 93 hund.sec
    FALL 3
    35 min, 49 sec., 85 hund.sec
    FALL 4
    1 min, 28 sec., 63 hund.sec

    Übrigens:
    Tabelle2 hatte 22493 unikate Einträge...
    und
    Tabelle3 hatte 17115 unikate Einträge...

    Somit mussten bei jedem einzelnen Eintrag von Tabelle2, jedes mal, im schlimmsten Fall, die 17115 Einträge von Tabelle 3 durchgegangen werden.... - außer natürlich, der gewünschte Eintrag wurde schon früher gefunden --> "Exit For" (z.b. FALL 3, Zeile: 142 )

    Also nur damit ihr eine Größenvorstellung habts... ;)

    Also ihr seht bei FALL4, wenn man also mit Arrays arbeitet und noch die ScreenUpdates und die AutoCalc abschaltet und am Schluss wieder einschaltet dauert das nur mehr ca. 1,5 Minuten!! Wahnsinn!! :thumbsup:
    Im Vergleich zum FALL 1, ist das eine Geschwindigkeitssteigerung von unglaublichen 96,88%!!

    Also meiner Meinung nach auf jeden Fall signifikant mehr...

    Ich werde somit mal probieren, mein komplettes Projekt dahin gehend, so gut wie nur möglich zu optimieren...!

    VG Tim

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

    Hallo,

    deswegen mache ich das bei größeren Datenmengen schon eine Zeit lang so. Ich fange evtl. Fehler noch ab, so dass wenigstens Screenupdate und Berechnung wieder eingeschaltet werden.
    Gruß
    Peterfido

    Keine Unterstützung per PN!