如何使用VBA迭代Excel工作表行并将行放入数据结构?

时间:2017-12-30 18:16:01

标签: excel vba excel-vba office365

我是 Excel VBA 的新手,我遇到以下问题。

我正在处理一个定义在这样的Excel工作表中的宏:

https://drive.google.com/file/d/1R29ofaOfSlzqkcjFsAmWvry-knfv8zOn/view

正如您可以在此表中看到的那样,有一个名为 OUT MOVEMENT 的部分,由 H 列中的某些行组成, L 专栏。

我实现了这个宏,迭代并显示 K 列中的值,从 K3 单元格开始,直到最后一个单元格为值。

Sub ActualValue()
    Dim outQuantityRange As Range
    Set outQuantityRange = Range("K3", Range("K3").End(xlDown))

    For Each currentOutQuantity In outQuantityRange.Cells
    MsgBox (currentOutQuantity)
    Next
End Sub

它工作正常,但我问是否可以使用VBA做一些更复杂的事情,如下面的行为:

将从 H 列开始到 L 列的所有行的内容放入数据结构中(整个** OUT MOVEMENT *部分的所有行)我的Excel表格。)

因此,这个数据结构(可以是一个列表或类似于将数据字段( H 列)作为键的哈希映射)必须包含一些“对象“,第一个将包含这样的东西:

(16/12/2017, -198,96 €, ETH, -0,3353050000, null)

第二个是这样的:

(21/12/2017, -93,98 €, ETH, -0,1400000000, null)

是否可以在VBA Excel宏中执行此类操作?

2 个答案:

答案 0 :(得分:0)

我认为你所追求的是这样的:

Sub Concatenate_Data()
    Dim LastRow as Integer, X as Integer, Y as Integer
    LastRow = Range("K3").end(xldown).Row

    Dim Data() As String
    ReDim Data(1 to (LastRow - 2)) As String

    For X = 3 to LastRow
        Data(X - 2) = "(" & Range("H" & X).Value
        For Y = 9 to 12
            If Cells(X, Y) <> "" Then
                    Data(X - 2) = Data(X - 2) & ", " & Cells(X, Y)
                Else
                    Data(X - 2) = Data(X - 2) & ", null"
            End If
        Next Y
        Data(X - 2) = Data(X - 2) & ")"
        MsgBox Data(X - 2)
    Next X
End Sub

答案 1 :(得分:0)

您可以定义记录结构并制作它们的数组。例如。把它放在你的代码之外:

Type tst
   dat as Date
   cur as Currency
   s1 As String
   dbl As Double
   s2 As String
End Type

然后以这种方式使用它:

Dim buffer() As tst
 <...>
ReDim buffer(1 To 100)
 <...>
buffer(1).dat = Cells(3, "H")
buffer(1).cur = Cells(3, "I")
etc.

请注意,在此解决方案中,您需要处理数据类型,因为如果Cells(3,“H”)不是日期类型,宏将会出错。如果可能发生,请使用CDate功能(和CCur,CDbl等,请参阅此处:Conversional functions)或在方便时查看内容。 如果您不关心单元格的内容,那么利用Variant类型可能更方便,但是您不需要使用Type定义,您可以简单地使用2个暗淡的数组,如Dim buffer (1 to 100, 1 to 5) as Variant,例如:

    ReDim buffer(1 To 72,1 To 5)
    <...>
    buffer(1,1) = Cells(3, "H")
    buffer(1,2) = Cells(3, "I")
    etc.