Excel VBA将数据附加到单个阵列

时间:2013-06-07 15:26:14

标签: excel-vba vba excel

尝试使用Excel VBA解析excel文件。

以下是样本sata enter image description here

我做了一些研究,发现你可以将范围分配给数组,如

Arrayname = Range("A1:D200")

但我正在寻找一些更具动态性的东西,比如将下面的多个范围添加到单个数组中。 我的最后一个数组将是一个数组/表,其中n是所有范围和4列的行数。

任何人都可以给我一个例子。 谢谢你。

1 个答案:

答案 0 :(得分:1)

我认为您要求提供有关在范围和变量之间移动数据的更多信息,这是我将尝试回答的问题。

创建新工作簿。将Sheet1留空;将Sheet2的单元格B3设置为“abc”并将Sheet3的单元格C4到F6设置为=“R”& ROW()&“C”& COLUMN()

打开VB编辑器,创建一个模块并将以下代码复制到该模块。运行宏Demo01()

Option Explicit
Sub Demo01()

  Dim ColURV As Long
  Dim InxWkSht As Long
  Dim RowURV As Long
  Dim UsedRangeValue As Variant

  ' For each worksheet in the workbook
  For InxWkSht = 1 To Worksheets.Count
    With Worksheets(InxWkSht)
      Debug.Print .Name
      If .UsedRange Is Nothing Then
        Debug.Print "  Empty sheet"
      Else
        Debug.Print "  Row range: " & .UsedRange.Row & " to " & _
                            .UsedRange.Row + .UsedRange.Rows.Count - 1
        Debug.Print "  Col range: " & .UsedRange.Column & " to " & _
                            .UsedRange.Column + .UsedRange.Columns.Count - 1
      End If
      UsedRangeValue = .UsedRange.Value
      If IsEmpty(UsedRangeValue) Then
        Debug.Print "  Empty sheet"
      ElseIf VarType(UsedRangeValue) > vbArray Then
        ' More than one cell used
        Debug.Print "  Values:"
        For RowURV = 1 To UBound(UsedRangeValue, 1)
          Debug.Print "  ";
          For ColURV = 1 To UBound(UsedRangeValue, 2)
            Debug.Print "  " & UsedRangeValue(RowURV, ColURV);
          Next
          Debug.Print
        Next
      Else
        ' Must be single cell worksheet
        Debug.Print "  Value = " & UsedRangeValue
      End If

    End With
  Next

End Sub

以下内容将出现在立即窗口中:

Sheet1
  Row range: 1 to 1
  Col range: 1 to 1
  Empty sheet
Sheet2
  Row range: 3 to 3
  Col range: 2 to 2
  Value = abc
Sheet3
  Row range: 4 to 6
  Col range: 3 to 5
  Values:
    R4C3  R4C4  R4C5
    R5C3  R5C4  R5C5
    R6C3  R6C4  R6C5

如果您完成宏并研究输出,您将获得将范围加载到变体的介绍。我特别希望你注意的几点是:

  • 加载范围的变量是Variant类型。我从未尝试将单个范围加载到Variant数组,因为结果可能不是数组。即使它有效,我也会发现这令人困惑。
  • Sheet1为空,但使用的范围告诉您使用的是单元格A1。但是,我加载工作表的变体是空的。
  • 如果范围包含多个单元格,则变量仅变为数组。注意:即使范围是单行或单列,数组也总是二维的。
  • 阵列的下限始终为1。
  • 列和行维度不是标准的,行为维度1,列为维度2.
  • 如果对加载范围的性质有任何疑问,您必须使用IsEmpty和VarType来测试其性质。

您可能还想看看:https://stackoverflow.com/a/16607070/973283。略过与您无关但设置上下文的宏Demo01()Demo02()的解释。宏Demo03()显示了将多个工作表加载到锯齿状数组的高级技术。

现在创建一个新的工作表,并保留默认名称Sheet4

将以下代码添加到模块中。运行宏Demo02()

Sub Demo02()

  Dim ColOut As Long
  Dim OutputValue() As String
  Dim Rng As Range
  Dim RowOut As Long
  Dim Stg As String

  ReDim OutputValue(5 To 10, 3 To 6)

  For RowOut = LBound(OutputValue, 1) To UBound(OutputValue, 1)
    For ColOut = LBound(OutputValue, 2) To UBound(OutputValue, 2)
      OutputValue(RowOut, ColOut) = RowOut + ColOut
    Next
  Next

  With Worksheets("Sheet4")
    Set Rng = .Range("A1:D6")
  End With
  Rng.Value = OutputValue

  With Worksheets("Sheet4")
    Set Rng = .Range(.Cells(8, 2), .Cells(12, 4))
  End With
  Rng.Value = OutputValue

  With Worksheets("Sheet4")
    Stg = "C" & 14 & ":G" & 20
    Set Rng = .Range(Stg)
  End With
  Rng.Value = OutputValue

End Sub

虽然此宏将数组写入工作表,但许多点适用于相反的方向。我特别希望你注意的几点是:

  • 对于输出,数组不必是Variant,下限也不必是1.我使OutputValue成为String数组,因此输出的值是字符串。将OutputValue更改为Variant数组并重新运行宏以查看效果。
  • 我使用了三种不同的创建范围的方式来演示您的一些选择。
  • 如果您指定范围,则工作表是范围的属性之一。这就是为什么我可以在Rng.Value = OutputValue之外取With ... End With并仍将数据写入正确的工作表。
  • 从范围复制到变体时,Excel会根据需要设置变体的尺寸。从阵列复制到范围时,您有责任确定范围的大小。在第二个范围内,我丢失了数据。在第三个范围内,我获得了N / As。

我希望上面的内容能让您了解自己的选择。如果我理解您的要求,您将不得不:

  • 将整个工作表加载到Variant
  • 创建适当大小的新数组
  • 有选择地将数据从Variant复制到数组。

如果有什么不清楚,请回答问题。