【问题标题】:Getting an array of strings from cells in excel - VBA从excel中的单元格获取字符串数组 - VBA
【发布时间】:2020-03-21 01:31:51
【问题描述】:

我正在开发一个程序,该程序需要从同一工作簿的另一个工作表中的单元格中读取一组值。我能够读取一个值就好了,但是当我尝试读取多个时,我无法返回一个数组。

这是我想要做的:

    Dim list() As Variant
    list = ActiveWorkbook.Worksheets("Sheet2").Range("A2:C2").value
    Debug.Print TypeName(list)
    Debug.Print UBound(list)
    Debug.Print LBound(list)
    Debug.Print TypeName(list(UBound(list)))

输出是:

Variant()
 1 
 1 
Subscript out of range

但是,如果我在我期望一个字符串而不是字符串数组的地方尝试它

    Dim value As String
    Let value = ActiveWorkbook.Worksheets("Site IDs and CJONs").Range("A2").value
    Debug.Print TypeName(value)
    Debug.Print value

我得到了输出

String
Expected Value

根据this question,我应该能够简单地从 range 函数返回一个数组(示例来自下面的答案),但它似乎对我不起作用。我做错了什么?

    Dim DirArray As Variant
    DirArray = Range("a1:a5").Value

【问题讨论】:

  • 请注意,单个单元格是一种特殊情况,请参阅 cpearson.com/excel/ArraysAndRanges.aspx... 并且这些是二维数组。
  • List 如果有多个单元格,则为二维数组,因此您需要同时引用两者。例如debug.print list(1,1)
  • @RonRosenfeld 谢谢,为我修好了。
  • 这个答案展示了如何使用转置使其成为一维数组。如果您的范围是一行,则需要使用转置两次。 stackoverflow.com/questions/37689847/…

标签: excel vba


【解决方案1】:

虽然不是很明显,但是这个:

Dim DirArray As Variant
DirArray = Range("a1:a5").Value

其实是这样的:

Dim DirArray(1 To 5, 1 To 1) As Variant

DirArray(1, 1) = Range("A1").Value
DirArray(2, 1) = Range("A2").Value
DirArray(3, 1) = Range("A3").Value
DirArray(4, 1) = Range("A4").Value
DirArray(5, 1) = Range("A5").Value

将一组单元格拉入一个数组通常会形成一个二维数组。

注意:

如果你想从数组转到工作表单元格,那么例如:

Sub ytrewq()
    Dim DirArray(1 To 5, 1 To 1) As Variant

    DirArray(1, 1) = "Larry"
    DirArray(2, 1) = "Moe"
    DirArray(3, 1) = "Curly"
    DirArray(4, 1) = "Shepp"
    DirArray(5, 1) = "James"

    Range("B9").Resize(5, 1) = DirArray
End Sub

【讨论】:

    【解决方案2】:

    我不妨把我的评论作为答案:

    Option Explicit
    Sub test()    
    Dim list As Variant
        list = Application.Transpose(Application.Transpose(ActiveWorkbook.Worksheets("Sheet1").Range("A2:C2").Value))
        Debug.Print TypeName(list)
        Debug.Print UBound(list)
        Debug.Print LBound(list)
        'Debug.Print UBound(list, 2) Error
        'Debug.Print LBound(list, 2) Error
        Debug.Print TypeName(list(UBound(list)))
        Debug.Print list(UBound(list))
    End Sub
    

    给出输出:

    Variant()
     3 
     1 
    String
    x
    

    其中 C2 包含字母 x。

    【讨论】:

    • 谢谢!这帮助我把它变成了我预期的格式
    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多