为什么输入框变量在循环的第一次迭代后切换为null?

时间:2017-02-17 16:39:40

标签: excel vba

我写了一些简单的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

谢谢

2 个答案:

答案 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_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