Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1616to1620
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

Laufzeitproblem bei Makro-Ausführung via Button

Laufzeitproblem bei Makro-Ausführung via Button
26.03.2018 13:32:57
Alex
Hallo zusammen,
dies ist mein erster Forenbeitrag - ich hoffe, ich trete nicht direkt in ein Fettnäpfchen...
Folgende Situation:
Ich habe ein Makro geschrieben, welches bei Ausführung aus dem VBA Editor heraus ca. 10 Sekunden benötigt.
Weise ich dieses Makro nun einem Steuerelement zu - sprich, ich möchte, dass das Makro nach Klick auf einen Knopf startet, so verringert sich die Performance signifikant. Die Ausführung benötigt nun ca. 1 Stunde - teils treten Fehler auf.
In Foren konnte dieses Problem teils folgendermassen gelöst werden:
- Formelupdate auf manuell stellen bei Makrostart
- Screen update deaktivieren bei Makrostart
- VBA Editor automatisch aufrufen bei Makrostart
- Button löschen, neu definieren, andere Schaltflächen verwenden etc.
Leider hat keine dieser Optionen zu einer Laufzeitverbesserung geführt.
Zusätzlich habe ich versuchsweise alle Daten und Codefragmente mal in ein neues Excel-Sheet kopiert. Ebenfalls ohne Erfolg. Hintergrund hierbei sind Erfahrungen aus PlantSimulation gewesen: Hier wurden teilweise alte Objekte nicht 100% gelöscht, was dann irgendwann zu Laufzeitproblemen geführt hat.
Hat jemand eine Idee woran diese Laufzeit-Schwankungen liegen könnten (Makro öffnen über Knopf vs. direkt im VBA Editor)? ...Ich drehe langsam etwas durch :D

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Beschreibungsproblem
26.03.2018 13:57:23
Klexy
Ist das Makro in der zu bearbeitenden Datei?
Enthält die Datei Formeln?
Welche Formeln?
Ändern sich die durch die Formeln errechneten Werte während des Makrodurchlaufs?
Hat das Makro Schleifen?
Was macht das Makro?
Alles Sachen, die man nicht erraten kann, wenn du die Datei und das Makro nicht hochlädst.
AW: Beschreibungsproblem
26.03.2018 14:15:23
Alex
Hi Klexy,
vielen Dank für die schnelle Antwort. Ich habe mich mit den Erklärungen zurückgehalten, da das Makro ja lediglich über den Start mittels Steuerelementen Probleme bereitet. Aus dem Editor heraus funktioniert es einwandfrei.
Im Folgenden die Antworten auf deine Punkte:
Funktion des Makros: Eigentlich addiert das Makro lediglich Werte. Genauer: Es kumuliert Prozesszeiten für X Komponenten einer Prozesskette. Dazu durchläuft es via For-Schleifen jede Zeile (=Prozesszeit eines spezifischen Prozesses) innerhalb jeder Spalte (= Komponente), die zu einer bestimmten Prozesskette gehören.
Verwendete Formeln innerhalb des Sheets, aus dem ich Daten in ein neues Sheet kopiere und aufaddiere: SUMMEWENN, INDIREKT, SVERWEIS. ABER: Habe den Code auch komplett ohne Formeln laufen lassen und dies führte zum gleichen Laufzeitproblem.
Das Makro befindet sich in der gleichen Datei, aus der ich Daten kopiere und addiere. Es wird keine zusätzliche Excel-File geöffnet.
Mittlerweile habe ich auch andere Makros von mir getestet: Bei jedem Makro ist die Laufzeit wesentlich schlechter, wenn ich es über ein Steuerelement starte im Vergleich zum Start aus dem VBA Editor. Ist mir vorher nur nie aufgefallen, da ich lediglich kleinere Makros hatte.
Grüsse,
Alex
Anzeige
AW: Beschreibungsproblem
26.03.2018 15:44:59
Klexy
Der Kernpunkt meiner Anmerkung waren nicht die Fragen (die nur beispielhaft sind), sondern dieser Teil:
...wenn du die Datei und das Makro nicht hochlädst.
Vermutlich lässt dein Makro den Formeln nicht genug Zeit, sich zu aktualisieren und arbeitet dann in der Schleife 1000x mit dem alten Wert weiter, weil es den neuen nicht bekommt, auf den es wartet.
Du musst an den entscheidenden Stellen möglicherweise "Calculate" einfügen. Und danach ein wenig warten:
Public Function Wait(MilliSekunden As Double)
Dim i As Double, Ende As Double
Ende = Timer + (MilliSekunden / 1000)
Do While i 

