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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) Excel 散布図グラフ 外れ値 セル番地参照方法 4 2022/04/19 18:56
- Visual Basic(VBA) エクセルVBA Workbook変数に変数を使ったファイル名を格納したい 5 2023/06/13 14:46
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- Windows 8 動画の再生とタイトルの変更方法を教えてください。 3 2022/08/01 14:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
パワーポイントのVBAでテキスト...
-
CoCreateInstanceでエラーになる。
-
複数TBLのオブジェクトを1つの...
-
Excelで =EMBED("Acrobat Docu...
-
オブジェクトと関数の違い
-
ADO オブジェクトの渡し方
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
JAVAからHTMLへ値を返す方法
-
XAMLの動的生成について
-
CFileDialogでフォルダだけを選...
-
bmp画像をjpegやpng画像に圧縮...
-
ASP.net 教えてください!!(...
-
C# Proxyを通してブラウザを開...
-
COMコンポーネントって何?
-
VBSでのステートメントの末尾が...
-
BufferedWriterのcloseメソッド
-
Excelファイルをgrep検索したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報