【问题标题】:Create One-Dimensional array from evaluate从评估创建一维数组
【发布时间】:2019-10-22 22:21:13
【问题描述】:

背景:

我正在尝试从给定工作表名称的Array 中遍历工作簿中的一系列工作表。

代码

而不是更传统的:

Sub test()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Sheets(Array("Sheet1", "Sheet2", "Sheet3"))
    Debug.Print ws.Name
Next ws

End Sub

我使用了一种不同的方法,可以更轻松地将数组扩展到 10 个工作表,或者从另一个数字开始,如下所示:

Sub test()

Dim ws As Worksheet
Dim arr As Variant: arr = ["Sheet"&ROW(1:3)]

For Each ws In ThisWorkbook.Sheets(arr)
    Debug.Print ws.Name
Next ws

End Sub

问题:

但是["Sheet"&ROW(1:3)] 将创建一个二维数组,该数组将在For each... 循环的开头抛出一个Error 13,因为该数组需要一个一维数组。

我可以使用简单的TRANSPOSE 来解决这个问题,例如:

Sub test()

Dim ws As Worksheet
Dim arr As Variant: arr = [TRANSPOSE("Sheet"&ROW(1:3))]

For Each ws In ThisWorkbook.Sheets(arr)
    Debug.Print ws.Name
Next ws

End Sub

问题:

也许我的大脑很累,但现在我不明白为什么["Sheet"&ROW(1:3)] 不会创建一维数组。有人知道吗?

恐怕答案很简单,我会经历那种“啊哈”的时刻。

【问题讨论】:

  • ROW(1:3) 是范围,范围是值的二维数组。
  • 添加到 Scott 的评论中,Row(1:3) 类似于 Range(Cells(1,"A"),Cells(3,"XFD"))
  • @ScottCraner,这就像“ABC”一样简单,我现在觉得很愚蠢,真的有一个“Ahaaaa”时刻=)。愿意回答以下问题吗?
  • @JvdV 问题格式看起来不错……我发誓我在某处看到过,哈哈。我们都有这样的时刻!
  • @JvdV 开了个玩笑,因为它也符合我的所有问题,并且有一次我正在讨论 meta 为 SO 提供更标准化的格式以帮助确保有每个“背景”、“问题”、“问题”和“相关代码”都有一个空间,最终的答案是它可能看起来适合 SO,但不是 SE 中的所有站点,所以不会发生......每个每当我看到类似部分结构良好的帖子时,它只会让我微笑。

标签: arrays excel vba


【解决方案1】:

简而言之:

ROW(1:3) 是一个范围。包含多个单元格的范围是二维数组。这样你就得到了一个二维的回报。

【讨论】:

  • 我只想指出,你 99,999999% 是对的,我完全赞成。只想补充一点,如果范围只是 1 个单个单元格,那么它不是二维数组。更重要的是,您不能将值放入带有Dim MyArray As Variant MyArray = Range("A1").Value 之类的数组中。这不会创建一个数组,即使对象是一个范围,因为它是一个单元格。
  • @FoxfireAndBurnsAndBurns 根本没有,需要纠正。不想误导任何未来的访客。
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
相关资源
最近更新 更多