【问题标题】:How to pass a 2D array to a procedure, and modify it inside the function? VBA如何将二维数组传递给过程,并在函数内部对其进行修改? VBA
【发布时间】:2018-12-15 22:08:49
【问题描述】:

使用 VBA 创建 Word 宏遇到以下问题:

我正在尝试使用函数填充二维数组。问题是当我尝试将二维数组传递给函数时,出现以下错误:

类型不匹配的数组或预期的用户定义类型

我的宏:

Sub Tests()
'
' Tests Macro
'
Dim paragraphs(21, 1) As String
populate_paragraph (paragraphs)
End Sub

调用过程:

Sub populate_paragraph(replacers() As String)

ReDim replacers(21, 1) As String

replacers(0, 0) = "%HEADER%"
replacers(1, 0) = "%DESIGN_BRIEF_PARAGRAPH%"
...
replacers(21, 0) = "%DISCLAIMER_PARAGRAPH%"

replacers(0, 1) = create_header
replacers(1, 1) = create_design_brief_paragraph
...
replacers(21, 1) = create_disclaimer_paragraph

End Sub

如果我没有将二维数组传递给过程,而是尝试使用函数的返回值对其进行初始化,则会收到以下错误:

无法分配给数组

本例代码为:

Sub Tests()
'
' Tests Macro
'
Dim paragraphs(21, 1) As String
paragraphs = populate_paragraph
End Sub

调用函数:

Function populate_paragraph() As String

Dim replacers(21, 1) As String

replacers(0, 0) = "%HEADER%"
replacers(1, 0) = "%DESIGN_BRIEF_PARAGRAPH%"
...
replacers(21, 0) = "%DISCLAIMER_PARAGRAPH%"

replacers(0, 1) = create_header
replacers(1, 1) = create_design_brief_paragraph
...
replacers(21, 1) = create_disclaimer_paragraph

populate_paragraph = replacers

End Function

感谢您阅读我的问题并提供帮助

【问题讨论】:

  • 您修改了问题内容 - 请更改标题以匹配新问题
  • 你可以使用paraarray或者检查重复的问题stackoverflow.com/questions/34134936/…
  • @dbmitch 这不是重复的,至少不完全是,因为对于这个 OP 试图做的事情来说,答案并不是最优的(作为数据类型字符串的数组传递)。
  • 但是,@dbmitch,原始问题在调用和被调用过程中都指定了一个字符串。并且不调用函数。当然,它可以以不同的方式完成,但如果你想要一个特定的数据类型......

标签: arrays vba ms-word


【解决方案1】:

这很棘手......

您必须传递数组ByRef,因为您正在调用的过程中对其进行更改,而这不是函数,因此您可以将其传回。在这个特定的例子中,VBA 坚持传递值ByRef。

与此相关的是您将要传递的参数放在括号中:(paragraphs())。由于参数被传递给“方法”而不是函数,因此您不应使用括号。如果你这样做了,你就是在告诉 VBA 你想传递参数ByVal。

以下作品:

Sub Tests()
  Dim paragraphs(21, 1) As String

  populate_paragraph paragraphs()
End Sub

Sub populate_paragraph(ByRef replacers() As String)

  ReDim replacers(21, 1) As String
 'etc.

End Sub

【讨论】:

  • @TinMan 是的,我测试过了。使用括号,我收到一条错误消息,告诉我必须传递参数 ByRef,即使 ByRef 显式在过程的方法签名中也是如此。括号试图强制传递数组 ByVal。没有括号,没有错误信息。
  • 对不起,我赶时间,误读了你的帖子。我以为你在谈论这个populate_paragraph paragraphs) ()。你的帖子很清楚你的意思是populate_paragraph (paragraphs)。真正让我感到困惑的是,我用括号声明了我的数组变量,它将错误更改为Type Mismatch: array or user defined type expected 很好解释。 +1
  • @TinMan 没问题 :-) 经常发生在我身上!感谢您解释让您感到困惑的地方 - 我已经编辑并希望更改后更清晰!有多种方法可以传递数组 - 例如作为 Variant。
  • 知道括号已经帮助我防止其他问题。很抱歉之前没有将问题标记为已解决,刚刚我有一些空闲时间,没想到答案这么快。非常感谢您的帮助
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多