0

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

这是样本数据 在此处输入图像描述

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

Arrayname = Range("A1:D200")

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

谁能给我一个例子。提前谢谢你。

4

1 回答 1

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 复制到 Array。

如果有任何不清楚的地方,请带着问题回来。

于 2013-06-08T22:12:46.953 回答