【问题标题】:Excel 2010 Redim Preserve crashExcel 2010 Redim Preserve 崩溃
【发布时间】:2012-01-19 18:06:58
【问题描述】:

通过在全新工作簿的 IDE 中输入以下内容,我能够以某种方式使 Excel 2010 崩溃:

private sub foo
    redim v(,1 to 3)

好的,你不太可能输入那个......但这是真正发生的事情:

private sub foo
    dim v(1 to N, 1 to M)
    ...
    M = New_Value
    redim preserve v(,1 to M)  ' seemed reasonable ... then CRASH !!!

有趣的是,VBA 要求您明确使用 2D redim 保留的第一个参数(因为您不允许更改第一个维度)。但是当一个简单的语法错误的惩罚是硬崩溃时,这并不好笑。这是一个环境相当干净的 IT 部门(没有安装插件,在 IDE 中启动 w 空项目窗格),并且“redim v(,1 to M)”也让我邻居的机器崩溃了——所以不仅仅是我。

我想知道这种行为是否发生在其他人身上,并发布它以防万一它可以节省其他人我浪费在重建工作簿直到我确定错误的时间。

【问题讨论】:

  • 这很有趣。我刚刚将您的示例 #2 粘贴到一个新的 Excel 模块中,整个事情都崩溃了!也许如果我们有足够多的人发送了这个,有人会修复它:)
  • 是的,它也给我造成了崩溃。 Excel 2010。
  • 顺便说一句,我刚刚从 MVP Connect Services 提交了上述错误。
  • 这个错误也存在于 Excel 2003 中。所以这似乎是 10 年来第一次有人试图从 Redim 语句中省略第一个维度。顺便说一句,您已将 v 声明为固定数组而不是动态数组。我不记得曾经尝试过,但我认为不可能重新调整固定数组。
  • 我的 2016 年也崩溃了

标签: vba excel


【解决方案1】:

崩溃的发生是由于第一个维度的遗漏,或者更好的措辞,nLastDimension - 1 的遗漏,以及在以下维度中使用 TO 关键字。

我拿了你的小样本并试图让它不会崩溃:P

Option Explicit 'Just wanted to make the Interpreter more picky

Private Sub test()
    'Go through some basic declaration
    Dim v() As Variant
    Dim M As Integer
    Dim New_Value As Integer

    ReDim v(2, 2) 'No Problem
    ReDim Preserve v(1, 1 To M) ' No Problem
    ReDim Preserve v(1 To M) ' No Problem
    ReDim Preserve v(,400) 'Compile Error

    'Crash on this
    'ReDim Preserve v(,1 To M) 'BOOM!!!
    'and this:
    'ReDim Preserve v(,1 To 2) 'BOOM!!!
    'and this:
   'ReDim Preserve v(1 to 5,,1 To 2) 'BOOM!!!


End Sub

底线,“BOOM”行之前的代码都不会缓冲下跌。我可以理解的编译器错误,但 VBA 没有编码来处理

ReDim myVar(,x TO y)

我使用的是 Office 2007。


为了开心,我还在以下地方尝试了这段代码:

  1. 访问 '97(崩溃)
  2. Visual Basic 5 IDE(崩溃)
  3. OpenOffice Calc 的基本环境。 (见下文)

它没有崩溃,我收到以下两个编译器错误: 首先这个:

然后这个:

【讨论】:

  • VBA 何时因您的错误而蓬勃发展?在 tpascale 的帖子中,他说:“......我浪费了重建工作簿的时间,直到我解决了这个错误。”在 Excel 2003 中,当我在错误行中键入时按下回车键或 (2) 在从先前正确的行中删除第一个维度后,当我使用向上、向下或鼠标移出线时,它会弹出 (1)。即使没有 tpascale 的帮助,如果不是第一次尝试,当我尝试重新输入我的更改时,我也会知道我做了什么导致 Excel 崩溃。 Excel 2007 和 2010 有何不同?
  • @TonyDallimore 对我来说,所有崩溃场景都发生在 1 和 2 上。我还尝试导入崩溃代码和 Office 在导入时崩溃。我不确定 tpascale 的情景是否会导致如此严重的工作损失。
  • 澄清......有时间损失,没有工作。我经常保存,以免因崩溃而失去工作,但在过去,臃肿的 wb 崩溃是常见的事情,教给我的补救措施是导出所有 IDE 模块并使用单元副本而不是工作表副本从头开始重新创建 wb。我不知道这种做法是否可以在 2010 年取消,但在几次崩溃之后,我尝试将其作为补救措施 - 浪费时间。
  • 感谢雷进一步挖掘......接受所有工作的答案。
猜你喜欢
  • 2016-09-16
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多