Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Code Optimierung

VBA Code Optimierung
12.08.2019 12:50:36
Dugimon
Hallo zusammen,
ich erarbeite derzeit ein Makro die mir Daten aus einem Arbeitsblatt genannt "Kopiervorlage" in ein Arbeitsblatt genannt "Datenbank" kopiert.
Im Arbeitsblatt Kopiervorlage liegen die Daten in einer Zeile und mit teilweise zusammenhängenden Zellen vor. Für das Arbeitsblatt Datenbank benötige ich diese Spaltenweise und ohne zusammenhängende Zellen.
Bisher habe ich es wie folgt gelöst:
(Ablauf was passiert)
  • Die Gesuchten Daten werden in ein Arbeitsblatt namens "ZW" kopiert

  • Mit der Transpose Funktion werden die Zeilen in Spalten umgewandelt

  • Die Zusammenhängenden Zellen werden anschließend getrennt und die nun leeren Zellen gelöscht.

  • Zum Schluss wird diese Sortierte Liste in das Arbeitsblatt "Datenbank" kopiert und bisherige Einträge nach Rechts verschoben.

  • Mein Bisheriger VBA Code
    
    Sub Erreichbarkeit()
    Dim KopierVorlage As Worksheet
    Dim ZW As Worksheet
    Dim Datenbank As Worksheet
    Dim Calls As Range
    Dim CallsAngenommen As Range
    Dim Erreichbarkeit As Range
    Dim Servicelevel As Range
    Set KopierVorlage = Sheets("KopierVorlage")
    Set ZW = Sheets("ZW")
    Set Datenbank = Sheets("Datenbank")
    Set Calls = Range("F4:AQ4")
    Set CallsAngenommen = Range("F16:AQ16")
    Set Erreichbarkeit = Range("F12:AQ12")
    Set Servicelevel = Range("F13:AQ13")
    'Kopieren der gesuchten Daten aus der Kopiervorlage
    KopierVorlage.Range("F4:AQ4,F12:AQ12,F13:AQ13,F16:AQ16").Copy
    ZW.Range("A2").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:= _
    True
    ZW.Range("A2:D40").UnMerge
    ZW.Range("A7,A13,A15,A16,A20,A22,A23,A24,A25,A26").EntireRow.Delete Shift:=x1Up
    ZW.Range("A1:D1") = "Eine Überschrift"
    ZW.Range("A1:D40").Interior.ColorIndex = 3
    ZW.Range("A1:D40").Borders.LineStyle = None
    'Die Angebotenen Calls kopieren
    ZW.Range("A1:A31").Copy
    Datenbank.Range("C36").Insert Shift:=xlToRight 'Verschiebt alle bestehenden einträge nach  _
    Rechts. (Links steht das aktuellste Datum)
    'Die Erreichbarkeit kopieren
    ZW.Range("B1:B31").Copy
    Datenbank.Range("c3").Insert
    'Den Servicelevel kopieren
    ZW.Range("C1:C31").Copy
    Datenbank.Range("C103").Insert
    'Die angenommen Calls kopieren
    ZW.Range("D1:D31").Copy
    Datenbank.Range("C70").Insert
    Set KopierVorlage = Nothing
    Set ZW = Nothing
    Set Datenbank = Nothing
    Set Calls = Nothing
    Set Erreichbarkeit = Nothing
    Set Servicelevel = Nothing
    End Sub
    

    Dieser Code funktioniert zwar und dank diversen Foren Posts hier konnte ich schon ein paar punkte optimieren aber ich bin mir sicher das es noch immer punkte gibt die optimiert werden können. Daher meine Frage an die Community: Was ist gut in diesem Code und was könnte besser (Einfacher, Schneller) gelöst werden. Besonders frage ich mich ob es nicht einen weg gibt diesen Zwischenschritt mit dem Arbeitsblatt "ZW" einzusparen.
    Ich freu mich auf die Antworten.
    Grüße
    Dugimon

    3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: VBA Code Optimierung
    12.08.2019 19:34:25
    ChrisL
    Hi
    Ohne Anspruch auf Vollständigkeit oder Wichtigkeit:
    ScreenUpdating und Calculation temporär ausschalten (google me)
    Auch bei Variablen das Tabellenblatt referenzieren
    Set Calls = ZW.Range("F4:AQ4")
    
    Variablen die du nicht brauchst, löschen
    In der Bezeichnung von Variablen würde ich nicht einmal annähernd einen Schlüsselbegriff verwenden.
    Call Makro1
    

    Call = VBA-Befehl (Aufruf) und damit ein Begriff, der als Variable zum Fehler führen würde. Zufällig ist die Mehrzahl Calls nicht geschützt, kann aber trotzdem verwirrend sein.
    Mit Namenskonventionen verhinderst du die zufällige Verwendung von Schlüsselbegriffen und es macht den Code leichter lesbar:
    https://www.herber.de/vbabasics/0002.html
    (Selber halte ich mich auch nicht konsequent daran und es gibt unterschiedliche Ansichten, welche Schreibweise die sinnvollste ist. Aber sowieso bringt es eine gewisse Ordnung und verhindert Fehler.).
    Wenn wir schon dabei sind, Option Explicit aktivieren (= VBA Editor Einstellung), falls du es nicht schon gemacht hast.
    Die Haupttabelle ZW könntest du in einer With-Klammer verwenden (ein paar Buchstaben weniger und hilft bei der Lesbarkeit).
    With Worksheets("ZW")
    .Range("A2:D40").UnMerge
    .Range("A7,A13,A15,A16,A20,A22,A23,A24,A25,A26").EntireRow.Delete Shift:=x1Up
    .Range("A1:D1") = "Eine Überschrift"
    End With
    
    Tabellenblätter würde ich übrigens als Worksheets und nicht als Sheets bezeichnen. Ein Tabellenblatt ist zwar auch ein Blatt, aber ein Blatt muss nicht zwingend eine Tabelle sein (gibt z.B. auch Diagrammblätter).
    cu
    Chris
    Anzeige
    AW: VBA Code Optimierung
    12.08.2019 19:35:02
    onur
    Wozu dimensionierst du so viele Variablen und löschst sie wieder, wenn du sowieso nur zwei davon benutzt?
    Wenn du
    With Sheets("ZW")
    

    und
    End With
    

    benutzt, kannst du auch auf ZW verzichten und statt (z.B)
    ZW.Range("B1:B31").Copy
    

    das nehmen:
    .Range("B1:B31").Copy
    

    Selbst auf "Datenbank" kannst du genausogut verzichten, da sie nur 4x benutzt wird, und stattdessen
    Sheets("Datenbank")
    

    schreiben.
    Anzeige
    AW: VBA Code Optimierung
    13.08.2019 13:03:35
    Dugimon
    Hallo Onur, Hallo ChrisL
    vielen Dank für eure Vorschläge. Konnte meinen Code schneller und kürzer machen. Die Variablen waren tatsächlich über stammen wohl von einem vorherigen Ansatz...

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige