【问题标题】:Can we Assign an ArrayList like an normal 1D array to the Excel range?我们可以将像普通一维数组一样的 ArrayList 分配给 Excel 范围吗?
【发布时间】:2012-12-23 08:09:27
【问题描述】:

考虑下面的 ArrayList:

   Dim myAL As New ArrayList()
    myAL.Add("The")
    myAL.Add("quick")
    myAL.Add("brown")
    myAL.Add("fox")
    myAL.Add("jumped")
    myAL.Add("over")
    myAL.Add("the")
    myAL.Add("lazy")
    myAL.Add("dog")

那么现在我们可以将它的值水平设置为 Excel 范围吗?还是在此之前我们需要执行任何转换?

代码

Option Explicit

    Dim myQueue,i
    Set myQueue = CreateObject("System.Collections.ArrayList")
    'Dim Set Dic = CreateObject("Scripting.Dictionary

    myQueue.Add("jumped")
    myQueue.Add("over")
    myQueue.Add("")
    myQueue.Add("")
    myQueue.Add("dog")
    myQueue.Add("Cat")

    i=0
    Do While myQueue.Count > i

      MsgBox(myQueue(i))
    i=i+1
    Loop

    MsgBox("Capacity=" & myQueue.Capacity & "Count:" & myQueue.Count)

    myQueue.Remove("dog")

    MsgBox("Capacity=" & myQueue.Capacity & "Count:" & myQueue.Count)

    i=0
    Do While myQueue.Count > i

      MsgBox(myQueue(i))
    i=i+1
    Loop

当我们执行任何删除操作时,ArrayList 的大小会像字典对象一样自动调整,还是我们需要使用任何(Re)Dim 语句来处理大小?

谢谢,

【问题讨论】:

    标签: excel vbscript wsh vba


    【解决方案1】:

    首先你需要将 ArrayList 设置为一个数组:

    listArray = myAl.ToArray()
    

    然后水平粘贴:

    Range("A1").Resize(, UBound(listArray, 1) + 1) = listArray
    

    垂直粘贴:

    Range("A1").Resize(UBound(listArray, 1) + 1) = Application.Transpose(listArray)
    

    当您使用 Remove / RemoveRange 删除项目时,您可以调用 .Count 属性来获取数组的更新大小。 arraylist 上没有 Ubound/LBound。

    【讨论】:

    • 你能看看我描述的最后一部分吗?
    • 所以删除后,它会是一个连续的数组,如字典键或删除的单元格将保留为空白吗?
    • 它将是连续的。如果您删除一个元素,所有其他元素都会在适当的情况下重新定位。
    • 那么它的大小将向右减小,如果我们删除并添加,则数组的大小将自动增加。对吗?
    • 语句 `myAL.Add("")` 也是有效的语句吗?或者这样的元素将被删除?当我有意添加"" 以满足任何目的时,Arraylist 对象将如何处理这种情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多