为什么input框variables在循环的第一次迭代后切换为空?

我写了一些简单的VBA代码来更新excel文档中很多时间序列图的x轴。

我遇到的问题是,在循环的第一次迭代之后,start_date和end_datevariables变成“”。 我不知道为什么variables正在消失。 macros确实为第一个图表工作,但由于variables问题,之后崩溃。

这是我的代码:

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 

谢谢

除了声明你所有的variables(w,z)之外,你必须明白你如何将值传给轴限制。 您的input框将date作为string提供。 start_dateend_date的值不会变成“”,但由于某些原因,string只能在循环中第一次正确解释。 由于某些原因,将string传递给图表轴会使Excel非常不稳定。

在下面的代码中,我使用DateValue()将其转换为实际date,并将其传递到图表中。

 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 

我已经调整了一些你的代码(见下文),它似乎是Excel设置属性(并不总是,但经常修改用于将它们设置为其他值的variables)的错误。 解决方法(在下面的代码中使用)将使用缓冲区variables。

 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