我的问题如下:我有一个带有材料数据的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)
不返回类型范围,而是返回变体。如何使其成为范围对象。或者换句话说,有没有办法将范围对象保存在没有预先定义长度的其他对象中(排除数组)?
答案 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中的开发人员文档。