VBA: Code optimieren, beschleunigen!
#1
Hallo Leute,

ich verwende im Augenblick folgenden Code, im Prinzip nur eine "Find" Funktion , ich bin aber mit der Geschwindigkeit nicht zufrieden, ein Durchlauf umfasst 5000-10000 Zeilen und benötigt ca 15-20 Sekunden, das ist mit zu lange für so eine Abfrage. Jemand eine Idee wie man das anders uns schneller, machen könnte? Danke !


Code:
Sub Rüstung_Check()

Dim Pfad As String
Dim letzte As Long
Dim letzte2 As Long
Dim wkbName As String
Dim QsName As String
Dim SMsName As String

'Quelldatei
  Pfad = "\\hisrwsfs01\l_neu\MES-I\Bestueckung\ASM_Rüstungen\01_Muster\"
'Quell Workbook Name
  wkbName = "01_Rüstlisten_Tool.xls"
'Quell Sheet Name
  QsName = "Rüstung"
  ' Suchmaske Workbook Name
 wkbMaske = Application.ActiveWorkbook.Name
'Suchmaske Sheet Name
 SMsName = "Suchen"
' Importierte Rüstungen
 SHRüstung = "D"
' Importierte Programme
 SHProgram = "IMP"
' Löschen vorherige Eingabe
  'Range("H6:N100").ClearContents
' Letzte zeile Quell Workbook finden
 'letzte = Workbooks(wkbName).Sheets(QsName).Cells(Rows.Count, 5).End(xlUp).Rows.Row
  letzte = 10000
  letzte2 = Workbooks(wkbMaske).Sheets(SHProgram).Cells(Rows.Count, 2).End(xlUp).Rows.Row



' Fehlende Sachnummern finden

 Workbooks(wkbMaske).Sheets(SMsName).Range("F8", "F200").ClearContents




Application.Calculation = xlCalculationManual

QuellZelle2 = 1
ZielZelle = 8
FehlendeBt = 0

For D = QuellZelle2 To letzte2

Set Found = Sheets(SHRüstung).Columns(5).Find(Sheets(SHProgram).Cells(QuellZelle2, 2), LookIn:=xlValues, LookAt:=xlWhole)

     If Found Is Nothing Then

      Zeile1 = Workbooks(wkbMaske).Sheets(SHProgram).Cells(QuellZelle2, 2).Value
               Workbooks(wkbMaske).Sheets(SMsName).Cells(ZielZelle, 6).Value = Zeile1
               
QuellZelle2 = QuellZelle2 + 1
ZielZelle = ZielZelle + 1
FehlendeBt = 1

Else


QuellZelle2 = QuellZelle2 + 1

End If
Next D

If FehlendeBt = 1 Then

MsgBox "Achtung! Es Fehlen Bauteile in der Rüstung"

Else

MsgBox "Rüstung komplett!"

End If

On Error Resume Next
Workbooks(wkbMaske).Sheets(SMsName).Range("F8:F" & ZielZelle).RemoveDuplicates Columns:=1, Header:=xlNo
Application.Calculation = xlCalculationAutomatic



End Sub
Top
#2
variantarray = Range("was Du bislang beackerst")
variantarray(i, j) = irgendwelche Operationen
Range("was Du bislang beackerst") = variantarray

macht es 100-500mal schneller
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Top
#3
Hallo,

wenn man sich die Mühe macht Deinen Quellcode mal zu formatieren, damit auch sieht was wozu gehört, fallen mir direkt zwei Sachen auf:

  1. Sobald festgestellt wurde, dass eine Rüstung unvollständig ist, kannst Du die Suche beenden. Dazu schreibst Du in der For-Schleife zwischen FehlendeBt = 1 und Else die Zeile Exit For. Dadurch wird die Schleife sofort unterbrochen.
  2. Der Else-Zweig in der For-Schleife manipuliert Deinen Schleifenzähler. Das ist falsch, denn die For-Schleife zählt diese Variable automatisch weiter. Deshalb nennt man sie auch Laufvariable und die For-Schleife begegnet einem auch schonmal als Zählschleife. Also kannst Du das Else und QuellZelle2 = QuellZelle2 + 1 ersatzlos löschen.
Den Rest habe ich mir jetzt nicht genauer angesehen, da der Code mangels Beispieldatei nicht testbar ist.


Viele Grüße,

Zwenn

Edit: Sehe grade, dass D die Laufvariable ist. Damit ist QuellZelle2 dann der Startwert für D. Den Else Zweig musst Du trotzdem löschen.
Top
#4
Hallo,

danke, für eure Antworten.
Habe auch nochmal die Datei angefügt, der Button "Rüstung Check"  startet den betreffenden Code.


