- ベストアンサー
VBAのオブジェクトの値を保持しておくには
ExcelのVBAにおいて、Deleteメソッドを使用して、 オブジェクトを削除する場合に、削除前に保持データを丸々待避させる よい方法はないでしょうか。 例)グラフタイトルのフォントスタイルを書き戻す。 1. ActiveChart.ChartTitle.Fontの内容を待避させる。 2. Deleteでタイトルを消す。 ActiveChart.ChartTitle.Delete 3. 間に種々処理を行う。 4. 新しいタイトルをつける。 ActiveChart.HasTitle = True ActiveChart.ChartTitle.Characters.Text = "foo" 5. ActiveChart.ChartTitle.Fontの内容を新しいタイトルに適用する。 プロパティーを列挙して変数に格納する方法を試したましたが、 プロパティーの数だけコードを書かなければならないので断念しました。 通常の変数であれば、 1. 規定値をセット(A=1) 2. 退避用の変数にAを保持させる(B=A) 3. Aに対して操作を行う 4. 待避した値をAに書き戻す(A=B) というようなことができるのですが。 オブジェクトにSet等を試しましたが、Setを使ってオブジェクトを入力した場合、 もとオブジェクトの変化に対して動的に値が変化するため、待避できませんでした。 どなたか、わかる方がいらっしゃいましたら、よろしくお願いいたします。 使用環境 WindowsXP SP2 Excel 2002 SP3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>Setを使ってオブジェクトを入力した場合、もとオブジェクトの変化に対して動的に値が変化 そうなんですよね~。オブジェクトの代入は、オブジェクト・アドレスの参照渡しになって、値コピーを行ってくれません。これがVB.NETであれば、CopyやCloneメソッドがあるので、値コピーを行えますが、VBAはVB6仕様なので、恐らくCopyやCloneメソッドの類はありません。 (でも調べて下さいね。そして見つかったら、教えて下さい^^) >プロパティーを列挙して変数に格納する方法を試したましたが、プロパティーの数だけコードを書かなければならないので断念しました 私は今まで、これでやって来ました。ただしプロパティーCopy用のClassをつくり、一回作れば、目的のObjectを与えるだけで、Copyから再Copyまで全てやってくれるようにしています。またCopyするプロパティーは必要最小限に抑えています。Classであれば、拡張も容易ですし、ExcelのClassを部品として再利用できます。 注意点としては、Excel Objectのプロパティーには、それ自体Objectであるものも多数含まれるので、Copyを行う際には、Objectの最下層プロパティーまで遡って、値型(StringやInteger,Singleなど)のプロパティーを退避させる必要のある事です。
その他の回答 (2)
- pulsa
- ベストアンサー率57% (34/59)
すでに具体的な回答が出てるし、質問から日もたってるので、経験談を グラフでは自分もハマった事があって、そのときは退避用にBookを作って、そこにシートごと退避 再利用時は退避したBookからシートごとコピーしてコピーしたものを貼り付けた時点で、Setして利用しました グラフ付きのシートはコピー回数に制限がある為、思いの他苦労したのを覚えています グラフだけコピーすると勝手にリンク張っちゃうしね…
お礼
回答ありがとうございます。 たしかに、一回シートとして待避させたほうが、理解しやすいと思います。 是非、試してみたいと思います。 なかなか、軸ラベルのタイトル名とフォント一式のみとか、 それだけをコピーする方法もなく、結局先にアドバイスしていただいた方法で現在は作業を進めています。
>Property Let/Getあたりをつかって・・・ ヘルプに正直な方ですね。 Classにおいて、Property Let/Getを使うのは、Property値入出力時に値を検査できるから、推奨されているに過ぎません。今回は外部に公開予定もないと思いますので、Property Let/Getは省略してもいいと思います。以下では、Public Class ~ End Class で、Classファイルを表します。 Public Class Ob_j x as Single s as String End Class だけで、クラス Ob_j には Property x,s が定義されます。 Dim Obj as New Ob_j Ob_j.x = 1.0 Ob_j.s = "OK" なんて事ができます。私はたいてい Property Copy 用の Class に、Sub Copy_Constractor と Property_Copy Function を設けます(名前はどうでも良いです)。例えば、Chart Object が T型(Object型)の Property SingleString を持ち、SingleString がさらに、Single型の x と String型の s を持つとしたら、 Public Class Chart_Copy Private SS as New T Public Sub Copy_Constractor(ByVal Target as Chart) With Target With .SingleString SS.x = .x SS.s = .s End With End With End Sub Public Function Property_Copy(ByVal Target as Chart) as Chart With Target With .SingleString .x = SS.x .s = SS.s End With End With End Function としています。
お礼
最近、忙しくマクロを試す暇がなかったので、 返信遅くなり、申し訳ありません。 確かに、今回の場合Let/Getは使わないですね。すみません。 アドバイスにしたがって、とりあえずFontとCharactersをコピー&ペーストするマクロを書いてみました。 やっぱり、プロパティーの列記はめんどくさいですね。
お礼
回答ありがとうございます。 回答の中に書かれている.net関係の参照設定を加えて、 Cloneメソッドをオブジェクトブラウザで探してみましたが、 やっぱり見つかりませんでした。 書かれているように Property Let/Getあたりをつかって、一個一個、 値をコピーするしかなさそうですね。