2017-02-17 46 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

相关问题