【问题标题】:How to copy selected range into given array?如何将选定范围复制到给定数组中?
【发布时间】:2013-08-01 17:23:20
【问题描述】:

我有一个包含 145 个类别的重复列表,每个类别有 15 列数据。 我通过将类别数量减少到 24 个并添加相应数据来合并此列表。

例如, 如果最初我有类别 A B C D E F G 并合并,我会将 A 中的所有值相加,例如 F,以获得一个新类别。

另一个问题是所有这 145 个类别在 60 个时间段内重复出现。所以我必须分别合并每个时间段的数据。

为此,我正在尝试使用数组。

Sub CategoriesToSectors()
Dim k As Integer
Dim j As Integer
Dim p As Integer
Dim Destination As Range
' p is just a filler/dummy variable until I later decide which categories go into which    sector 


Dim CategoryData(144, 14) As Long
Dim SectorData(23, 14) As Long

k = 0
' k should go Upto 60
' I first copy the data from a range in the first worksheet into the array CategoryData 
' Then I move 145 rows down for the next time-period's data and repeat this whole process
While k < 60
Sheets("ReformattedData").Select
Range("B1:P145").Select
ActiveCell.CurrentRegion.Offset(k * 145, 0).Select
CategoryData = Selection.Value

For j = 0 To 14
SectorData(0, j) = CategoryData(1, j) + CategoryData(6, j) + CategoryData(8, j) +           CategoryData(13, j)
For p = 1 To 23
SectorData(p, j) = CategoryData(15, j) + CategoryData(19, j) + CategoryData(31, j) +    CategoryData(44, j)
Next p
Next j
' paste consolidated sectordata array one below another in SectorData worksheet
Sheets("SectorData").Select
 Range("B2").Select
Set Destination = ActiveCell.Offset(k * 25, 0)
Destination.Resize(UBound(SectorData, 1), UBound(SectorData, 2)).Value = SectorData


Wend 


End Sub

如您所见,我首先尝试将第一个范围块复制到 CategoryData 数组中。然后,我将数据组合到扇区数组中——我刚刚使用重复值来测试它——不应该存在带有 p 的 for 循环。我最终将使用 24 种不同的语句来创建 SectorData 数组。

然后我将合并后的数据粘贴到另一张纸上。我回到第一张纸,将我的选择向下移动到下一个范围块(第一个单元格下方 145 个单元格),然后选择此数据并重复。

这似乎不起作用 - 将数据输入第一个数组时出错 - CategoryData。

我们将不胜感激。

谢谢

【问题讨论】:

  • 错误出现在哪一行,错误信息是什么?
  • 此处出现错误:CategoryData = Selection.Value 类似于无法分配数组的内容。

标签: arrays excel vba


【解决方案1】:

试试这个:

Sub RangeToArray()
    Dim NewArray As Variant
    Dim SourceRange As Range
    Set SourceRange = Selection.CurrentRegion
    NewArray = SourceRange.Value
    Stop    'to check the result in Immediate Window
End Sub

【讨论】:

    【解决方案2】:

    为了将 Range 复制到 VBA 数组中,您必须使用 Variant:

    Dim CategoryData() As Variant
    'or just CategoryData As Variant (no brackets)
    'then the following will work
    CategoryData = Selection.Value
    

    传输数据后,您可以检查 UBound 的 CategoryData。

    这里有一个有用的讨论at cpearson

    只要维度相同,您就可以将 Range 设置为数组(在您的示例中为 SectorData)而不是 Variant。

    【讨论】:

    • 两件事:首先,我尝试使用变体,但仍然遇到相同的错误。其次,我的数组大小与数据集完全匹配。虽然我可以使用 for 循环为数组赋值,但这花费的时间太长,而且将整个范围复制到数组中会容易得多。
    • 创建一个单独的小程序进行测试。尝试单步执行您的代码。按 F9 设置断点。这很可能是因为此分配只能执行一次,并且您将其置于循环中。 IMO 您必须将其拆分为两个程序,第二个程序每次都能够重新定义(重新声明)CategoryData。
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2022-01-08
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多