【问题标题】:Array already dimensioned - Class module阵列已确定尺寸 - 类模块
【发布时间】:2014-07-17 20:44:43
【问题描述】:

出于某些技术原因,我们不能在 word 中使用样式。为了加速反复应用全局属性,我创建了一个可以从简单的 xml 样式表中读取的类。工作表包含不同的“段落”。每个段落只存储我们最常用的段落属性。

我已经习惯了可以使用动态内存的 C++,并且我正在尝试复制动态分配数组的行为。但是,当我尝试重新调暗时,我收到错误消息“Array arleady dimensioned”。

我对 MSDN 的研究表明,为了 ReDim,数组必须是全局的或在“一般声明上下文”中,这让我认为在一个类中可能根本不可能做到这一点。

摘自 MSDN:

"您只能在过程级别使用 ReDim。因此,声明 变量的上下文必须是一个过程;它不能是来源 文件、命名空间、接口、类、结构、模块或 块。”

我已尝试在堆栈溢出中搜索“Word VBA 数组已标注尺寸”,但无济于事地浏览了所有 3 页结果。

private type pStyle 'Definition removed because it's not needed
private Paragraphs(0) As pStyle 'Initially an empty array of paragraphs

后来我有以下功能

Public Function AddEmpty()

'Create space
count = count + 1
ReDim Preserve Paragraphs(count)
AddEmpty = count
End Function

如果有任何想法,请告诉我。我宁愿不必“估计”每个样式表所需的段落样式数量,因为每个文件都不同。

【问题讨论】:

  • 通常,至少在 VBA 中,如果您不知道编译时元素的数量,您可以使用 CollectionDictionaryCustomCollection
  • 我对 VB 数据结构不是很熟悉。在 C++ 中有几种不同的可动态调整大小的数据结构。在这种情况下,链表将是完美的。我不认为有任何真正相似的东西,但快速浏览一下收藏告诉我这可能是一个不错的选择。感谢您的信息。

标签: arrays vba ms-word


【解决方案1】:
Private Paragraphs(0) As ...

这不是一个空数组,而是一个带有 1 个元素的 固定长度 数组。

对于 动态数组 - 您稍后会重新调整 - 只需将其声明为:

Private Paragraphs() As ...

【讨论】:

  • 消除了错误。当然就是这么简单:) 谢谢!计时器到时我会接受答案。
  • (另外值得注意的是,在redimd 之前尝试访问此类型的数组将导致错误)
  • 我在创建数组后立即调用 ReDim 来避免这种情况。
【解决方案2】:
Dim numbers(10) As Integer
MsgBox (UBound(numbers))
ReDim numbers(4)
MsgBox (UBound(numbers))

上面的代码会抛出array-already-dimensioned。
我们可以这样做

ReDim numbers(10) As Integer
MsgBox (UBound(numbers))
ReDim numbers(4)
MsgBox (UBound(numbers))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多