Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1752to1756
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

Makro braucht zu lang

Makro braucht zu lang
17.04.2020 11:20:48
Flibustier
Liebe Excel-Anwender,
ich probiere mich aktuell an VBA um einige Dinge für die Arbeit zu vereinfachen. Nur braucht mein Code ca. 2 1/2 Minuten, was mir zu viel ist. Mir ist bewusst, dass die Funktionen relativ aufwändig sind und dadurch länger brauchen, auch dass mein Code sicherlich noch schlanker gemacht werden kann. Aber ein paar Sekündchen schneller wären toll.
Ich versuche mal den Code zusammen zu fassen:
Es geht darum bestimmte Kreise und Städte aus Deutschland aus anderen Tabellen aufzurufen - also die Daten, die dort gespeichert sind.
Es wird im Hintergrund mindestens eine weitere Excel-Datei geöffnet und aus der sollen bestimmte Zellen und Spalten kopiert und in die aktuelle Datei eingefügt werden. Dabei sollen die Tabellenblätter immer den Namen des jeweiligen zu kopierenden neuen Tabellenblattes bekommen.
Da die zu kopierenden Daten aus formatierten und unformatierten Tabellen stammen, musste ich das Kopieren mit einer Suchfunktion koppeln.
Die externen Tabellen sind nach Bundesländern sortiert und es gibt Ausnahmen, dass manche Kreise in mehreren Dateien enthalten sind oder, dass diese eine andere Struktur zum kopieren aufweisen. Dies habe ich durch eine Errorbehandlung und IF-Anweisungen aufgefangen.
Dies sind die wichtigsten Funktionen. Ich glaube vom Aufbau ist es nicht so kompliziert aber wahrscheinlich sehr redundant.
Hier der Code:
Beste Grüße und Danke :)
Sub Sprechblaseoval2_Klicken()
Dim region_anzahl As Integer
Dim Mails_Anzahl As Integer
Dim i As Integer
Dim ext_wb As Workbook
Dim ext_wb2 As Workbook
Dim int_wb As Workbook
Dim SZelle_Ext As Range
Dim SZelle_Int As Range
Dim Pfad_Verteiler As String
Dim Pfad_Verteiler2 As String
Dim DatAnfang As Date
On Error GoTo FehlerBehandlung
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
.DisplayAlerts = False
End With
DatAnfang = Now
Pfad_Verteiler = Cells(13, 2)
Pfad_Verteiler2 = Cells(14, 2)
region_anzahl = Application.WorksheetFunction.CountIf(Worksheets("Zuordnung Regionen (2)"). _
Range("B133:CS133"), "?*")
Set ext_wb = Workbooks.Open(Pfad_Verteiler, UpdateLinks:=0)
Set int_wb = Workbooks.Open("C:\Users\Philipp Neher\Desktop\Projekt Performance\MasterVersand. _
xlsm")
If Not Worksheets("Versandmaske").Cells(14, 2) = "" Then
Set ext_wb2 = Workbooks.Open(Pfad_Verteiler2, UpdateLinks:=0)
End If
For i = 1 To region_anzahl
If int_wb.Sheets("Zuordnung Regionen (2)").Cells(133, i + 1) = "Kreis Soest" Or int_wb.Sheets(" _
Zuordnung Regionen (2)").Cells(133, i + 1) = "Ennepe-Ruhr-Kreis" Or int_wb.Sheets("Zuordnung Regionen (2)").Cells(133, i + 1) = "Kreis Unna" Or int_wb.Sheets("Zuordnung Regionen (2)").Cells(133, i + 1) = "Kreis Warendorf" Then
ThisWorkbook.Sheets(10 + i).name = int_wb.Sheets("Zuordnung Regionen (2)").Cells(133, i + 1)
Set SZelle_Ext = ext_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Range("A:D").Find("NGG  _
Zitatgeber")
Set SZelle_Int = int_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Range("A:D").Find("NGG  _
Zitatgeber")
int_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Range("B2:" & "M" & SZelle_Int.Row - 2). _
ClearContents
ext_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Range("B2:" & "M" & SZelle_Ext.Row - 2).Copy
int_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Cells(2, 2).PasteSpecial Paste:=xlValues,  _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ext_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Range("B" & SZelle_Ext.Row & ":M300").Copy
int_wb.Sheets(ThisWorkbook.Sheets(10 + i).name).Cells(SZelle_Int.Row, 2).PasteSpecial Paste:= _
xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Else
ThisWorkbook.Sheets(i).name = int_wb.Sheets("Zuordnung Regionen (2)").Cells(133, i + 1)
Set SZelle_Ext = ext_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("A:D").Find("NGG Zitatgeber")
Set SZelle_Int = int_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("A:D").Find("NGG Zitatgeber")
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("B2:" & "K" & SZelle_Int.Row - 2). _
ClearContents
ext_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("B2:" & "K" & SZelle_Ext.Row - 2).Copy
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Cells(2, 2).PasteSpecial Paste:=xlValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
ext_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("B" & SZelle_Ext.Row & ":K300").Copy
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Cells(SZelle_Int.Row, 2).PasteSpecial Paste:= _
xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
sprung:
End If
Next i
FehlerBehandlung:
Select Case Err.Number
Case 9
Set SZelle_Ext = ext_wb2.Sheets(ThisWorkbook.Sheets(i).name).Range("A:D").Find("NGG  _
Zitatgeber")
Set SZelle_Int = int_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("A:D").Find("NGG  _
Zitatgeber")
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Range("B2:" & "K" & SZelle_Int.Row - 2). _
ClearContents
ext_wb2.Sheets(ThisWorkbook.Sheets(i).name).Range("B2:" & "K" & SZelle_Ext.Row - 2). _
Copy
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Cells(2, 2).PasteSpecial Paste:=xlValues,  _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ext_wb2.Sheets(ThisWorkbook.Sheets(i).name).Range("B" & SZelle_Ext.Row & ":K300").Copy
int_wb.Sheets(ThisWorkbook.Sheets(i).name).Cells(SZelle_Int.Row, 2).PasteSpecial Paste:= _
xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Resume sprung
Case Else
If Format(Now - DatAnfang, "hh:mm:ss") > "00:05:00" Then
MsgBox "Zeit überschritten - Abbruch der Endlosschleife"
Exit Sub
End If
Resume sprung2
End Select
sprung2:
ext_wb.Sheets("Aussortierung Mails").Range("A2:D3000").Copy
int_wb.Sheets("Aussortierung Mails").Cells(2, 1).PasteSpecial Paste:=xlValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
If Not int_wb.Sheets("Versandmaske").Cells(14, 2) = "" Then
Mails_Anzahl = Application.WorksheetFunction.Match("", int_wb.Sheets("Aussortierung Mails"). _
Range("A:A"), -1)
ext_wb2.Sheets("Aussortierung Mails").Range("A2:D3000").Copy
int_wb.Sheets("Aussortierung Mails").Cells(Mails_Anzahl, 1).PasteSpecial Paste:=xlValues,  _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ext_wb2.Save
ext_wb2.Close
End If
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True
End With
ext_wb.Save
ext_wb.Close
MsgBox "Datentransfer abgeschlossen. Ich habe " & Format(Now - DatAnfang, "hh:mm:ss") & "  _
Sekunden benötigt."
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro braucht zu lang
19.04.2020 12:54:53
fcs
Hallo Filibustier,
ich hab dein Makro etwas überarbeitet.
Die Anzahl der Zugriffe auf Zellen ist reduziert - Der Name des Zielblattes beim durchlaufen der Schleife wird in einer Variablen gespeichert.
Das jeweilige Tabellenblatt intern/extern wird einer Objekt-Variablen zugeordnet.
Mit M300 und K300 hast du die letzte Zeile des zu kopierenden Bereiches fest vorgegeben.
Wenn die tatsächliche letzte Zeile mit Daten deutlich kleiner ist, dann macht es ggf. Sinn die letzte Zeile im jeweiligen Blatt vor dem Kopieren zu berechnen. So wird die Anzahl der zu kopierenden Zellen und somit der Zeitbedarf reduziert.
Textdatei mit modifiziertem Makro - ich hoffe ich hab da im Blindflug nichts durcheinander gebracht.
https://www.herber.de/bbs/user/136855.txt
LG
Franz
Anzeige
AW: Makro braucht zu lang
20.04.2020 08:14:58
Flibustier
Hi Franz,
vielen vielen Dank für deine Hilfe und die Mühe alles durchzugehen. Der Code läuft jetzt 20-30 Sekunden schneller. Ich werde jetzt noch die Zeilen berechnen lassen (wie von dir vorgeschlagen) und hole hoffentlich noch ein paar Sekündchen raus.
Gruß
Philipp
AW: Makro braucht zu lang
21.04.2020 09:56:57
Flibustier
Hi Franz,
es hat doch nicht geklappt. Es ging so schnell durch, weil er nur einen Teil gemacht hat, da ein kleines Problem im Code war. Jetzt läuft es wieder auf 2 1/2 Minuten. Aber der Code sieht jetzt jedenfalls übersichtlicher aus ;). Nochmals danke für deine Hilfe.
AW: Makro braucht zu lang
21.04.2020 23:29:36
fcs
Hallo Filibistier,
ich weiss natürlich nicht wo das Problem war.
Mit Berechnung der letzten Zeile des zu kopierenden Bereichs würde das Makro folgt aussehen.
https://www.herber.de/bbs/user/136951.txt
LG
Franz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige