VBA Code vereinfachen / kürzen / optimieren

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    VBA Code vereinfachen / kürzen / optimieren

    Hallo zusammen,

    in einem Excel Workbook wird beim Start das erste Tabellenblatt mit Sharepoint synchronisiert. Dabei werden viele unnötige leere Absätze in die Zellen geschrieben. Diese Absätze sind aber sehr unpraktisch weil die Tabelleneinträge später von Word (Seriendruckfunktion) übernommen werden....

    Ich hab dieses löschen der Leer-Absätze mittels VBA gelöst, allerdings reichen meine Programmierkenntnisse nicht aus, das in einer Loopschleife o.ä. zu verpacken.

    Ich erbitte hiermit also eure Hilfe den ganzen Code etwas eleganter zu gestalten:


    Quellcode

    1. ​Private Sub Workbook_Open()
    2. 'Daten aktualisieren
    3. ActiveWorkbook.RefreshAll
    4. 'Aus Spalten unnötige Absätze löschen
    5. Dim arr, tmp As String, sp As Integer, k As Integer, i As Long
    6. sp = 1
    7. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    8. arr = Split(Cells(i, sp).Value, vbLf)
    9. For k = LBound(arr) To UBound(arr)
    10. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    11. Next k
    12. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    13. tmp = ""
    14. Next i
    15. sp = 2
    16. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    17. arr = Split(Cells(i, sp).Value, vbLf)
    18. For k = LBound(arr) To UBound(arr)
    19. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    20. Next k
    21. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    22. tmp = ""
    23. Next i
    24. sp = 3
    25. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    26. arr = Split(Cells(i, sp).Value, vbLf)
    27. For k = LBound(arr) To UBound(arr)
    28. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    29. Next k
    30. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    31. tmp = ""
    32. Next i
    33. sp = 4
    34. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    35. arr = Split(Cells(i, sp).Value, vbLf)
    36. For k = LBound(arr) To UBound(arr)
    37. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    38. Next k
    39. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    40. tmp = ""
    41. Next i
    42. sp = 5
    43. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    44. arr = Split(Cells(i, sp).Value, vbLf)
    45. For k = LBound(arr) To UBound(arr)
    46. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    47. Next k
    48. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    49. tmp = ""
    50. Next i
    51. sp = 6
    52. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    53. arr = Split(Cells(i, sp).Value, vbLf)
    54. For k = LBound(arr) To UBound(arr)
    55. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    56. Next k
    57. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    58. tmp = ""
    59. Next i
    60. sp = 7
    61. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    62. arr = Split(Cells(i, sp).Value, vbLf)
    63. For k = LBound(arr) To UBound(arr)
    64. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    65. Next k
    66. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    67. tmp = ""
    68. Next i
    69. sp = 8
    70. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    71. arr = Split(Cells(i, sp).Value, vbLf)
    72. For k = LBound(arr) To UBound(arr)
    73. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    74. Next k
    75. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    76. tmp = ""
    77. Next i
    78. sp = 9
    79. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    80. arr = Split(Cells(i, sp).Value, vbLf)
    81. For k = LBound(arr) To UBound(arr)
    82. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    83. Next k
    84. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    85. tmp = ""
    86. Next i
    87. sp = 10
    88. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    89. arr = Split(Cells(i, sp).Value, vbLf)
    90. For k = LBound(arr) To UBound(arr)
    91. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    92. Next k
    93. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    94. tmp = ""
    95. Next i
    96. sp = 11
    97. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    98. arr = Split(Cells(i, sp).Value, vbLf)
    99. For k = LBound(arr) To UBound(arr)
    100. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    101. Next k
    102. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    103. tmp = ""
    104. Next i
    105. sp = 12
    106. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    107. arr = Split(Cells(i, sp).Value, vbLf)
    108. For k = LBound(arr) To UBound(arr)
    109. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    110. Next k
    111. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    112. tmp = ""
    113. Next i
    114. sp = 13
    115. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    116. arr = Split(Cells(i, sp).Value, vbLf)
    117. For k = LBound(arr) To UBound(arr)
    118. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    119. Next k
    120. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    121. tmp = ""
    122. Next i
    123. End Sub

    Visual Basic-Quellcode

    1. Private Sub Workbook_Open()
    2. 'Daten aktualisieren
    3. ActiveWorkbook.RefreshAll
    4. 'Aus Spalten unnötige Absätze löschen
    5. Dim arr, tmp As String, sp As Integer, k As Integer, i As Long
    6. For sp = 1 To 13
    7. For i = 1 To Cells(Rows.Count, sp).End(xlUp).Row
    8. arr = Split(Cells(i, sp).Value, vbLf)
    9. For k = LBound(arr) To UBound(arr)
    10. If Trim(arr(k)) <> "" Then tmp = tmp & arr(k) & vbLf
    11. Next k
    12. If tmp <> "" Then Cells(i, sp) = Left(tmp, Len(tmp) - 1)
    13. tmp = ""
    14. Next i
    15. Next sp
    16. End Sub

    ungetestet

    Du führst den selben Block immer wieder (13x) aus und incrementierst deine sp-Variable.
    Also kannst du das auch in eine For schleife bauen und sparst dir dadurch - naja - eben 12 mal den Block :D


    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Ich arbeite an einer neuen Exceldatei und habe dort nun ziemlich viel Code mittels Makrorekorder usw. erstellt.
    Nun ist die Geschichte an einem Punkt angekommen an der es träge wird. Eventuell hat ja einer die Muse da drüber zuschauen und mir den ein oder anderen Verbesserungsvorschlag zu geben....hier der Code:


    Quellcode

    1. ​Option Explicit
    2. Sub Datenimport_Insgesamt()
    3. Dim ImportDatei As Variant
    4. Dim wbImport As Workbook
    5. Dim LetzteZeile2 As Long
    6. Dim Zeilenanzahl As Integer
    7. Dim Spaltenanzahl As Integer
    8. Dim wks As Worksheet
    9. Dim wks2 As Worksheet
    10. Dim zeile As Long
    11. Application.ScreenUpdating = False
    12. 'Öffnet MsgBox "Datei öffnen"
    13. ImportDatei = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.xlsx; *.xlsm; *.xls; *.xlsb),*.xlsx; *.xlsm; *.xls; *.xlsb", Title:="Eine Datei auswählen")
    14. If ImportDatei = False Then
    15. MsgBox "Der Benutzer hat abgebrochen.", vbInformation
    16. Else
    17. 'Kopiert die Inhalte aus geöffneter Exceldatei und fügt Sie in Auswertung.xlsm ein
    18. Set wbImport = Workbooks.Open(ImportDatei)
    19. With ActiveSheet
    20. .Range("A2", .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Copy
    21. End With
    22. ThisWorkbook.Worksheets("Import").Cells(4, 1).PasteSpecial Paste:=xlPasteValues
    23. Application.CutCopyMode = False
    24. wbImport.Close savechanges:=False
    25. Set wbImport = Nothing
    26. 'ThisWorkbook.Worksheets("Import").Activate
    27. ActiveWorkbook.Worksheets("Import").AutoFilter.Sort.SortFields.Clear
    28. ActiveWorkbook.Worksheets("Import").AutoFilter.Sort.SortFields.Add Key:=Range _
    29. ("H4:H65536"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    30. xlSortNormal
    31. With ActiveWorkbook.Worksheets("Import").AutoFilter.Sort
    32. .Header = xlYes
    33. .MatchCase = False
    34. .Orientation = xlTopToBottom
    35. .SortMethod = xlPinYin
    36. .Apply
    37. End With
    38. 'Fehlende Änderungsdatum Angabe ersetzen durch "Angelegt am" Datum
    39. LetzteZeile2 = Range("H65535").End(xlUp).Offset(1, 0).Row
    40. Cells(LetzteZeile2, "H").Select
    41. ActiveCell.FormulaR1C1 = "=RC[1]"
    42. Cells(LetzteZeile2, "H").AutoFill Destination:=Range(Cells(LetzteZeile2, "H"), Cells(10000, "H"))
    43. 'Aktuelles Datum in CE1
    44. Range("CE1").Select
    45. ActiveCell.FormulaR1C1 = "=TODAY()"
    46. 'Hinter allen Verwendeten Zeilen Datum
    47. Range("J4").Select
    48. ActiveCell.FormulaR1C1 = "=IF(ISNONTEXT(RC[-6]),"""",(R1C[73]))"
    49. Range("J4").Select
    50. Selection.AutoFill Destination:=Range("J4:J10000")
    51. Range("J4:J10000").Select
    52. 'Hinter allen Datumsableitung einfügen
    53. Range("L4").Select
    54. ActiveCell.FormulaR1C1 = "=YEAR(RC[-4])"
    55. ' ActiveCell.FormulaR1C1 = "=IF(ISNONTEXT(RC[-6]),"""",(R1C[73]))"
    56. Range("L4").Select
    57. Selection.AutoFill Destination:=Range("L4:L10000")
    58. Range("L4:L10000").Select
    59. 'Kopiert den benutzten Bereich im Tabellenblatt "Import" und fügt alles auf Tabellenblatt "Import ohne Dublikate" ein
    60. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    61. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    62. Range(Cells(4, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    63. Sheets("Import ohne Dublikate").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    64. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    65. 'Setzt Filter
    66. ActiveSheet.UsedRange.AutoFilter Field:=6, Criteria1:=Array( _
    67. "MAFR INIT", "MAFR INIT ANGE", "MAFR INIT ANGE ERL", "MAFR INIT ANGE WDER", _
    68. "MAFR INIT ERL", "MAFR INIT ERL WDER", "MAFR INIT ERL WDSP", "MAFR INIT WDSP", _
    69. "MAFR MAH2", "MAFR MAH2 ERL", "MAOF INIT", "MAOF INIT ANGE ERL"), Operator:= _
    70. xlFilterValues
    71. 'Benutzten, gefilterten Bereich kopieren und auf "nur offene Maßnahmen" und "Offen Ohne Dublikate" einfügen
    72. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    73. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    74. Range(Cells(4, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    75. Sheets("nur offene Maßnahmen").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    76. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    77. 'Dublikate löschen
    78. Sheets("nur offene Maßnahmen").Select
    79. Columns("A:J").Select
    80. ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    81. Header:=xlYes
    82. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    83. Sheets("Offen Ohne Dublikate").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    84. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    85. 'Filter zurücksetzen auf Tabellenblatt "Import"
    86. ThisWorkbook.Worksheets("Import").Activate
    87. ActiveSheet.UsedRange.AutoFilter Field:=6
    88. End If
    89. 'Dublikate aus Tabellenblatt "Offen Ohne Dublikate" löschen
    90. ThisWorkbook.Worksheets("Offen Ohne Dublikate").Activate
    91. Set wks = ThisWorkbook.Worksheets("Offen Ohne Dublikate")
    92. ActiveSheet.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    93. Sheets("Offen Ohne Dublikate").Select
    94. Columns("A:J").Select
    95. ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    96. Header:=xlYes
    97. 'Dublikate aus Tabellenblatt "Import ohne Dublikate" löschen
    98. ThisWorkbook.Worksheets("Import ohne Dublikate").Activate
    99. Set wks2 = ThisWorkbook.Worksheets("Import ohne Dublikate")
    100. ActiveSheet.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    101. 'SAP Datenstand archivieren auf Tabellenblatt "Archiv"
    102. ThisWorkbook.Worksheets("Import").Activate
    103. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    104. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    105. Range(Cells(4, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    106. Sheets("Archiv").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    107. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    108. Sheets("Archiv").Select
    109. Columns("A:J").Select
    110. ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    111. Header:=xlYes
    112. 'Inhalte in Tabellenblatt Import löschen
    113. Worksheets("Import").Cells.Clear
    114. Sheets("Import").Select
    115. 'Leere Zeilen von unten nach oben löschen
    116. With Tabelle1
    117. '.UsedRange ist der verwendete Bereich der Tabelle
    118. 'Schleife beim Löschen immer von unten nach oben durchlaufen lassen !
    119. For zeile = .UsedRange.Row + .UsedRange.Rows.Count - 1 To 1 Step -1
    120. 'Application.CountA entspricht der Funktion =ANZAHL2()
    121. 'und zählt, wieviele gefüllte Zellen der Bereich (hier : die Zeile) enthält
    122. If Application.CountA(.Rows(zeile)) = 0 Then .Rows(zeile).EntireRow.Delete
    123. Next
    124. End With
    125. Sheets("Import ohne Dublikate").Select
    126. 'Leere Zeilen von unten nach oben löschen
    127. With Tabelle6
    128. '.UsedRange ist der verwendete Bereich der Tabelle
    129. 'Schleife beim Löschen immer von unten nach oben durchlaufen lassen !
    130. For zeile = .UsedRange.Row + .UsedRange.Rows.Count - 1 To 1 Step -1
    131. 'Application.CountA entspricht der Funktion =ANZAHL2()
    132. 'und zählt, wieviele gefüllte Zellen der Bereich (hier : die Zeile) enthält
    133. If Application.CountA(.Rows(zeile)) = 0 Then .Rows(zeile).EntireRow.Delete
    134. Next
    135. End With
    136. Sheets("nur offene Maßnahmen").Select
    137. 'Leere Zeilen von unten nach oben löschen
    138. With Tabelle5
    139. '.UsedRange ist der verwendete Bereich der Tabelle
    140. 'Schleife beim Löschen immer von unten nach oben durchlaufen lassen !
    141. For zeile = .UsedRange.Row + .UsedRange.Rows.Count - 1 To 1 Step -1
    142. 'Application.CountA entspricht der Funktion =ANZAHL2()
    143. 'und zählt, wieviele gefüllte Zellen der Bereich (hier : die Zeile) enthält
    144. If Application.CountA(.Rows(zeile)) = 0 Then .Rows(zeile).EntireRow.Delete
    145. Next
    146. End With
    147. Sheets("Offen Ohne Dublikate").Select
    148. 'Leere Zeilen von unten nach oben löschen
    149. With Tabelle2
    150. '.UsedRange ist der verwendete Bereich der Tabelle
    151. 'Schleife beim Löschen immer von unten nach oben durchlaufen lassen !
    152. For zeile = .UsedRange.Row + .UsedRange.Rows.Count - 1 To 1 Step -1
    153. 'Application.CountA entspricht der Funktion =ANZAHL2()
    154. 'und zählt, wieviele gefüllte Zellen der Bereich (hier : die Zeile) enthält
    155. If Application.CountA(.Rows(zeile)) = 0 Then .Rows(zeile).EntireRow.Delete
    156. Next
    157. End With
    158. Sheets("Archiv").Select
    159. 'Leere Zeilen von unten nach oben löschen
    160. With Tabelle3
    161. '.UsedRange ist der verwendete Bereich der Tabelle
    162. 'Schleife beim Löschen immer von unten nach oben durchlaufen lassen !
    163. For zeile = .UsedRange.Row + .UsedRange.Rows.Count - 1 To 1 Step -1
    164. 'Application.CountA entspricht der Funktion =ANZAHL2()
    165. 'und zählt, wieviele gefüllte Zellen der Bereich (hier : die Zeile) enthält
    166. If Application.CountA(.Rows(zeile)) = 0 Then .Rows(zeile).EntireRow.Delete
    167. Next
    168. End With
    169. Sheets("Import ohne Dublikate").Select
    170. Columns("H:H").Select
    171. Selection.NumberFormat = "m/d/yyyy"
    172. Sheets("nur offene Maßnahmen").Select
    173. Columns("H:H").Select
    174. Selection.NumberFormat = "m/d/yyyy"
    175. Sheets("Offen Ohne Dublikate").Select
    176. Columns("H:H").Select
    177. Selection.NumberFormat = "m/d/yyyy"
    178. Sheets("Archiv").Select
    179. Columns("H:H").Select
    180. Selection.NumberFormat = "m/d/yyyy"
    181. Sheets("nur offene Maßnahmen").Range("A1:J1").Copy
    182. Sheets("Import").Select
    183. Range("A3").Select
    184. ActiveSheet.Paste
    185. Application.CutCopyMode = False
    186. Selection.AutoFilter
    187. Application.ScreenUpdating = True
    188. Sheets("Pivot Tabelle").Select
    189. End Sub
    Man sieht schon sehr deutlich, dass das aufgezeichneter Code ist.
    ersetze erst mal im ganzen Code die Select-Statements und Selection-Objekte durch Direktadressierung.

    FrankyWill schrieb:

    Sheets("Archiv").Select
    Columns("H:H").Select
    Selection.NumberFormat = "m/d/yyyy"

    Visual Basic-Quellcode

    1. Sheets("Archiv").Columns("H:H").NumberFormat = "m/d/yyyy"
    Vielleicht wird's dann schon mal übersichtlicher, dass man sich überhaupt an Optimierung ran trauen kann.

    Auch Konstrukte mit Activate solltest du vermeiden :

    FrankyWill schrieb:

    ThisWorkbook.Worksheets("Import").Activate
    ActiveSheet.UsedRange.AutoFilter Field:=6

    Visual Basic-Quellcode

    1. ThisWorkbook.Worksheets("Import").UsedRange.AutoFilter Field:=6
    Oder besser noch, verwende hier die Objektnamen des Sheets

    Visual Basic-Quellcode

    1. Tabelle5.UsedRange.AutoFilter Field:=6
    Und wenn du in der IDE der Tabelle5 noch einen vernünftigen Name wie z.B. Import gibst:

    Visual Basic-Quellcode

    1. Import.UsedRange.AutoFilter Field:=6
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hier mal mein überarbeiteter Code. @petaod: Wie genau meinst du dass mit den Tabellen Namen geben?

    Alleine das Aufräumen der ganzen select Geschichten hat tatsächlich unfassbare Performance freigesetzt! Ich würde jetzt nur gerne noch
    die leeren Zeilen unterhalb meiner Tabellen löschen. Jemand einen Tipp? Meine Lösung steht unterhalb des eigentlichen Codes...Danke!!!

    Quellcode

    1. ​Option Explicit
    2. Sub Datenimport_Insgesamt()
    3. Dim ImportDatei As Variant
    4. Dim wbImport As Workbook
    5. Dim LetzteZeile2 As Long
    6. Dim Zeilenanzahl As Integer
    7. Dim Spaltenanzahl As Integer
    8. Dim wks As Worksheet
    9. Dim wks2 As Worksheet
    10. Dim zeile As Long
    11. Dim lngSpalte As Long
    12. Dim a As Long
    13. Application.ScreenUpdating = False
    14. 'Öffnet MsgBox "Datei öffnen"
    15. ImportDatei = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.xlsx; *.xlsm; *.xls; *.xlsb),*.xlsx; *.xlsm; *.xls; *.xlsb", Title:="Eine Datei auswählen")
    16. If ImportDatei = False Then
    17. MsgBox "Der Benutzer hat abgebrochen.", vbInformation
    18. Else
    19. 'Kopiert die Inhalte aus geöffneter Exceldatei und fügt Sie in Auswertung.xlsm ein
    20. Set wbImport = Workbooks.Open(ImportDatei)
    21. With ActiveSheet
    22. .Range("A2", .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Copy
    23. End With
    24. ThisWorkbook.Worksheets("Import").Cells(2, 1).PasteSpecial Paste:=xlPasteValues
    25. Application.CutCopyMode = False
    26. wbImport.Close savechanges:=False
    27. Set wbImport = Nothing
    28. ActiveWorkbook.Worksheets("Import").AutoFilter.Sort.SortFields.Clear
    29. ActiveWorkbook.Worksheets("Import").AutoFilter.Sort.SortFields.Add Key:=Range _
    30. ("H2:H65536"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    31. xlSortNormal
    32. With ActiveWorkbook.Worksheets("Import").AutoFilter.Sort
    33. .Header = xlYes
    34. .MatchCase = False
    35. .Orientation = xlTopToBottom
    36. .SortMethod = xlPinYin
    37. .Apply
    38. End With
    39. 'Fehlende Änderungsdatum Angabe ersetzen durch "Angelegt am" Datum
    40. LetzteZeile2 = Range("H65535").End(xlUp).Offset(1, 0).Row
    41. Cells(LetzteZeile2, "H").FormulaR1C1 = "=RC[1]"
    42. Cells(LetzteZeile2, "H").AutoFill Destination:=Range(Cells(LetzteZeile2, "H"), Cells(10000, "H"))
    43. 'Aktuelles Datum in CE1
    44. Range("CE1").FormulaR1C1 = "=TODAY()"
    45. 'Hinter allen Verwendeten Zeilen Datum
    46. Range("J2").FormulaR1C1 = "=IF(ISNONTEXT(RC[-6]),"""",(R1C[73]))"
    47. Range("J2").AutoFill Destination:=Range("J2:J10000")
    48. 'Hinter allen Datumsableitung einfügen
    49. Range("L2").FormulaR1C1 = "=YEAR(RC[-4])"
    50. Range("L2").AutoFill Destination:=Range("L2:L10000")
    51. 'Kopiert den benutzten Bereich im Tabellenblatt "Import" und fügt alles auf Tabellenblatt "Import ohne Dublikate" ein
    52. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    53. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    54. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    55. Sheets("Import ohne Dublikate").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    56. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    57. 'Setzt Filter
    58. Sheets("Import").UsedRange.AutoFilter Field:=6, Criteria1:=Array( _
    59. "MAFR INIT", "MAFR INIT ANGE", "MAFR INIT ANGE ERL", "MAFR INIT ANGE WDER", _
    60. "MAFR INIT ERL", "MAFR INIT ERL WDER", "MAFR INIT ERL WDSP", "MAFR INIT WDSP", _
    61. "MAFR MAH2", "MAFR MAH2 ERL", "MAOF INIT", "MAOF INIT ANGE ERL"), Operator:= _
    62. xlFilterValues
    63. 'Benutzten, gefilterten Bereich kopieren und auf "nur offene Maßnahmen" und "Offen Ohne Dublikate" einfügen
    64. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    65. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    66. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    67. Sheets("nur offene Maßnahmen").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    68. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    69. 'Dublikate löschen
    70. Sheets("nur offene Maßnahmen").UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    71. Header:=xlYes
    72. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    73. Sheets("Offen Ohne Dublikate").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    74. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    75. 'Filter zurücksetzen auf Tabellenblatt "Import"
    76. Sheets("Import").UsedRange.AutoFilter Field:=6
    77. End If
    78. 'Dublikate aus Tabellenblatt "Offen Ohne Dublikate" löschen
    79. Sheets("Offen Ohne Dublikate").UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    80. Sheets("Offen Ohne Dublikate").UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    81. Header:=xlYes
    82. 'Dublikate aus Tabellenblatt "Import ohne Dublikate" löschen
    83. Sheets("Import ohne Dublikate").UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    84. 'SAP Datenstand archivieren auf Tabellenblatt "Archiv"
    85. ThisWorkbook.Worksheets("Import").Activate
    86. Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    87. Spaltenanzahl = ActiveSheet.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    88. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    89. Sheets("Archiv").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    90. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    91. Sheets("Archiv").UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), _
    92. Header:=xlYes
    93. 'Inhalte in Tabellenblatt Import löschen
    94. Worksheets("Import").Range("A2:L10000").Select
    95. Selection.Clear
    96. Sheets("Import ohne Dublikate").Columns("H:H").NumberFormat = "m/d/yyyy"
    97. Sheets("nur offene Maßnahmen").Columns("H:H").NumberFormat = "m/d/yyyy"
    98. Sheets("Offen Ohne Dublikate").Columns("H:H").NumberFormat = "m/d/yyyy"
    99. Sheets("Archiv").Columns("H:H").NumberFormat = "m/d/yyyy"
    100. Application.ScreenUpdating = True
    101. Sheets("Pivot Tabelle").Select
    102. End Sub



    Quellcode

    1. ​ Sheets("Import").Select
    2. '** Spalte, die auf Leerzeichen geprüft werden soll
    3. lngSpalte = 1
    4. For a = ActiveSheet.Cells(Rows.Count, lngSpalte).End(xlUp).Row To 1 Step -1
    5. If ActiveSheet.Cells(a, 1).Value = "" Then
    6. Rows(a).Delete shift:=xlUp
    7. End If
    8. Next a
    9. Sheets("Import ohne Dublikate").Select
    10. '** Spalte, die auf Leerzeichen geprüft werden soll
    11. lngSpalte = 1
    12. For a = ActiveSheet.Cells(Rows.Count, lngSpalte).End(xlUp).Row To 1 Step -1
    13. If ActiveSheet.Cells(a, 1).Value = "" Then
    14. Rows(a).Delete shift:=xlUp
    15. End If
    16. Next a
    17. Sheets("nur offene Maßnahmen").Select
    18. '** Spalte, die auf Leerzeichen geprüft werden soll
    19. lngSpalte = 1
    20. For a = ActiveSheet.Cells(Rows.Count, lngSpalte).End(xlUp).Row To 1 Step -1
    21. If ActiveSheet.Cells(a, 1).Value = "" Then
    22. Rows(a).Delete shift:=xlUp
    23. End If
    24. Next a
    25. Sheets("Offen Ohne Dublikate").Select
    26. '** Spalte, die auf Leerzeichen geprüft werden soll
    27. lngSpalte = 1
    28. For a = ActiveSheet.Cells(Rows.Count, lngSpalte).End(xlUp).Row To 1 Step -1
    29. If ActiveSheet.Cells(a, 1).Value = "" Then
    30. Rows(a).Delete shift:=xlUp
    31. End If
    32. Next a
    33. Sheets("Archiv").Select
    34. '** Spalte, die auf Leerzeichen geprüft werden soll
    35. lngSpalte = 1
    36. For a = ActiveSheet.Cells(Rows.Count, lngSpalte).End(xlUp).Row To 1 Step -1
    37. If ActiveSheet.Cells(a, 1).Value = "" Then
    38. Rows(a).Delete shift:=xlUp
    39. End If
    40. Next a

    FrankyWill schrieb:

    Wie genau meinst du dass mit den Tabellen Namen geben?
    Im VBA-Editor klickst du links das Worksheet an.
    Dann siehst du unten im Eigenschaftsfenster die Properties des Sheets.
    Falls das Fenster nicht da ist, F4 drücken.
    Jetzt kannst du in der Spalte (Name) den Objektnamen überschreiben.
    z.B. Import statt Tabelle1.
    Dann kannst du zukünftig das Sheet anstatt mit SheetNamen Sheets("Import") mittels Objektnamen Import adressieren.

    Fangen wir mal mit dem ersten Abschnitt an.

    FrankyWill schrieb:

    Set wbImport = Workbooks.Open(ImportDatei)
    With ActiveSheet
    .Range("A2", .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Copy
    End With
    ThisWorkbook.Worksheets("Import").Cells(2, 1).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    wbImport.Close savechanges:=False
    Set wbImport = Nothing

    Würde ich so schreiben

    Visual Basic-Quellcode

    1. Set wbImport = Workbooks.Open(ImportDatei)
    2. Set CopySheet = wbImport.Sheets(1)
    3. Set CopyRange = Intersect(CopySheet.UsedRange, CopySheet.Range("2:" & Rows.Count))
    4. Import.Range(CopyRange.Address).Value = CopyRange.Value
    5. wbImport.Close Savechanges:=False
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ui, das macht die ganze Sache ja um längen Eleganter. Auch diesesmal vielen Dank dafür! Ich werde das mal umsetzen...


    Hab die Objektnamen nun geändert, was tatsächlich einiges vereinfacht. Insbesondere für folgende VBA Projekte eine super Sache. Ich habe aber ein anderes, etwas seltsames Problem und ich finde die Ursache nicht....Im Grundegenommen importiere ich aus einer SAP erzeugten Exceldatei gewisse Daten, die dann in meiner Datei gefiltert, sortiert, gelöscht und auf verschiedene Tabellenblätter kopiert werden. Wenn ich mit F8 den Code Schrittweise durchlaufe, habe ich am Ende mein gewünschtes Ergebnis auf den verschiedenen Tabellenblätter.Lass ich den Code aber im ganzen, vollständig und ohne Einzelschritte durchlaufen habe ich plötzlich auf zwei Tabellenblättern den selben Inhalt. Auf IoD und OOD sind die selben Daten, um die 305 Einträge dabei sollte auf OOD jedoch nur 96 sein...was läuft da schief?


    Quellcode

    1. Option Explicit
    2. Sub Datenimport_Insgesamt()
    3. Dim wbImport As Workbook
    4. Dim ws As Worksheet
    5. Dim wks As Worksheet
    6. Dim wks2 As Worksheet
    7. Dim p As PivotTable
    8. Dim ImportDatei As String
    9. Dim CopySheet As String
    10. Dim CopyRange As String
    11. Dim LetzteZeile2 As Long
    12. Dim Zeilenanzahl As Long
    13. Dim Zeilenanzahl2 As Long
    14. Dim Zeilenanzahl3 As Long
    15. Dim Spaltenanzahl As Long
    16. Dim Spaltenanzahl2 As Long
    17. Dim Spaltenanzahl3 As Long
    18. Dim zeile As Long
    19. Dim lngSpalte As Long
    20. Dim a As Long
    21. Application.ScreenUpdating = False
    22. Import.Select
    23. 'Öffnet MsgBox "Datei öffnen"
    24. ImportDatei = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.xlsx; *.xlsm; *.xls; *.xlsb),*.xlsx; *.xlsm; *.xls; *.xlsb", Title:="Eine Datei auswählen")
    25. If ImportDatei = False Then
    26. MsgBox "Der Benutzer hat abgebrochen.", vbInformation
    27. Else
    28. Set wbImport = Workbooks.Open(ImportDatei)
    29. Set CopySheet = wbImport.Sheets(1)
    30. Set CopyRange = Intersect(CopySheet.UsedRange, CopySheet.Range("2:" & Rows.Count))
    31. Import.Range(CopyRange.Address).Value = CopyRange.Value
    32. wbImport.Close Savechanges:=False
    33. Import.AutoFilter.Sort.SortFields.Clear
    34. Import.AutoFilter.Sort.SortFields.Add Key:=Range("H2:H65536"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    35. With Import.AutoFilter.Sort
    36. .Header = xlYes
    37. .MatchCase = False
    38. .Orientation = xlTopToBottom
    39. .SortMethod = xlPinYin
    40. .Apply
    41. End With
    42. End If
    43. 'Fehlende Änderungsdatum Angabe ersetzen durch "Angelegt am" Datum
    44. LetzteZeile2 = Range("H65535").End(xlUp).Offset(1, 0).Row
    45. Cells(LetzteZeile2, "H").FormulaR1C1 = "=RC[1]"
    46. Cells(LetzteZeile2, "H").AutoFill Destination:=Range(Cells(LetzteZeile2, "H"), Cells(10000, "H"))
    47. 'Aktuelles Datum in CE1
    48. Range("CE1").FormulaR1C1 = "=TODAY()"
    49. 'Hinter allen Verwendeten Zeilen Datum
    50. Range("J2").FormulaR1C1 = "=IF(ISNONTEXT(RC[-6]),"""",(R1C[73]))"
    51. Range("J2").AutoFill Destination:=Range("J2:J10000")
    52. 'Hinter allen Datumsableitung einfügen
    53. Range("L2").FormulaR1C1 = "=YEAR(RC[-4])"
    54. Range("L2").AutoFill Destination:=Range("L2:L10000")
    55. 'Markiert und Kopiert den benutzten Bereich im Tabellenblatt "Import"
    56. Zeilenanzahl = Import.Cells(Rows.Count, 1).End(xlUp).Row
    57. Spaltenanzahl = Import.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    58. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    59. 'Fügt alles auf Tabellenblatt "Import ohne Dublikate" ein
    60. IoD.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    61. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    62. 'Dublikate aus Tabellenblatt "Import ohne Dublikate" löschen
    63. IoD.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    64. 'Setzt Filter
    65. Import.UsedRange.AutoFilter Field:=6, Criteria1:=Array( _
    66. "MAFR INIT", "MAFR INIT ANGE", "MAFR INIT ANGE ERL", "MAFR INIT ANGE WDER", _
    67. "MAFR INIT ERL", "MAFR INIT ERL WDER", "MAFR INIT ERL WDSP", "MAFR INIT WDSP", _
    68. "MAFR MAH2", "MAFR MAH2 ERL", "MAOF INIT", "MAOF INIT ANGE ERL"), Operator:=xlFilterValues
    69. 'Benutzten, gefilterten Bereich auf "Import" kopieren
    70. Zeilenanzahl2 = Import.Cells(Rows.Count, 1).End(xlUp).Row
    71. Spaltenanzahl2 = Import.Cells(Zeilenanzahl2, Columns.Count).End(xlToLeft).Column
    72. Range(Cells(2, 1), Cells(Zeilenanzahl2, Spaltenanzahl2)).Copy
    73. 'Fügt alles auf Tabellenblatt "nur offene Maßnahmen" ein
    74. noM.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    75. 'Dublikate löschen auf "nur offene Maßnahmen"
    76. Range(Cells(2, 1), Cells(Zeilenanzahl2, Spaltenanzahl2)).Copy
    77. OOD.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    78. 'Dublikate aus Tabellenblatt "Offen Ohne Dublikate" löschen
    79. OOD.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    80. OOD.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), Header:=xlYes
    81. 'Filter zurücksetzen auf Tabellenblatt "Import"
    82. Import.UsedRange.AutoFilter Field:=6
    83. 'SAP Datenstand archivieren auf Tabellenblatt "Archiv"
    84. Zeilenanzahl3 = Import.Cells(Rows.Count, 1).End(xlUp).Row
    85. Spaltenanzahl3 = Import.Cells(Zeilenanzahl3, Columns.Count).End(xlToLeft).Column
    86. Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3)).Copy
    87. Archiv.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    88. Archiv.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 10), Header:=xlYes
    89. 'Inhalte in Tabellenblatt Import löschen
    90. Import.Select
    91. Import.Range("A2:L10000").Select
    92. Selection.Clear
    93. IoD.Columns("H:H").NumberFormat = "m/d/yyyy"
    94. noM.Columns("H:H").NumberFormat = "m/d/yyyy"
    95. OOD.Columns("H:H").NumberFormat = "m/d/yyyy"
    96. Archiv.Columns("H:H").NumberFormat = "m/d/yyyy"
    97. 'Pivot Tabellen aktualisieren
    98. For Each ws In ActiveWorkbook.Worksheets
    99. For Each p In ws.PivotTables
    100. p.RefreshTable
    101. Next
    102. Next
    103. Application.ScreenUpdating = True
    104. Pivot.Select
    105. End Sub

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

    EDIT:

    Ich habe nun meinen vorherigen Code um jeweils eine .Select Anweisung vor den eigentlichen Paste Anweisungen erweitern...siehe da, er gibt mir wieder auf allen Tabellenblätter die korrekten Inhalte aus.

    Woran liegt das, bzw. wie kann ich das eleganter, ohne .Select beheben?

    Quellcode

    1. Option Explicit
    2. Sub Datenimport_Insgesamt()
    3. Dim wbImport As Workbook
    4. Dim ws As Worksheet
    5. Dim wks As Worksheet
    6. Dim wks2 As Worksheet
    7. Dim p As PivotTable
    8. Dim ImportDatei As Variant
    9. Dim CopySheet As Variant
    10. Dim CopyRange As Variant
    11. Dim LetzteZeile2 As Integer
    12. Dim Zeilenanzahl As Integer
    13. Dim Zeilenanzahl2 As Integer
    14. Dim Zeilenanzahl3 As Integer
    15. Dim Spaltenanzahl As Integer
    16. Dim Spaltenanzahl2 As Integer
    17. Dim Spaltenanzahl3 As Integer
    18. Dim zeile As Long
    19. Dim lngSpalte As Long
    20. Dim a As Long
    21. Application.ScreenUpdating = False
    22. Import.Select
    23. 'Öffnet MsgBox "Datei öffnen"
    24. ImportDatei = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.xlsx; *.xlsm; *.xls; *.xlsb),*.xlsx; *.xlsm; *.xls; *.xlsb", Title:="Eine Datei auswählen")
    25. If ImportDatei = False Then
    26. MsgBox "Der Benutzer hat abgebrochen.", vbInformation
    27. Else
    28. Set wbImport = Workbooks.Open(ImportDatei)
    29. Set CopySheet = wbImport.Sheets(1)
    30. Set CopyRange = Intersect(CopySheet.UsedRange, CopySheet.Range("2:" & Rows.Count))
    31. Import.Range(CopyRange.Address).Value = CopyRange.Value
    32. wbImport.Close Savechanges:=False
    33. Import.AutoFilter.Sort.SortFields.Clear
    34. Import.AutoFilter.Sort.SortFields.Add Key:=Range("H2:H65536"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    35. With Import.AutoFilter.Sort
    36. .Header = xlYes
    37. .MatchCase = False
    38. .Orientation = xlTopToBottom
    39. .SortMethod = xlPinYin
    40. .Apply
    41. End With
    42. End If
    43. 'Fehlende Änderungsdatum Angabe ersetzen durch "Angelegt am" Datum
    44. LetzteZeile2 = Range("H65535").End(xlUp).Offset(1, 0).Row
    45. Cells(LetzteZeile2, "H").FormulaR1C1 = "=RC[1]"
    46. Cells(LetzteZeile2, "H").AutoFill Destination:=Range(Cells(LetzteZeile2, "H"), Cells(10000, "H"))
    47. 'Aktuelles Datum in CE1
    48. Range("CE1").FormulaR1C1 = "=TODAY()"
    49. 'Hinter allen Verwendeten Zeilen Datum
    50. Range("J2").FormulaR1C1 = "=IF(ISNONTEXT(RC[-6]),"""",(R1C[73]))"
    51. Range("J2").AutoFill Destination:=Range("J2:J10000")
    52. 'Hinter allen Datumsableitung einfügen
    53. Range("L2").FormulaR1C1 = "=YEAR(RC[-4])"
    54. Range("L2").AutoFill Destination:=Range("L2:L10000")
    55. 'Markiert und Kopiert den benutzten Bereich im Tabellenblatt "Import"
    56. Zeilenanzahl = Import.Cells(Rows.Count, 1).End(xlUp).Row
    57. Spaltenanzahl = Import.Cells(Zeilenanzahl, Columns.Count).End(xlToLeft).Column
    58. Range(Cells(2, 1), Cells(Zeilenanzahl, Spaltenanzahl)).Copy
    59. 'Fügt alles auf Tabellenblatt "Import ohne Dublikate" ein
    60. IoD.Select
    61. IoD.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
    62. Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    63. 'Dublikate aus Tabellenblatt "Import ohne Dublikate" löschen
    64. IoD.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    65. 'Setzt Filter
    66. Import.Select
    67. Import.UsedRange.AutoFilter Field:=6, Criteria1:=Array( _
    68. "MAFR INIT", "MAFR INIT ANGE", "MAFR INIT ANGE ERL", "MAFR INIT ANGE WDER", _
    69. "MAFR INIT ERL", "MAFR INIT ERL WDER", "MAFR INIT ERL WDSP", "MAFR INIT WDSP", _
    70. "MAFR MAH2", "MAFR MAH2 ERL", "MAOF INIT", "MAOF INIT ANGE ERL"), Operator:=xlFilterValues
    71. 'Benutzten, gefilterten Bereich auf "Import" kopieren
    72. Zeilenanzahl2 = Import.Cells(Rows.Count, 1).End(xlUp).Row
    73. Spaltenanzahl2 = Import.Cells(Zeilenanzahl2, Columns.Count).End(xlToLeft).Column
    74. Range(Cells(2, 1), Cells(Zeilenanzahl2, Spaltenanzahl2)).Copy
    75. 'Fügt alles auf Tabellenblatt "nur offene Maßnahmen" ein
    76. noM.Select
    77. noM.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    78. 'Dublikate löschen auf "nur offene Maßnahmen"
    79. ' noM.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), Header:=xlYes
    80. Range(Cells(2, 1), Cells(Zeilenanzahl2, Spaltenanzahl2)).Copy
    81. OOD.Select
    82. OOD.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    83. 'Dublikate aus Tabellenblatt "Offen Ohne Dublikate" löschen
    84. OOD.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
    85. OOD.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 9), Header:=xlYes
    86. 'Filter zurücksetzen auf Tabellenblatt "Import"
    87. Import.Select
    88. Import.UsedRange.AutoFilter Field:=6
    89. 'SAP Datenstand archivieren auf Tabellenblatt "Archiv"
    90. Zeilenanzahl3 = Import.Cells(Rows.Count, 1).End(xlUp).Row
    91. Spaltenanzahl3 = Import.Cells(Zeilenanzahl3, Columns.Count).End(xlToLeft).Column
    92. Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3)).Copy
    93. Archiv.Select
    94. Archiv.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    95. Archiv.UsedRange.RemoveDuplicates Columns:=Array(2, 3, 4, 10), Header:=xlYes
    96. 'Inhalte in Tabellenblatt Import löschen
    97. Import.Select
    98. Import.Range("A2:L10000").Select
    99. Selection.Clear
    100. IoD.Columns("H:H").NumberFormat = "m/d/yyyy"
    101. noM.Columns("H:H").NumberFormat = "m/d/yyyy"
    102. OOD.Columns("H:H").NumberFormat = "m/d/yyyy"
    103. Archiv.Columns("H:H").NumberFormat = "m/d/yyyy"
    104. 'Pivot Tabellen aktualisieren
    105. For Each ws In ActiveWorkbook.Worksheets
    106. For Each p In ws.PivotTables
    107. p.RefreshTable
    108. Next
    109. Next
    110. Application.ScreenUpdating = True
    111. Pivot.Select
    112. End Sub

    FrankyWill schrieb:

    Ich habe nun meinen vorherigen Code um jeweils eine .Select Anweisung vor den eigentlichen Paste Anweisungen erweitern
    Wenn du ein Select einfügen musst, fehlt in deiner Anweisung die Angabe des Sheet für einen Range.
    Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3)).Copy gilt für das aktive Sheet.
    Import.Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3)).Copy gilt überall, weil du das Sheet spezifizierst.

    Aber arbeite besser nicht mit Copy/Paste, sondern weise die Inhalte direkt zu.
    Beispiel:

    FrankyWill schrieb:

    Import.Select
    ...
    Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3)).Copy
    Archiv.Select
    Archiv.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

    kann ersetzt werden durch

    Visual Basic-Quellcode

    1. Set CopyRange = Import.Range(Cells(2, 1), Cells(Zeilenanzahl3, Spaltenanzahl3))
    2. Archiv.Cells(Rows.Count,1).End(xlUp).Offset(1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = CopyRange.Value


    Grundregel: Elemente wie .Activate, Active..., .Select, Selection., .Paste... dürfen eigentlich nie vorkommen.
    Die einen, weil sie auf die GUI beeinflussen, was auf die Performance geht.
    Die anderen, weil sie den PasteBuffer verwenden, der gleichzeitig von allen laufenden Anwendungen verwendet wird.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --