Arrays 在新模块中使用来自另一个模块的非公共阵列
下面是关于VBA静态数组的教程。我想确保我的思维过程对于我想做的简单事情是正确的 我有一段代码,可以提取所有12个月的数据,并将其放入字符串类型的静态数组中。作为实践,我想看看是否可以使用另一个模块将这些值复制到另一个位置,该模块在光标选择处充当“粘贴”月份的功能,但不使用公共数组。我是VBA新手,所以我对编码的想法可能有缺陷,为此,我应该使用公开定义的数组Arrays 在新模块中使用来自另一个模块的非公共阵列,arrays,excel,vba,module,Arrays,Excel,Vba,Module,下面是关于VBA静态数组的教程。我想确保我的思维过程对于我想做的简单事情是正确的 我有一段代码,可以提取所有12个月的数据,并将其放入字符串类型的静态数组中。作为实践,我想看看是否可以使用另一个模块将这些值复制到另一个位置,该模块在光标选择处充当“粘贴”月份的功能,但不使用公共数组。我是VBA新手,所以我对编码的想法可能有缺陷,为此,我应该使用公开定义的数组 Sub PopulateStaticArray() Dim months(11) As String Dim ndx As Integer
Sub PopulateStaticArray()
Dim months(11) As String
Dim ndx As Integer
Dim xrow As Long
ndx = 0
xrow = 2
Do Until Cells(xrow, 1).Value = ""
months(ndx) = Cells(xrow, 1).Value
ndx = ndx + 1
xrow = xrow + 1
Loop
End Sub
我想以多余的方式实现的目标。(我基本上是从头开始重新创建阵列)
我读了一些关于传递数组的帖子,但我不确定这是否达到了我想要的效果。当然,这不是实际的项目,只是为了提高我对VBA for Excel中模块之间交互的理解。我不需要任何代码,只需要关于我是否应该使用其他方法来完成此任务的一般概念性指导(即公共定义的数组或函数等),谢谢。@GSerg正确地提到了
您没有在PopulateStaticArray中创建静态数组。如果您想将现有数组传递给InsertMonthArray(),而不管它来自何处,则应该是Sub-InsertMonthArray(作为字符串的月份()) 您需要将在过程级别声明的数组作为(隐式)
ByRef
参数传递,这意味着您可以为被调用的子过程createMonths
中的每个数组项指定月份名称,以便调用过程可以实际使用它们,例如将它们写入垂直范围(例如,从单元格A7开始)
简单替代方案/Edit 2020-05-27
但是,如果您的目的是使月份数组在其他过程中可争议,而不需要在每个过程中声明(既不在全局范围内,也不在类定义内),您可以简单地从一个简单的解决方法中获益:插入一个属性Get
也可用于标准模块中-顺便说一句,不仅在类模块中可用-但请注意,您实际上并没有保留(“保留”)数组,您将重建它,并且可能会以更好的可读性方式
@格斯伯格说得对
您没有在PopulateStaticArray中创建静态数组。如果您想将现有数组传递给InsertMonthArray(),而不管它来自何处,则应该是Sub-InsertMonthArray(作为字符串的月份())
您需要将在过程级别声明的数组作为(隐式)ByRef
参数传递,这意味着您可以为被调用的子过程createMonths
中的每个数组项指定月份名称,以便调用过程可以实际使用它们,例如将它们写入垂直范围(例如,从单元格A7开始)
简单替代方案/Edit 2020-05-27
但是,如果您的目的是使月份数组在其他过程中可争议,而不需要在每个过程中声明(既不在全局范围内,也不在类定义内),您可以简单地从一个简单的解决方法中获益:插入一个属性Get
也可用于标准模块中-顺便说一句,不仅在类模块中可用-但请注意,您实际上并没有保留(“保留”)数组,您将重建它,并且可能会以更好的可读性方式
您没有在PopulateStaticArray
中创建静态数组。months
将在退出sub后立即销毁。如果要将已存在的数组传递给InsertMonthsArray()
,无论它来自何处,则应该是sub InsertMonthsArray(months()作为字符串)
。除了@GSerg的宝贵评论之外,还发布了一个修改后的解决方案。您没有在PopulateStaticArray
中创建静态数组。months
将在您退出sub后立即销毁。如果要将已存在的数组传递给InsertMonthsArray()
,不管它来自哪里,那么是的,那应该是子插入MonthArray(months()作为字符串)
。除了@GSerg的宝贵评论之外,还发布了一个修改后的解决方案。谢谢两位。我知道数组一旦使用分步功能点击“end Sub”就会死亡,但是有办法保留数组吗(即存储它)除了在全局级别声明它之外?这就是“createMonths”的目的吗?然后我是否需要创建第三个模块来执行在光标选择处模拟“粘贴”月份的操作?我将尝试传递月份功能并逐步执行。是否要“保存”“数组值?对延迟响应表示歉意。是的,我想保存数组值。但是,这可能是我尚未学习的功能。谢谢。我将勾选绿色标记。谢谢,两位。我知道数组一旦点击“结束子节点”就会死亡。”使用分步执行功能,但除了在全局级别声明数组外,是否有其他方法保留数组(即存储它)?是否是为了“创建月份”?然后我是否需要创建第三个模块来执行“粘贴”操作光标选择处的月份?我将处理月份传递功能和单步执行。是否要“保存”数组值?对延迟响应表示歉意。是的,我想保存数组值。但是,这可能是我尚未了解的功能。谢谢。我将勾选绿色标记。
Sub InsertMonthsArray()
Dim counter As Integer
Dim rowNum As Double
Dim colNum As Double
Dim months(11) As String
ActiveCell.Select
rowNum = ActiveCell.Row
colNum = ActiveCell.Column
months(0) = "January"
months(1) = "February"
months(2) = "March"
months(3) = "April"
months(4) = "May"
months(5) = "June"
months(6) = "July"
months(7) = "August"
months(8) = "September"
months(9) = "October"
months(10) = "November"
months(11) = "December"
For counter = 0 To UBound(months, 1)
Cells(rowNum, colNum).Value = months(counter)
rowNum = rowNum + 1
Next counter
End Sub
Option Explicit ' declaration head of code module
Sub PopulateMonthArray()
'[0] declare array at procedure level
Dim months(11) As String ' equals Dim months(0 to 11)
'Dim months(1 To 12) As String ' alternative: declare a 1-based array
'[1] fill array items with month names passing array as (implicit) ByRef argument
createMonths months ' << call sub createMonths
'[2] write 1-dim array vertically to sheet (transposing output from a "flat" to a 2-dim array)
Sheet1.Range("A7").Resize(Rowsize:=12).Value = Application.Transpose(months)
End Sub
Sub createMonths(months) ' equals Sub createMonths(ByRef months)
Dim countOffset As Long
countOffset = IIf(LBound(months), 0, 1) ' allow calculation of 0-based AND 1-based arrays
Dim i As Long
For i = LBound(months) To UBound(months) ' loop through each array element
months(i) = Application.Text(DateSerial(0, i + countOffset, 1), "mmmm")
Next i
End Sub
Public Property Get Months()
Dim tmp(1 To 12) ' I'd prefer a 1-based months array :-)
createMonths tmp ' use the same procedure as above (or rebuild it code)
Months = tmp ' return the Get value
End Property
Sub AnyOtherProcedure()
'no further declaration needed
Debug.Print Months(1) ' ~> January
Debug.Print Join(Months, ", ") ' ~> January, February, ..., December
End Sub