【问题标题】:Why are the input box variables switching to null after the first iteration of a loop?为什么输入框变量在循环的第一次迭代后切换为 null?
【发布时间】:2017-02-17 16:39:39
【问题描述】:

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

谢谢

【问题讨论】:

  • 如何调用宏? w 和 Z 没有定义。问题可能来自图表激活,请尝试将其删除。
  • @VincentG 我尝试取出图表激活,但我仍然遇到同样的问题。我的结论是这是一个excel错误。当我运行代码时,excel 随机关闭。它在我单步执行代码时关闭,它在代码崩溃并且我单击“调试”或“结束”时关闭。出于某种原因,Excel 真的很讨厌上面的代码。
  • 为什么要激活图表然后设置坐标轴?您应该可以简单地说“With Worksheets(w).ChartObjects(Z)”。我也没有看到任何应该重置您的变量的东西。您确定它们在循环中被重置吗?
  • @BrandonBarney 感谢代码优化提示。我同意没有理由激活图表。我猜这不是真正的循环重置变量,它是 .Axes(xlcategory).MinimulScale = start_date 重置变量。我已经监视了变量值,并且在那行代码之后, start_date 从“08/16/2016”之类的东西变成了“???????”。我实际上只是注意到,随着在它下面执行不同的代码行,问号的数量也发生了变化。真的很奇怪。

标签: excel vba


【解决方案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

【讨论】:

  • 这非常有效。非常有趣的是,将字符串传递给图表轴会使 excel 像那样崩溃。我没有像我应该考虑的那样考虑输入的数据时间。谢谢。
  • 我对这种特殊情况并不感到惊讶:Excel 图表对输入很挑剔。我对 Excel 崩溃也并不感到惊讶,因为 Excel 2013 尤其是 2016 似乎崩溃了很多,远远超过 2007 年和 2010 年。Excel 现在崩溃的次数几乎和我记得 Excel 4.0 曾经崩溃的次数一样多。
【解决方案2】:

我对您的代码进行了一些调整(见下文),这似乎是 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

【讨论】:

  • 所有 3 个 debug.print 应该显示相同的内容,但通常不是。
  • 感谢代码!当我运行它时,我的 excel 仍然关闭。但是我遇到了一个新错误。现在,当我尝试做任何事情时,excel 会给我一个“内存不足”对话框。所以现在我有了一个新的研究方向。一定是某种导致变量损坏的 excel 内存问题。
猜你喜欢
  • 2020-11-14
  • 2015-09-04
  • 1970-01-01
  • 2019-08-29
  • 2014-11-25
  • 2019-01-10
  • 2013-03-15
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多