我写了一些简单的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 :(得分: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
答案 1 :(得分:1)
除了声明所有变量(w,z)之外,您还必须明智地将值传递给轴限制。输入框提供日期为字符串。 start_date
和end_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