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
No.1ベストアンサー
- 回答日時:
>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など)のプロパティーを退避させる必要のある事です。
回答ありがとうございます。
回答の中に書かれている.net関係の参照設定を加えて、
Cloneメソッドをオブジェクトブラウザで探してみましたが、
やっぱり見つかりませんでした。
書かれているように Property Let/Getあたりをつかって、一個一個、
値をコピーするしかなさそうですね。
No.3
- 回答日時:
すでに具体的な回答が出てるし、質問から日もたってるので、経験談を
グラフでは自分もハマった事があって、そのときは退避用にBookを作って、そこにシートごと退避
再利用時は退避したBookからシートごとコピーしてコピーしたものを貼り付けた時点で、Setして利用しました
グラフ付きのシートはコピー回数に制限がある為、思いの他苦労したのを覚えています
グラフだけコピーすると勝手にリンク張っちゃうしね…
回答ありがとうございます。
たしかに、一回シートとして待避させたほうが、理解しやすいと思います。
是非、試してみたいと思います。
なかなか、軸ラベルのタイトル名とフォント一式のみとか、
それだけをコピーする方法もなく、結局先にアドバイスしていただいた方法で現在は作業を進めています。
No.2
- 回答日時:
>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をコピー&ペーストするマクロを書いてみました。
やっぱり、プロパティーの列記はめんどくさいですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
LISTBOXの内容が更新されま...
-
ifstreamクラスとistreamクラス
-
VBAのWindowオブジェクトとWork...
-
JAVAからHTMLへ値を返す方法
-
Excel VBA : イコールになら...
-
戻り値がクラスオブジェクト
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
error C2712: オブジェクト ア...
-
Vbで通常使用するプリンターを...
-
ASP.net 教えてください!!(...
-
DOMの要素ををtextarea(dropし...
-
オブジェクトレベルとメタレベル
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
JqueryとPrototypeの比較
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
COMコンポーネントって何?
-
ワイルドカード<?>と型パラメー...
-
ビジュアルC++でボタンの有...
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
newは明示的にした方が良いのか?
-
オブジェクトレベルとメタレベル
-
0 == False はいいけど
-
ASP.net 教えてください!!(...
-
LISTBOXの内容が更新されま...
-
戻り値がクラスオブジェクト
-
Vbで通常使用するプリンターを...
-
時間帯判定をする。
-
ワードで画像をドロップすると...
おすすめ情報