2017-02-17 4 views
0

Ich schrieb einen einfachen VBA-Code, um die X-Achse vieler Zeitreihendiagramme in einem Excel-Dokument zu aktualisieren.Warum werden die Eingabefeldvariablen nach der ersten Iteration einer Schleife auf Null geschaltet?

Das Problem, das ich habe, ist, dass nach der ersten Wiederholung der Schleife Startdatum und Enddatum Variablen werden "". Ich bin mir nicht sicher, warum die Variablen verschwinden. Das Makro funktioniert für das erste Diagramm aber stürzt danach wegen des Variablenproblems ab.

Dies ist mein Code:

Sub xaxis_reset() 

Dim start_date As Variant 
Dim end_date As Variant 
Dim ws As Integer 
Dim obj As Integer 

start_date = InputBox("Start Date") 
end_date = InputBox("End Date") 
ws = ActiveWorkbook.Worksheets.Count - 2 

     For w = 1 To ws 
      obj = Worksheets(w).ChartObjects.Count 
       For Z = 1 To obj 
        Worksheets(w).ChartObjects(Z).Activate 
         With ActiveChart 
           .Axes(xlCategory).MinimumScale = start_date 
           .Axes(xlCategory).MaximumScale = end_date 
         End With 

       Next Z 
     Next w 

End Sub 

Danke

+0

Wie nennt man das Makro? w und Z sind nicht definiert. Das Problem könnte durch die Aktivierung des Diagramms verursacht werden. Versuchen Sie, es zu entfernen. –

+0

@VincentG Ich habe versucht, die Diagrammaktivierung herauszunehmen und habe immer noch das gleiche Problem. Meine Schlussfolgerung ist, dass dies ein Excel-Fehler ist. Wenn ich den Code ausführe, schließt sich der Code zufällig. Es ist geschlossen, während ich durch den Code gehe, er ist geschlossen, wenn der Code abstürzt und ich auf "Debug" oder "Ende" klicke. Aus irgendeinem Grund hasst Excel den obigen Code wirklich. – Jarom

+0

Warum das Diagramm aktivieren und dann die Achsen einstellen? Sie sollten einfach in der Lage sein, "Mit Worksheets (w) .ChartObjects (Z)" zu sagen. Ich sehe auch nichts, das deine Variablen zurücksetzen sollte. Sind Sie sicher, dass sie innerhalb der Schleife zurückgesetzt werden? –

Antwort

1

Abgesehen von der Deklaration all Ihrer Variablen (w, z) müssen Sie schlau sein, wie Sie Werte an die Achsengrenzen übergeben. Ihre Eingabefelder geben Daten als Zeichenfolgen an. Die Werte start_date und end_date werden nicht "", aber aus irgendeinem Grund werden die Strings erst beim ersten Durchlauf korrekt interpretiert. Aus irgendeinem Grund führt das Übergeben von Zeichenfolgen an eine Diagrammachse dazu, dass Excel bemerkenswert instabil wird.

Im folgenden Code verwende ich DateValue(), um diese in tatsächliche Daten zu konvertieren und diese in das Diagramm zu übergeben.

Sub xaxis_reset() 
    Dim start_date As Variant 
    Dim end_date As Variant 
    Dim w As Long, ws As Long 
    Dim z As Long, obj As Long 

    start_date = InputBox("Start Date") 
    end_date = InputBox("End Date") 
    ws = ActiveWorkbook.Worksheets.Count - 2 

    For w = 1 To ws 
    obj = Worksheets(w).ChartObjects.Count 
    For z = 1 To obj 
     Worksheets(w).ChartObjects(z).Activate 
     With ActiveChart 
     .Axes(xlCategory).MinimumScale = DateValue(start_date) 
     .Axes(xlCategory).MaximumScale = DateValue(end_date) 
     End With 
    Next z 
    Next w 
End Sub 
+0

Das funktioniert perfekt. Das ist sehr interessant, dass das Überfahren einer Zeichenkette mit einer Zeichenkette dazu führt, dass Excel so abstürzt. Ich habe nicht über die Daten der Eingabe nachgedacht, wie ich es hätte tun sollen. Vielen Dank. – Jarom

+0

Ich bin nicht überrascht über diesen speziellen Fall: Excel-Diagramme sind wählerisch über Eingaben. Ich bin auch nicht über Excel-Absturz überrascht, da Excel 2013 und vor allem 2016 viel mehr abstürzen, viel mehr als 2007 und 2010. Excel stürzt jetzt fast so sehr ab, wie ich mich erinnere, dass Excel 4.0 zum Absturz kam. –

1

Ich habe ein wenig Code eingestellt (siehe unten), und es scheint, in einen Fehler zu sein, wie Excel die Eigenschaften festzulegen (nicht immer, aber oft die Variable ändern, die verwendet wird, um sie auf andere Werte zu setzen). Eine Problemumgehung (die im folgenden Code verwendet wird) wäre die Verwendung einer Puffervariablen.

Sub xaxis_reset() 

    Dim start_date As Variant, start_buffer As Variant 
    Dim end_date As Variant, end_buffer As Variant 
    Dim w As Integer 
    Dim obj As ChartObject 

    While Not IsDate(start_date): start_date = InputBox("Start Date"): Wend 
    While Not IsDate(end_date): end_date = InputBox("End Date"): Wend 

    On Error Resume Next 
    For w = 1 To ActiveWorkbook.Worksheets.Count - 2 
     For Each obj In ActiveWorkbook.Worksheets(w).ChartObjects 
      start_buffer = start_date: end_buffer = end_date 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
      obj.Chart.Axes(xlCategory).MinimumScale = start_buffer 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
      obj.Chart.Axes(xlCategory).MaximumScale = end_buffer 
      Debug.Print w, start_date, end_date, start_buffer, end_buffer, (start_date = start_buffer), (end_date = end_buffer) 
     Next obj 
     Set obj = Nothing 
    Next w 
End Sub 
+0

Alle 3 debug.print sollten dasselbe anzeigen, aber oft nicht. –

+0

Danke für den Code! Mein Excel wird immer noch heruntergefahren, wenn ich es ausführe. Aber ich habe einen neuen Fehler bekommen. Jetzt, wenn ich versuche, etwas Excel zu machen, gibt mir eine "Out of Memory" -Dialogfeld. Jetzt habe ich eine neue Richtung, in die ich schauen muss. Es muss ein Excel-Speicherproblem sein, das die Variablen beschädigt. – Jarom

Verwandte Themen