Aha ok, "Synesty" war mir bis gerade eben noch nicht bekannt. Nun weiß ich aber worum es geht. ;)
50 Zeilen nur? Dann scheint etwas faul zu sein.
1) Bedinge Formatierungen können die Mappe schnell aufblähen und langsamer machen. Kontrollier mal wieviele aktiv sind, welche davon notwendig sind, aber am besten wäre sie (testweise) mal raus zu nehmen.
2) Allgemein würde ich vorschlagen, in jeder der Funktionen/Prozeduren am Anfang und Ende eine Debug-Zeile einzufügen die Zeit und den Namen jener ausgibt. So könnte man herausfinden welche davon viel Zeit beansprucht.
3)
Function getEAN(ByRef bError As Boolean) As String
On Error GoTo Err_Handler
Dim wbk As Workbook
Dim wsh As Worksheet
Dim rngEAN As Range
bError = False
Set wbk = GetWorkbook(ThisWorkbook.Path & "\EAN.xlsx")
Set wsh = wbk.Worksheets(1)
For Each rngEAN In Intersect(wsh.UsedRange, wsh.Range("A:A")).Cells
If IsNumeric(rngEAN.Value) Then
getEAN = rngEAN.Value
rngEAN.ClearContents
wbk.Save
Exit For
End If
Next
wbk.Close
Err_Exit:
Exit Function
Err_Handler:
Err.Clear
bError = True
Resume Err_Exit
End Function
Intersect ist langsam. An der Stelle macht es auch nicht viel Sinn. Scheinbar wird hierrüber im verwendeten Bereich nur die Spalte A benötigt.
Außerdem: Ist die Spalte A nicht Teil des verwendeten Bereichs, dann kommt es an der Stelle zu einem Laufzeitfehler - unnötig.
Besser wäre, man sagt wo die Daten Anfangen (z.B. A1) und schaut dann von unten nach oben wo die letzte Zeile ist - das ist der übliche Weg.
Dim rngBereich As Excel.Range
With Worksheets("Tabelle1")
Set rngBereich = .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
If rngBereich.Row < .Range("A1").Row Then
'oberhalb des gültigen Bereichs gelandet -> keine Daten vorhanden
Exit Sub
ElseIf rngBereich.Rows.Count = 1 And rngBereich.Cells(1).Value = "" Then
'keine Daten vorhanden
Exit Sub
Else
'Daten vorhanden
End If
End With
'weitere Aktionen mit Daten durchführen
'...
4) Anweisungen wie diese
ws.Range("D" & (ActiveCell.Row)).Select
externalId = ActiveCell.Value
bremsen aus. Ein selektieren ist aus Nutzersicht nötig, aus Sicht eines Makros jedoch nicht.
Man kann derartige Zeilen aus Select und z.B. ActiveCell zusammenfassen zu:
externalId = ws.Range("D" & (ActiveCell.Row)).Value
5) Das Übertragungsprotokoll setzt, wie man sehen kann, auf JSON weshalb eine entspr. Implementierung in VBA erforderlich ist - deshalb der JsonConverter. Die Frage die hier im Raum schwebt ist, wie groß ist deren Laufzeit.
Das führt dann wieder zum Punkt 2) und dem dort erwähnte Debugging. Einfach um mal eine Vorstellung davon zu bekommen in welcher Func/Sub die meiste Zeit verloren geht. Es könnte beim Erzeugen / Übertragen / Lesen der Daten der Fall sein.
|