Thema Datum  Von Nutzer Rating
Antwort
Rot Makro läuft zu lange
15.03.2018 11:39:19 David
NotSolved
15.03.2018 11:57:05 Magnus
NotSolved
15.03.2018 12:09:46 Gast82776
NotSolved

Ansicht des Beitrags:
Von:
David
Datum:
15.03.2018 11:39:19
Views:
1247
Rating: Antwort:
  Ja
Thema:
Makro läuft zu lange
Hallo allerseits! Ich habe ein Problem und hoffe hier die Antwort darauf zu finden. Ich habe eine Excel Datei, welche ein Makro enthält. Aufgabe des Makros ist es, 2 Tabellen, in denen Dateien aufgelistet sind, zu analysieren und die Unterschiede auszuwerten. D.h.: Ich kann die alte und die neue Version einer Datei wählen und dann wird mir die Differenz, also die Dokumente die seit der letzten Version dazugekommen sind, angezeigt. Bis hier her funktioniert ja alles. Das Problem ist jedoch dass das Makro ca. einen halben Tag läuft bis ein Ergebnis präsentiert wird. Ich schätze das liegt am Suchalgorithmus. Habe einen anderen gefunden doch ich weis nicht wie ich ihn einbauen kann. Ich habe nichts von all dem selber geschrieben. Hab es so bekommen, doch das ist echt kein Stand mit dem man arbeiten kann. Ich hoffe dass ich mich so ausgedrückt habe, dass mein Problem verständlich für euch ist. Code: Private Sub Cancel_Click() Unload Win End Sub Private Sub Start_Click() Dim reportneu, reportalt, dokneu As Worksheet, dokalt As Worksheet, repneu As Worksheet, repalt As Worksheet, wbk As Workbook, pfad As String reportneu = Application.GetOpenFilename If reportneu = False Then Exit Sub Else Set dokneu = Workbooks.Open(reportneu).Worksheets("DOK") Set repneu = ActiveWorkbook.Worksheets("REP") End If pfad = dokneu.Parent.Path reportalt = Application.GetOpenFilename If reportalt = False Then Exit Sub Else Set dokalt = Workbooks.Open(reportalt).Worksheets("DOK") Set repalt = ActiveWorkbook.Worksheets("REP") End If Set wbk = Workbooks.Add wbk.Worksheets(3).Delete wbk.Worksheets(2).Delete If CheckBox1 = True Then wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Geloeschte Dokumente" Call geloeschte_Dokumente(dokneu, dokalt) End If If CheckBox2 = True Then wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Neue Versionen von Dokumenten" Call neue_Versionen_Dokumente(dokneu, dokalt) End If If CheckBox3 = True Then wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Neu hinzugefügte Dokumente" Call hinzugefuegte_Dokumente(dokneu, dokalt) End If ' If CheckBox4 = True Then ' wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Geloeschte Artikel" ' Call geloeschte_Artikel(repneu, repalt) ' End If ' If CheckBox5 = True Then ' wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Neue Versionen von Artikeln" ' Call neue_Versionen_Artikel(repneu, repalt) ' End If ' If CheckBox6 = True Then ' wbk.Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Neu hinzugefügte Artikel" ' Call hinzugefuegte_Artikel(repneu, repalt) ' End If Unload Win wbk.Worksheets(1).Delete Application.DisplayAlerts = False dokneu.Parent.Close dokalt.Parent.Close wbk.SaveAs (pfad & "Vergleich_MARA-Report.xlsx") Application.DisplayAlerts = True End Sub Sub geloeschte_Dokumente(wshneu As Worksheet, wshalt As Worksheet) 'Gibt die Dokumente aus, die in der alten Version vorkommen, aber in der neuen fehlen Dim a As Long, z As Long, doknr As String, wsh As Worksheet, zelle As Range, erstezelle As String, suchbereich As Range, ergebnis As Range Set wsh = ActiveWorkbook.Worksheets("Geloeschte Dokumente") wshalt.Rows(1).Copy wsh.Rows(1) z = 2 For a = 2 To wshalt.Cells(Rows.Count, 1).End(xlUp).Row If wshalt.Cells(a, 2).Value Like "*-*" Then doknr = Left(wshalt.Cells(a, 2), InStr(wshalt.Cells(a, 2), "-") - 1) Else doknr = Left(wshalt.Cells(a, 2), InStr(wshalt.Cells(a, 2), ".") - 1) End If Set zelle = wshneu.Columns(2).Find(what:=doknr, after:=wshneu.Cells(wshneu.Cells(Rows.Count, 1).End(xlUp).Row, 2)) If zelle Is Nothing Then wshalt.Rows(a).Copy wsh.Rows(z) z = z + 1 Else erstezelle = zelle.Address Set suchbereich = wshneu.Rows(zelle.Row) Do Until zelle Is Nothing Set zelle = wshneu.Columns(2).FindNext(after:=zelle) Set suchbereich = Union(suchbereich, wshneu.Rows(zelle.Row)) If zelle.Address = erstezelle Then GoTo weiter End If Loop weiter: For Each cell In suchbereich If cell.Column = 1 And cell.Value = wshalt.Cells(a, 1).Value Then Set ergebnis = cell End If Next If ergebnis Is Nothing Then wshalt.Rows(a).Copy wsh.Rows(z) z = z + 1 End If Set ergebnis = Nothing End If Next a wsh.Activate wsh.Columns("A:D").AutoFit End Sub Sub neue_Versionen_Dokumente(wshneu As Worksheet, wshalt As Worksheet) 'Gibt die Dokumente aus, die in der neuen Version einen höheren Index haben als in der alten Dim a As Long, b As Long, z As Long, doknr As String, wsh As Worksheet, zelle As Range Set wsh = ActiveWorkbook.Worksheets("Neue Versionen von Dokumenten") wshalt.Rows(1).Copy wsh.Rows(1) wsh.Columns(2).Insert wsh.Cells(1, 2).Value = "Dokument verlinkt - alte Version" wsh.Cells(1, 3).Value = "Dokument verlinkt - neue Version" z = 2 For a = 2 To wshneu.Cells(Rows.Count, 1).End(xlUp).Row If wshneu.Cells(a, 2).Value Like "*-*" Then doknr = Left(wshneu.Cells(a, 2), InStr(wshneu.Cells(a, 2), "-") - 1) Else doknr = Left(wshneu.Cells(a, 2), InStr(wshneu.Cells(a, 2), ".") - 1) End If Set zelle = wshalt.Columns(2).Find(doknr) naechste: If zelle Is Nothing = False Then If Left(wshalt.Cells(zelle.Row, 2), 13) <> Left(wshneu.Cells(a, 2), 13) And wshalt.Cells(zelle.Row, 1) = wshneu.Cells(a, 1) Then wshneu.Cells(a, 1).Copy wsh.Cells(z, 1) wshalt.Cells(zelle.Row, 2).Copy wsh.Cells(z, 2) wshneu.Cells(a, 2).Copy wsh.Cells(z, 3) wshneu.Cells(a, 3).Copy wsh.Cells(z, 4) wshneu.Cells(a, 4).Copy wsh.Cells(z, 5) z = z + 1 End If Set zelle = wshalt.Range("B" & CStr(zelle.Row + 1) & ":B" & CStr(wshalt.Cells(Rows.Count, 2).End(xlUp).Row)).FindNext GoTo naechste End If wsh.Activate wsh.Columns("A:E").AutoFit Next a End Sub Sub hinzugefuegte_Dokumente(wshneu As Worksheet, wshalt As Worksheet) 'Gibt die Dokumente aus, die nur in der neuen Version vorkommen Dim a As Long, z As Long, doknr As String, wsh As Worksheet, zelle As Range, erstezelle As String, suchbereich As Range, ergebnis As Range Set wsh = ActiveWorkbook.Worksheets("Neu hinzugefügte Dokumente") wshneu.Rows(1).Copy wsh.Rows(1) z = 2 For a = 2 To wshneu.Cells(Rows.Count, 1).End(xlUp).Row If wshneu.Cells(a, 2).Value Like "*-*" Then doknr = Left(wshneu.Cells(a, 2), InStr(wshneu.Cells(a, 2), "-") - 1) Else doknr = Left(wshneu.Cells(a, 2), InStr(wshneu.Cells(a, 2), ".") - 1) End If Set zelle = wshalt.Columns(2).Find(what:=doknr, after:=wshalt.Cells(wshalt.Cells(Rows.Count, 1).End(xlUp).Row, 2)) If zelle Is Nothing Then wshneu.Rows(a).Copy wsh.Rows(z) z = z + 1 Else erstezelle = zelle.Address Set suchbereich = wshalt.Rows(zelle.Row) Do Until zelle Is Nothing Set zelle = wshalt.Columns(2).FindNext(after:=zelle) Set suchbereich = Union(suchbereich, wshalt.Rows(zelle.Row)) If zelle.Address = erstezelle Then GoTo weiter End If Loop weiter: For Each cell In suchbereich If cell.Column = 1 And cell.Value = wshneu.Cells(a, 1).Value Then Set ergebnis = cell End If Next If ergebnis Is Nothing Then wshneu.Rows(a).Copy wsh.Rows(z) z = z + 1 End If Set ergebnis = Nothing End If Next a wsh.Activate wsh.Columns("A:D").AutoFit End Sub 'Sub geloeschte_Artikel(wshneu As Worksheet, wshalt As Worksheet) ' Dim a As Long, b As Long, z As Long, artnr As String, wsh As Worksheet, spalteneu As Integer, spaltealt As Integer ' Dim zelle As Range, erstezelle As String, suchbereich As Range, ergebnis As Range, e As Integer ' Set wsh = ActiveWorkbook.Worksheets("Geloeschte Artikel") ' wshalt.Rows(1).Copy wsh.Rows(1) ' spalteneu = 1 ' Do While wshneu.Cells(1, spalteneu).Value Like "*artikel*nummer*" = False ' spalteneu = spalteneu + 1 ' Loop ' spaltealt = 1 ' Do While wshalt.Cells(1, spaltealt).Value Like "*artikel*nummer*" = False ' spaltealt = spaltealt + 1 ' Loop ' z = 2 ' a = 2 ' b = 2 ' Do While a <= wshalt.Cells(Rows.Count, 1).End(xlUp).Row ' If wshalt.Cells(a, spaltealt).Value = wshneu.Cells(b, spalteneu) Then ' 'überprüft, ob der Artikel revisioniert wurde - wenn nicht, wird er übersprungen ' If wshalt.Cells(a, spaltealt + 1).Value = wshneu.Cells(b, spalteneu + 1) And wshalt.Cells(a, 2).Value > 1 Then ' e = wshalt.Cells(a, 2).Value ' 'überspringt alles, was zu diesem Artikel gehört ' Do While wshalt.Cells(a, 2).Value < e ' a = a + 1 ' Loop ' b = a ' else 'End Sub Das ist der Code, welchen es zu verbessern gilt. Checkbox 4 bis 6 sind momentan noch ohne Funktion. Bei den anderen muss der Suchalgorithmus so verbessert werden, dass sich die Laufzeit stark verkürzt. Bei Fragen stehe ich natürlich zu Verfügung

Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:

 
 

  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Makro läuft zu lange
15.03.2018 11:39:19 David
NotSolved
15.03.2018 11:57:05 Magnus
NotSolved
15.03.2018 12:09:46 Gast82776
NotSolved