【问题标题】:Collection of Ranges in VBAVBA 中的范围集合
【发布时间】:2017-11-18 22:51:10
【问题描述】:

我的问题如下:我有一个用于 Oracle 数据库的 Excel 前端,其中包含材料数据。我有一个 SQL 查询,它显示了数据库中的 x-y 数据。例如,这可能是一条应力-应变曲线。

我想将此数据显示为单独的曲线。由于所有测试的 x 和 y 数据现在分为两列,一列用于 x,另一列用于 y,我需要将它们拆分。我不想为此打开一个新的工作表,所以我决定制作两个范围集合。一个集合将包含所有 x 范围,一个集合将包含所有 y 范围。

所以不同的曲线在彼此下方。我有一个代码可以拆分它们并生成范围。我 95% 确定拆分代码有效,但问题是现在无法从我那里访问集合中的项目。这里是代码,这样您就可以自己了解正在发生的事情

    Sub Split()
Dim X As New Collection, Y As New Collection
Dim tbl As ListObject
Dim cell As Range, rng As Range, xrng As Range, yrng As Range
Dim U As Range, L As Range ' upper and lower boundary of each x and y range
Dim i As Integer

Set tbl = Data.ListObjects(1)

Set cell = tbl.ListColumns(35).DataBodyRange(1, 1)

Do While Not (IsEmpty(cell))
      Set U = cell
      Set L = cell
      Do While (L.Value < L.Offset(1, 0).Value) And (Not (IsEmpty(L.Offset(1, 0))))
            Set L = L.Offset(1, 0)
      Loop
      Set xrng = Range(U, L)
      Set yrng = Range(U.Offset(0, 1), L.Offset(0, 1))
      X.Add (xrng)
      Y.Add (yrng)

      ' move one down
      Set U = L.Offset(1, 0)
      Set cell = U
Loop



Debug.Print xrng.Select ' returns TRUE
Debug.Print X.Item(X.Count).Select ' Error Object needed

End Sub

代码的简短描述是:遍历带有 x 和 y 数据的列表对象。为每个 x 范围和 y 范围定义一个 U(pper) 和 L(ower) 边界单元。如果 X 值下降,这是下一个范围的 x,因为 x 在 x y 数据中始终是升序排列的。然后保存范围并将 U(pper) 边界和循环单元向下移动到 x 和 y 的下一个范围。

X.item(1)

不返回类型范围,而是返回变体。我怎样才能使它成为一个范围对象。或者换句话说,有没有办法将范围对象保存在没有预定义长度的其他对象中(排除数组)?

【问题讨论】:

    标签: database excel vba split


    【解决方案1】:

    已解决:collection.add 存在问题 如果您键入:

      X.Add (xrng)
      Y.Add (yrng)
    

    X(1) 将具有类型变体

    如果你输入:

      X.Add xrng
      Y.Add yrng
    

    类型将是范围。不知道为什么..

    【讨论】:

      【解决方案2】:

      使用不带限定符的 Range 属性会从活动工作表中返回 Range 对象,如果活动对象不是工作表,则返回 Range 对象的方法将失败。

      您可以先激活工作表,如下所示:

      Worksheets(1).Activate ' Where the desired worksheet is sheet 1.
      Set xrng = Range(U, L)
      Set yrng = Range(U.Offset(0, 1), L.Offset(0, 1))
      

      或者,您可以在使用 Range 属性之前声明对象限定符:

      Dim ws As Worksheet
      Set ws = Worksheets(1) ' Where the desired worksheet is sheet 1.
      Set xrng = ws.Range(U, L)
      Set yrng = ws.Range(U.Offset(0, 1), L.Offset(0, 1))
      

      考虑阅读this link 中的开发者文档。

      【讨论】:

      • 虽然这是真的,但这不是这里的问题。我确保该范围指的是正确的工作表。问题是,如果你使用括号,范围将被评估,它确实返回我认为的变体类型。如果括号被忽略,集合将添加一个范围类型。我的答案如下,它的工作原理是这样的。
      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多