Zwenn
Wenn ich das Else raus mache funktioniert es allerdings nicht mehr. Der Code soll auch nicht unterbrochen werden, wenn festgestellt wurde, dass die Rüstung nicht komplett ist, da ich jede fehlende Nummer als Ausgabe haben möchte, daher muss es einmal durchlaufen.

@ LCohen 
Würde es dir was ausmachen das schnell in den Code einzufügen, denn ehrlich gesagt, versteh ich es im Augenblick nicht.


Gruß


Angehängte Dateien
.xlsm   001_A.xlsm (Größe: 369,37 KB / Downloads: 1)
Top
#5
Hi,

wenn du hier Dateien hochlädtst, musst du nach dem Auswählen deiner Datei noch rechts den Button "Attachment hinzufügen" anklicken.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
[-] Folgende(r) 1 Nutzer sagt Danke an WillWissen für diesen Beitrag:
  • HZ25
Top
#6
(22.05.2019, 12:11)HZ25 schrieb: ...
Zwenn
Wenn ich das Else raus mache funktioniert es allerdings nicht mehr. Der Code soll auch nicht unterbrochen werden, wenn festgestellt wurde, dass die Rüstung nicht komplett ist, da ich jede fehlende Nummer als Ausgabe haben möchte, daher muss es einmal durchlaufen.
...

Hallo,

Du hast QuellZelle2 = QuellZelle2 + 1 auch noch im Code-Block nach dem If in der For-Schleife stehen. Das muss auch raus. Beschäftige Dich mal mit der Syntax der For-Schleife, dann wirst Du erkennen, warum es so nicht funktionieren kann.

Ein paar weitere Tipps, die ich Dir ad hoc mit auf den Weg geben möchte:
  1. Schreibe in jedem Modul ganz oben immer die Zeile Option Explicit hin. Das zwingt Dich alle verwendeten Variablen zu deklarieren. Dadurch ersparst Du Dir bei einfachen Tippfehlern in Variablennamen im Quellcode bereits jede Menge Zeit beim Auffinden des Fehlers. Machst Du das nicht, erstellt VBA nämlich einfach eine Variable mit dem Namen, der bei der ersten Verwendung da steht, wenn die Variable nicht daklariert wurde. Hast Du also z.B. eine Variable zollHaus deklariert und verwendest sie später falsch, z.B. als zolHaus, wird zolHaus von VBA als Variable eingerichtet und Du wunderst Dich über das Verhalten Deines Codes.
  2. Strukturiere Deinen Quellcode sauber durch Einrückungen und weniger Leerzeilen. Wenn ich in Deinen Quellcode gucke, habe ich nach drei Zeilen schon keine Lust mehr weiter zu gucken. Man sieht überhaupt nicht, was wozu gehört und was wie geschachtelt ist.
  3. Vermeide Sonderzeichen in Bezeichnern. Also z.B. keine deutschen Umlaute in Funktions- und Variablennamen. Sobald Du in irgend einer Form mit einer anderen Sprachversion in Kontakt kommst, gibts Probleme und sei es nur, dass es die verwendeten Zeichen nicht auf dem verwendeten Tastaturlayout gibt.
  4. Kommentiere mehr, was Dein Code macht. Ich weiß, dass man das grade als Anfänger als lästig empfindet. Aber hier fragst Du uns nach Hilfe und wir müssen erstmal rausfinden, was Dein Code überhaupt macht bzw. machen soll. Weiterhin garantiere ich Dir, dass Du selbst in drei Wochen nicht mehr weißt, was Du da programmiert hast. Das ist sehr ätzend, wenn Du Änderungen oder Erweiterungen durchführen willst oder Dir doch noch ein Fehler untergekommen ist, den Du beheben willst. Ein guter Anfang wäre, in jedes Modul oben erstmal mit eigenen Worten zu beschreiben, wozu das Modul da ist und was es wie lösen soll. Das wird Dir auch beim Entwickeln helfen, denn das Verfassen dieses Textes strukturiert automatisch Deine Gedanken zum beschriebenen Vorhaben. Es ist auch ratsam aufzuschreiben, wie Deine Module miteinander zusammenarbeiten, falls sie das machen.
Ansonsten vielleicht insgesamt mal mehr mit der Syntax beschäftigen. Wenn Du z.B. in einer Entscheidung (If) gar keinen alternativen Codepfad benötigst (Else), dann brauchst Du das Else auch nicht hinschreiben.

Viele Grüße,

Zwenn
Top
#7
(22.05.2019, 12:11)HZ25 schrieb: Würde es dir was ausmachen das schnell in den Code einzufügen, denn ehrlich gesagt, versteh ich es im Augenblick nicht.
Könnte ich das schnell, würde mir das tatsächlich nichts ausmachen ;)
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste