使用VBA自动填充数组

问题描述 投票:0回答:2

我需要创建给定开始/结束编号的迷你数组,然后将它们合并到一个数组中。

示例:

  • 数组1:开始:2 结束:6
  • 数组2:开始:12 结束:15
  • 数组3:开始:20 结束:23
  • 最终阵列:
    2,3,4,5,6,12,13,14,15,20,21,22,23

起始数字和结束数字是用户从表单输入的。

如何自动填充数组?

ws.Range("A1") = start_num
'stop at last number
ws.Range("A1").Select
Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
  Step:=1, Stop:=last_num, Trend:=False

此自动填充 A 列中的一个起始结束数字,但我宁愿将数据存储在数组中,并且只在电子表格上显示最终数组。

arrays excel vba autofill
2个回答
2
投票

要使用一组不同的范围动态填充数组,我将使用 sub 和 ArrayList。要获取数组列表,您需要添加对 mscorlib 的引用,或者使用创建对象,例如创建对象(“数组列表”)

在模块级别

Public myAL as ArrayList

' or Public myAL as Object

Public sub Fill(byval ipStart as long, byval ipEnd as Long)
    If myAL is nothing then
      set myAL = new ArrayList
      ' or Set myAL = CreateObject("Arraylist")
    end if

    Dim myIndex as long
    for myIndex = ipStart to ipEnd
        myAL.add myIndex
    next
end sub

然后您可以按如下方式使用它

Fill 2,6
Fill 12,15
Fill 20, 23

Dim myArray as variant
myArray = myAL.ToArray

请注意,ArrayList 对象不提供任何智能感知。


1
投票

另一种仅在 VBA 中的解决方案是通过某种构建器类。

Dim al As ArrayList
Set al = New ArrayList

'array
Dim arr As Variant
arr = al.Join(2, 6).Join(12, 15).Join(20, 23).ToArray()

'string
Dim s As String
s = al.Join(2, 6).Join(12, 15).Join(20, 23).ToString()

'or simply once filled
s = al.ToString()

Debug.Print s
'2,3,4,5,6,12,13,14,15,20,21,22,23

ArrayList
班级:

Option Explicit
Private m_collection As Collection

Public Function Join(ByVal lower As Long, ByVal upper As Long) As ArrayList
    
    Dim i As Long
    For i = lower To upper
        m_collection.Add i
    Next
    
    Set Join = Me
End Function

Public Function ToArray() As Variant
    
    Dim arr() As Variant
    ReDim arr(m_collection.Count - 1)
    
    'Collection index statrts at 1.
    Dim i As Long
    For i = 1 To m_collection.Count
        arr(i - 1) = m_collection(i)
    Next
    
    ToArray = arr
End Function

Public Function ToString(Optional ByVal delimiter As String = ",") As String
    ToString = VBA.Join(ToArray(), delimiter)
End Function

Private Sub Class_Initialize()
    Set m_collection = New Collection
End Sub

Private Sub Class_Terminate()
    Set m_collection = Nothing
End Sub

您可以将

VB_PredeclaredId
设置为 true 以拥有单个实例,但您需要在每次填充后清除集合以避免重复。

© www.soinside.com 2019 - 2024. All rights reserved.