【问题标题】:Inserting data in multidimensional array在多维数组中插入数据
【发布时间】:2019-04-09 16:15:03
【问题描述】:

我必须将输入文件中的数据移动到另一个工作簿。数据在工作表中结构化为硬编码输入,如下所示,其中包含所有标识符的列是名为“INPUT_MARKER”的命名范围。

    IQ_SALES    100     200     300
    IS_MARGIN    20      30      40
    IQ_EBITDA    50      30      20

我只需要移动一些数据。因此,例如在上面我只需要移动 IQ_SALES 数据和 IQ_EBITDA 数据。所以我需要了解如何创建一个仅包含所需数据的数组。

下面的代码将 INPUT_MARKER 列中的数据与名为“identifierArray”的数组中的元素进行比较,然后我打算将所有行数据插入名为“bigDataArray”的多维数组中。我尝试了几种方法,但无法完成这项工作。非常感谢任何帮助。我在下面省略了一些冗余代码,因此只包含与此问题相关的代码。

    Sub Update()

    Dim identifierArray(), bigDataArray() As Variant

    Application.ScreenUpdating = False
    Application.CutCopyMode = False

    'Definition of the array of data that is to be transferred to the targetModel
    identifierArray = Array("IQ_SALES", "IQ_EBITDA")
    ReDim bigDataArray(1 To UBound(identifiersArray))

    With Workbooks(sourceModel).Sheets("DATA")
        For Each c In .Range("INPUT_MARKER")
            For Each element In identifierArray
                If element = c.Value Then
                    'To construct bigDataArray by inserting row data every time element equals c.Value

                End If
            Next element
        Next c
    End With

    End Sub

【问题讨论】:

  • 您的INPUT_MARKER 范围是否以列A 开头?

标签: excel vba


【解决方案1】:

我最近处理了一个类似的问题。从事物的外观来看,这可以通过多维数组来处理

虽然作为一种倾向,我建议您查看dynamic multi-dimensional arrays上的参考资料

Private Sub fill_array()

    Dim arr() As String
    Dim i As Integer: i = 0
    Dim cell As Range
    Dim ws As Worksheet: Set ws = Sheets("DATA")

    For Each cell In ws.Range("INPUT_MARKER")
        If ws.Cells(cell.Row, 1) = "IQ_SALES" Or ws.Cells(cell.Row, 1) = "IQ_EBITDA" Then
            ReDim Preserve arr(0 To 2, i)
            arr(0, i) = ws.Cells(cell.Row, 2)
            arr(1, i) = ws.Cells(cell.Row, 3)
            arr(2, i) = ws.Cells(cell.Row, 4)
            i = i + 1
        End If
    Next cell
End Sub

所以你的数组将具有arr(x, y) 的结构,其中:

  • x - [0;2] - 将是您要存储的 3 列数据
  • y - n - 数组的索引 (仅添加了 IQ_SALES 和 IQ_EBITDA)

编辑:

这当然是假设,您的数据“INPUT_MARKER”开始于 专栏A

另外作为一个额外提示,如果您还想存储数组源的信息 - 类似于主键,您可以增加第一个维度

ReDim Preserve arr(0 to 3, i)
arr(3, i) = cell.Row              ' edited (instead of arr(3)= …)

并使用示例cell.Row 作为从何处获取数据的参考,以便反向跟踪数据

【讨论】:

  • 更正了 EDIT 中的分配从 arr(3) = … 到 arr(3, i) = cell.Row :-)
  • @T.M.接得好!谢谢你:)
【解决方案2】:

如果您知道要选择的值的范围,可以使用以下快捷方式:

Dim bigDataArray() As Variant
bigDataArray = Range(A1:D4)

这将设置与您选择的范围相同大小的数组, 然后你可以从数组中输出你想要的具体值。

【讨论】:

  • 这将包括他不想包括的行,并且难以遍历。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2016-03-05
  • 2014-11-24
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多