2017-04-13 22 views
1

2番目のExcelファイルから日付にアクセスするexcel-vbaモジュールを作成したかったのです。 最初に2番目のファイルをvba-rangeオブジェクトに開き、ワークシート範囲をvba-range-objectにコピーし、その後2番目のファイルを閉じたいと考えました。VBA Excel - 2番目のファイルからVBA範囲のオブジェクトへのコピー範囲

データ処理は、vba-rangeオブジェクトでのみ行われます。

私は次のことを試してみました:私は2番目のファイルを閉じるまで

Set oMeasuresWorkbook = Workbooks.Open(sMeasuresFileName) 
Set oSrcRange = oMeasuresWorkbook.Names("MEASURES").RefersToRange 
MsgBox oSrcRange(1, 1) 
oMeasuresWorkbook.Close 

'problem: after closing the second file (oMeasuresWorkbook) the 
      oSrcRange Object is gone 
MsgBox oSrcRange(1, 1) 'error here as the oSrcRange Object is gone 

すべてが正常に動作します。一見、oSrcRangeは元のデータへの参照です。 btw。同じ振る舞い、例えば、私が範囲にアクセスした場合。

設定oSrcRange = oMeasuresWorkbook.Sheets(1).Range( "A:G")

それでは、どのI "ディープコピー" の範囲だろう。私はrange.copyを試みましたが、semmingly私はレンジオブジェクトを初期化する方法を知らない(と私はワークシートにデータをコピーしたくない)。

は、私は自分自身を明らかにしたとsombodyが

ありがとうを助けることを願って!

+0

私はあなたが 'oMeasuresWorkbook'を閉じた後に' oSrcRange'を 'Copy'したいと思います。それを '閉じる'の前にコピーしないのはなぜですか? –

+0

あなたは配列を使うべきです、あなたのコードはもっと速く動くでしょう。上記のようにデータをコピーしたい場合は、2'ndファイルを実行した後、2番目のExcelファイルのデータをベクターに格納してから2番目のExcelファイルを閉じる必要があります。その後は、あなたが望むようにベクターで遊ぶことができます。しかし、私の勧告は、あなたが必要とするものに対して配列を使用することです – Ionut

答えて

1

代わりにこのような何かを試してみてください:

Dim SrcRangeArray as Variant 
Set oMeasuresWorkbook = Workbooks.Open(sMeasuresFileName) 
Set oSrcRange = oMeasuresWorkbook.Names("MEASURES").RefersToRange 
SrcRangeArray = oSrcRange.Value 
MsgBox SrcRangeArray (1, 1) 
oMeasuresWorkbook.Close 

'problem: after closing the second file (oMeasuresWorkbook) the oSrcRange Object is gone 
MsgBox SrcRangeArray (1, 1) 

は、私の知る限りでは、それはもはやへの変更の影響を受けている場合のみ、メモリ内のオブジェクトのコピーを保存しないための方法はありません元のオブジェクト。オブジェクトは実際のオブジェクトを格納しており、それらのオブジェクトの値は格納していません。

上記のコードでは、代わりに範囲から値を取り出して配列に格納します。これらの値は、元のオブジェクトが閉じていても保持されます。ただし、これらの値に対してのみ作業できるようになりました。たとえば値だけなので、配列を「閉じる」または「開く」ことはできません。

デモ用に元のオブジェクトを残しましたが、オブジェクトが必要なく、その値が必要な場合は、仲介者をスキップして代わりに配列を使用します。