Anzeige
oder einfach Sleep verwenden
26.03.2018 16:06:08
Peter(silie)
Hallo,

Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub Sleep _
Lib "kernel32" ( _
ByVal dwMilliseconds As LongPtr)
#Else
Public Declare Sub Sleep _
Lib "kernel32" ( _
ByVal dwMilliseconds As Long)
#End If
Sub Wait(ByVal ms As Long)
Sleep ms
End Sub
Gebe dir zwar mit dem Datei und Code Upload recht aber:
- Wozu Millisekunden als Gleitkommazahl übergeben
- Warum Millisekunden durch 1000 rechnen, dann bekommst du 0,001ms was 1000 Nanosekunden sind
Millisekunden sind doch schon klein genug
AW: oder einfach Sleep verwenden
26.03.2018 16:59:53
Klexy
Möglicherweise ist Double zu hoch gegriffen, ist aber eigentlich egal, es sei denn, man ruft es 1000x pro Makro auf.
Weil ich dort, wo ich die Wait-Fnuktion anwende, Millisekunden brauche, habe ich den etwas irreführenden Weg über die Millisekunden genommen. Man kann natürlich auch gleich Sekunden nehmen und das /1000 weglassen.
Mit der Sleep-Funktion gab es mal Probleme, ich weiß aber nicht mehr wie und warum.
Anzeige
AW: oder einfach Sleep verwenden
26.03.2018 22:02:30
Peter(silie)
Hallo,
ich vermute dass das Problem die Inkompatibilität zwischen VBA7 und 6 oder 32bit und 64 bit Office ist,
dies sollte aber durch den Safe Pointer und den Long Pointer behoben sein.
Links dazu:
https://msdn.microsoft.com/de-de/vba/language-reference-vba/articles/64-bit-visual-basic-for-applications-overview
http://www.jkp-ads.com/articles/apideclarations.asp
.....an Peter(silie)
27.03.2018 08:36:50
STeve
... betrifft nicht dieses Ersuchen:
@Peter(silie):
Bitte schau dir meinen Beitrag/Ersuchen vom 26.3.18, 15.26 Uhr an.
Danke STeve
Anzeige
AW: Beschreibungsproblem
26.03.2018 16:10:48
Alex
Hi Klexy - danke nochmals.
Die Datei habe ich nicht hochgeladen, da das Problem meiner Meinung nach nicht mit dem Code oder den Daten/Formeln zusammen hängt. Es funktioniert ja alles uper, solange ich das Makro aus dem VBA Editor starte. Zudem tritt dieses Problem ebenfalls bei anderen Makros auf: Aufrufen der Prozedur aus dem VBA Editor = alles super. Aufrufen der Prozedur über eine Schaltfläche in der Arbeitsmappe = super langsam.
Schätze deinen Tipp sehr, allerdings kann es das nicht sein, da ich das Makro auch bereits auf eine komplett "formelfreie" Excel Datei angewandt habe (alle Mappeninhalte als reine Werte kopiert) - hier kommt es ebenfalls zu Laufzeitproblemen.
Anzeige
AW: Beschreibungsproblem
26.03.2018 17:05:16
Klexy
Tja, wenn du das so genau weißt, dass es weder an den Formeln noch am Makro liegt, ist es natürlich überflüssig, die Datei hochzuladen.
AW: Beschreibungsproblem
29.03.2018 09:57:59
Alex
Hi Klexy, hi Peter(silie),
habe die letzten Tage noch mal einiges ausprobiert - nichts davon hat zum Erfolg geführt:
  • Daten und Code in neue excel-file als reine Werte kopiert

  • Makros auf anderen Rechnern mit anderen Betriebssystemen und anderen Officeversionen (allerdings nur 32 Bit Office Versionen) getested

  • Alle Prozeduren und Variablen als "public" deklariert

  • Redundante Prozedurnamen in unterschiedlichen Modulen zu Unikaten abgehändert

  • @Peter(silie): Ich hatte auch bereits über Kompatibilitätsprobleme in einem anderen Forum gelesen - allerdings verstehe ich es so, dass diese Probleme nicht auftreten sollten, falls man den code im 32bit Office erstellt hat und auch dort nur ablaufen lässt? Dies ist bei mir der Fall. Wir nutzen im Unternehmen lediglich die 32bit MS Office Version 2016.
    Ein Kollege geht davon aus, dass es ein Kompilierungsfehler ist: Anscheinend werden Programme unterschiedlich kompiliert, wenn sie über den Editor geöffnet werden vs. über ein Nutzerelement. Hier komme ich aber auch nicht weiter.
    Habe dann die langsame Laufzeit umgangen, indem das Makro nun als erstes den Editor aufruft. Das funktioniert. Allerdings läuft seitdem ein anderes Makro, das bisher immer schnell gelaufen ist, langsam - ich drehe durch.
    Unten dargestellt die Hauptprozedur "main", die bei Betätigen des Steuerelements aufgerufen wird. Diese ruft dann alle Sub-Prozeduren auf. Zudem die verwendeten Modul/globale Variablen. Seht ihr hierbei auf Anhieb einen Fehler?
    Option Explicit
    Dim OnePOSheet_Name As String
    Dim SinglePOSheet_Name As String
    Dim QualiMatrixTable_Name As String
    Dim StartColumnPNs_OnePO As Long
    Dim LastColumn As Long
    Dim SinglePOTable_Name As String
    Dim i As Long
    Dim j As Long
    Dim errorcounter As Long
    Public Sub main()
    'Application.VBE.MainWindow.Visible = True
    Application.ScreenUpdating = False
    Application.Calculate
    Application.Calculation = xlCalculationManual
    OnePOSheet_Name = "OnePO_CTs"
    SinglePOSheet_Name = "SingleOps_CTs"
    QualiMatrixTable_Name = "Qualification Matrix_Table"
    SinglePOTable_Name = "Table_SingleOps"
    errorcounter = 0
    ' Lösche altes 1PO Sheet & Füge neues 1PO sheet ein
    Call CreateNewSheet
    ' Kopiere Single-PN Tabelle in neues sheet als values
    Call CopyTable
    ' Kopiere 1PO-PN aus Qualificatin Matrix Tabelle > lösche duplikate > Transponiere Werte
    Call InsertOnePoPNs
    ' Führe Rückwärtsbestimmung der Vorgänger PNs durch und pflege die CTs ein
    Call AllocateOnePOTimes
    ActiveWorkbook.Protect
    Application.Calculation = xlCalculationAutomatic
    'Application.VBE.MainWindow.Visible = False
    Application.ScreenUpdating = True
    MsgBox ("OnePO Cycle Time & Costs update completed.")
    End Sub
    

    Anzeige
    AW: Beschreibungsproblem
    29.03.2018 10:08:53
    Alex
    Könnten Tabellenformatierungen evtl. zu "Ausleseproblemen" führen?
    Ich spreche öfters Datenbereiche über ihren Tabellennamen im Code an.

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige