VBA 定义一个简单的静态公共数组
Posted
技术标签:
【中文标题】VBA 定义一个简单的静态公共数组【英文标题】:VBA Define a simple static public array 【发布时间】:2018-02-27 10:12:37 【问题描述】:我正在尝试完成这个明显简单的事情,但不知何故 VBA 一直在为我提供奇怪的错误。 我想要一个名为样式的全局数组,其中包含以下字符串:设置、标题、评论和直接复制。 在代码中:
Public styles(4) As String
直接分配数组对我不起作用,所以我通过 sub 做到了这一点:
sub Populate()
styles(0) = "Settings"
styles(1) = "Titles"
styles(2) = "Comment"
styles(3) = "Direct Copy"
Debug.Print styles
End Sub
但是这不起作用,因为它给出了编译错误: debug.print 行上的类型不匹配... 预期结果类似于: (“设置”、“标题”、..)等任何编程语言都会返回。
那么如何在 VBA Excel 中获取包含字符串的公共数组,以便我可以在同一个模块中跨函数和子程序使用它们?
【问题讨论】:
试试Debug.Print styles(0)...Debug.Print styles(1)....Debug.Print styles(2)....Debug.Print styles(3).....
这个答案对我不起作用,它看起来确实很优雅:***.com/questions/1654281/vba-public-array-how-to
【参考方案1】:
试试这种形式的公共声明和数组元素赋值。
Option Explicit
Public styles As Variant
Sub printStyles()
styles = Array("Settings", "Titles", "Comment", "Direct Copy")
Debug.Print LBound(styles) & "to" & UBound(styles)
Dim i As Long
For i = LBound(styles) To UBound(styles)
Debug.Print styles(i)
Next i
Debug.Print Join(styles, ", ")
End Sub
顺便说一句,如果您继续使用保留字作为公共和私有变量的名称,您可能难以使用保留的 Styles Object。
【讨论】:
像魅力一样工作!感谢您提供额外的解释性代码!【参考方案2】:这是如何打印数组(两次):
Public styles(4) As String
Sub Populate()
styles(0) = "Settings"
styles(1) = "Titles"
styles(2) = "Comment"
styles(3) = "Direct Copy"
'1. print is here ---v
Dim cnt As Long
For cnt = LBound(styles) To UBound(styles)
Debug.Print styles(cnt)
Next cnt
'--------------------^
'2. print is here ---v
Debug.Print Join(styles, vbCrLf)
'--------------------^
End Sub
这是你得到的(两次):
Settings
Titles
Comment
Direct Copy
第一次循环遍历元素并在新行上打印每个元素。 第二次返回通过连接数组中包含的多个子字符串创建的字符串。
Join MSDN Reference
【讨论】:
有没有办法像在 python 或 java 中那样声明一个公共数组:array = ("value1", "value2", etc..) 数组的最终目的是验证excel的样式,如果在数组中则需要写入txt文件 我不知道 OP 是否期望有第五个数组元素,但 styles(4) 为从零开始的数组留下 5 个元素。 @Brilsmurfffje - 它应该在一个过程中(在一个子或函数内)。 @Brilsmurfffje - 这是因为您在 sub 中没有Dim Styles As Variant
,但您在 sub 外部使用 Public styles(4) As String
。在外面写Public styles As Variant
或在里面写Dim Styles As Variant
。以上是关于VBA 定义一个简单的静态公共数组的主要内容,如果未能解决你的问题,请参考以下文章