2017-06-16 18 views
1

私の問題は、次のとおりです。私は、Oracleデータベースの中に物質データを持つExcelフロントエンドを持っています。私はデータベースにx-yデータを表示するSQLクエリを持っています。例えば、これは応力 - 歪み曲線である可能性がある。VBAの範囲のコレクション

このデータを個別のカーブとして表示したいとします。すべてのテストのxとyのデータはxとyの2つの列になっているので、それらを分割する必要があります。私はこのために新しいワークシートを開きたくないので、私は2つの範囲のコレクションを作ることにしました。 1つのコレクションはすべてのx範囲を保持し、1つはすべてのy範囲を保持します。

したがって、異なる曲線は互いに下にあります。私はそれらを分割して範囲を作るコードを持っています。私は95%のコードを分割していることを確認していますが、問題はコレクションのアイテムが現在私からintendetとしてアクセスできないということです。あなた自身

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 yのデータで常に昇順になっているため、これは次の範囲からのxです。その後、範囲を保存し、U(pper)境界線とループセルをxとyの次の範囲に移動します。

X.item(1) 

は、型の範囲を返しません。どのようにレンジオブジェクトにすることができますか?または、他の言葉では、距離オブジェクトを他のオブジェクトに保存する方法があります。

答えて

0

は、それを解決:あなたが入力した場合に問題がApprenetly collection.add であった:あなたが入力した場合

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

Xは、(1)タイプバリアント

を持っています:

X.Add xrng 
    Y.Add yrng 

タイプは範囲になります。なぜなら..

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で開発者向けドキュメントを読んで考えてみましょう。

+0

これは本当ですが、これは問題ではありませんでした。私は範囲が厳格なワークシートを参照していたことを確認しました。問題は、括弧を使用すると範囲が評価され、バリアント型が返ってくると思います。カッコを無視すると、コレクションに範囲タイプが追加されます。私の答えは以下の通りで、このように動作します。 –