2017-02-17 12 views
0

我寫了一些簡單的VBA代碼來更新excel文檔中很多時間序列圖的x軸。爲什麼輸入框變量在循環的第一次迭代後切換爲空?

我遇到的問題是,在循環的第一次迭代之後,start_date和end_date變量變成「」。我不確定變量爲什麼會消失。該宏對第一個圖表起作用,但由於可變問題而導致崩潰。

這是我的代碼:

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 

謝謝

+0

你如何調用宏? w和Z沒有定義。問題可能來自圖表激活,請嘗試刪除它。 –

+0

@VincentG我試圖拿出圖表激活,我仍然有同樣的問題。我的結論是,這是一個Excel錯誤。當我運行代碼excel隨機關閉。當我逐步完成代碼時它會關閉,當代碼崩潰時它會關閉,然後單擊「調試」或「結束」。出於某種原因,Excel真的不喜歡上面的代碼。 – Jarom

+0

爲什麼激活圖表然後設置座標軸?你應該只能說「With Worksheets(w).ChartObjects(Z)」。我沒有看到任何應該重置變量的內容。你確定他們正在循環內重置嗎? –

回答

1

除了聲明所有變量(w,z)之外,您必須明智地告訴您如何將值傳遞給軸限制。您的輸入框將日期作爲字符串提供。 start_dateend_date的值不會變成「」,但由於某些原因,字符串僅在循環中第一次正確解釋。出於某種原因,將字符串傳遞給圖表軸會使Excel非常不穩定。

在下面的代碼中,我使用DateValue()將它們轉換爲實際日期,並將它們傳遞到圖表中。

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

這工作完美。這非常有趣,將字符串傳遞給圖表軸會導致excel崩潰。我沒有想到應該輸入的數據時間。謝謝。 – Jarom

+0

我對這種特殊情況並不感到驚訝:Excel圖表對輸入很感興趣。我對Excel崩潰也沒有太驚訝,因爲Excel 2013和尤其是2016年似乎崩潰了很多,遠遠超過2007年和2010年.Excel現在崩潰的速度幾乎和我記得Excel 4.0曾經崩潰一樣多。 –

1

我已經調整了一點點你的代碼(見下文),它似乎是在Excel中如何設置屬性(錯誤不總是,但經常修改用於將它們設置爲其他值的變量)。解決方法(在下面的代碼中使用)將使用緩衝區變量。

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

所有3 debug.print應該顯示相同的東西,但通常它們不是。 –

+0

感謝您的代碼!當我運行它時,我的excel仍然關閉。但是我得到了一個新的錯誤。現在當我嘗試做任何事情時,excel會給我一個「Out of Memory」對話框。所以,現在我有一個新的方向去尋找。必須是某種導致變量損壞的Excel內存問題。 – Jarom

相關問題