ich bin neu hier und hoffe keine schlimmen Fehler im umgang mit den Forumregeln zu machen.
Ich habe ein Problem: Ich habe ein Programm in VBA geschrieben, das prinzipell läuft - wenn ich es mittels F8 in Einzelschritten ausführe.
Sinn und Zweck des Programms: Mittels des (in Excel) eingebauten Solvers werden in einer for-schleife Lösungen von Extremwertproblemen* in ein Array geschrieben. Das funktioniert auch.
* Für die Interessierten: Es Handelt sich um ein Programm zur Berechnung einer Kupferspule unter Berücksichtigung der Temperatur. Der Knackpunkt ist, das der Widerstand des Kupfers größer wird, je heißer er wird. Dazu kommt die Problematik, dass dünner Draht zwar mehr Windungen zu lässt aber bei gleichem Strom heißer wird ...
Nun zurück zum Problem:
Also die Arrays "Plot" und "d" sind garantiert richtig berechnet. Ich konnte das Problem im Teil des Programms, welches zur Erstellung der Diagramme zuständig ist lokalisieren. Das komplette Programm ist leider zu umfangreich um es hier zu Posten, deshalb habe ich hier nur den kritischen Teil eingefügt.
'=============================================================
'==================== Plot 1: Drahtdurchmesser d =============
'Application.Wait (Now + TimeSerial(0, 0, tWait))
m = 1 'für Positionierung des Diagramms
Set MyChart = ActiveSheet.Shapes.AddChart(xlXYScatterLines).Chart
Sleep tWaitMs
ActiveSheet.ChartObjects(m).Left = Range("E23").Left
Sleep tWaitMs
ActiveSheet.ChartObjects(m).Top = Range("E23").Top + (m - 1) * 0.5 * Application.Height
Sleep tWaitMs
ActiveSheet.ChartObjects(m).Height = 0.5 * Application.Height
Sleep tWaitMs
ActiveSheet.ChartObjects(m).Width = 0.5 * Application.Width
Sleep tWaitMs
'Alle Datenreihen löschen
While MyChart.SeriesCollection.Count > 0
MyChart.SeriesCollection(m).Delete
Sleep tWaitMs
Wend
With MyChart
Sleep tWaitMs
.PlotArea.Width = Round(0.5 * Application.Width - Legendenbreite - 1, 0)
Sleep tWaitMs
'.Legend.Font.Bold = True
.HasTitle = True
Sleep tWaitMs
'.ChartTitle.Text = "Verlauf der Kenngrößen einer Spule für alle Grenztemperaturen"
.Axes(xlCategory).MinimumScale = Plot(0)
Sleep tWaitMs
.Axes(xlCategory).MaximumScale = Plot(n)
Sleep tWaitMs
'Drahtdurchmesser
.SeriesCollection.NewSeries
Sleep tWaitMs
.SeriesCollection(m).Name = "Drahtdruchmesser [mm]"
Sleep tWaitMs
.SeriesCollection(m).XValues = Plot
Sleep tWaitMs
.SeriesCollection(m).Values = d
Sleep tWaitMs
.PlotArea.Width = Round(0.5 * Application.Width - Legendenbreite - 1, 0)
Sleep tWaitMs
End With
Sleep tWait
Der zugehörige Fehler:
Laufzeitfehler '-2147467259 (80004005)':
Automatisierungsfehler
Nicht spezifizierter Fehler
Googlen hat ergeben:
"Um dieses Problem zu umgehen, heben Sie die Schutz für das Arbeitsblatt auf, um die Ausführung des Makros zu erlauben. Das Arbeitsblatt kann manuell aufgehoben oder mit der Unprotect - Methode im Makro."
Nun, das Arbeitsblatt hat sicher keinen Schutz - ich habe die Unprotect - Methode im Makro dennnoch getestet - ohne Erfolg.
Und wie gesagt: Mit F8 (Einzelschritt) funktioniert das Ganze!
Ich habe die Vermutung das das Programm etwas zu schnell für Excel ausgeführt wird - Aus diesem Grund habe ich die Sleep-befehle (je 0.1 s) eingefügt. Ohne Erfolg.
Ich habe auch Application.ScreenUpdating = False und ähnliche Späße getestet.
So allmählich bin ich mit meinem Latain am Ende!
Hat jemand eine Idee wie ich VBA mitteilen kann, dass es das Programm bitteschön "Zeile für Zeile" abzuarbeiten hat, notfalls mit warten?
Eine Anmerkung am Ende: Es gibt diese Plotsektion - Stand jetzt - 8 mal. Diese sind abgesehen von den zu plottenden Werten identisch. Der Abbruch kommt nicht immer in der ersten Sektion, manchmal auch in der 2. und ganz selten auch erst in der 3. Je nach dem wie gut die CPU aus dem Wochenende kommt -.-' . Im Übrigen können wir "zu langsame Hardware" wohl ausschließen. Es ist eine Workstation mit Dual CPU und 24 physischen Kernen die nicht ganz schwach auf der Brust ist.