在VBA中收集范围

时间:2017-06-16 08:32:26

标签: database excel vba split

我的问题如下:我有一个带有材料数据的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数据浏览listobject。为每个x范围和y范围定义U(pper)和L(ower)边界单元。如果X值下降,则这是下一个范围的x,因为x总是在x y数据中按升序排序。然后保存范围并将U(pper)边界和循环单元向下移动到下一个x和y范围。

X.item(1)

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

2 个答案:

答案 0 :(得分:0)

解决了它:collection.add存在问题 如果你打字,请适用:

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

X(1)将具有Type变体

如果您输入:

  X.Add xrng
  Y.Add yrng

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

答案 1 :(得分:0)

使用不带限定符的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中的开发人员文档。