

Excel VBA 一時退避用のセルオブジェクトを作成したい
お世話になります。
環境は
WindowsXpPro Sp3
Excel2002 Sp3
です。
まず、「やりたいこと」をエクセルではなく通常の変数で書いてみます。
-------------------------------------------
aの値が20を超えていたら元の値に戻したい
-------------------------------------------
Dim a As Long
Dim temp As Long
a = 10 '元の値
temp = a '元の値を保存
a = 30 '変更後の値
If a > 20 Then
a = temp
Else
End If
-------------------------------------------
これと同じことをエクセルのCell(単一)に対して行いたいです。
うまくいかないので、Copy,Pasteを使ってみましたが、参照コピーになるようで元に戻せません。
元に戻したいのは、値だけではなく、そのセルに含まれる情報全てです。
なので「セルオブジェクトを退避させて復帰させる」というのを実現させたいです。
うまくいかないので、試しにCopy,Pasteを使って以下のコードを実行してみました。
しかし、参照コピーになっているようで元の値には戻りませんでした。
-------------------------------------------
Cells(10, 5) = 3
Cells(10, 5).Copy '<---- 元の値を保存
Cells(10, 5) = 20 '<---- 値を変更
If Cells(10, 5) > 10 Then
ActiveSheet.Paste '<---- 元の値に復帰させたいけれど変更後の「20」になってしまう。
Else
End If
-------------------------------------------
ペースト先をcells(10,6)等に変えて実行してみると、明らかに参照コピーになっていると思われる動作でした。
処理対象のシート上やブック上へ退避用のセルは作りたくないです。
退避領域のセルを単独で作りたいです。
方法をご存じの方、お手数ですがサンプルコードを提示頂けませんでしょうか。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
こんにちは。
ブックやシート無しに、セル単独では存在しないのだから、
>処理対象のシート上やブック上へ退避用のセルは作りたくないです。
これは無理でしょう。
一時的にでも、シートを作って、そこに退避させるしかないと思います。
おそらく、以下のようなことがしたいんじゃないかと思いまが、いかがでしょう?
'***********************************************************
'標準モジュール
Option Explicit
Sub sample()
Dim newClass As New Class1
Sheets("Sheet1").Cells(10, 5).Value = 3 '元の値
Sheets("Sheet1").Cells(10, 5).Copy newClass.tmp '<---- 元の値を保存
Sheets("Sheet1").Cells(10, 5).Value = 20 '<---- 値を変更
If Sheets("Sheet1").Cells(10, 5).Value > 10 Then
newClass.tmp.Copy Sheets("Sheet1").Cells(10, 5) '<---- 元の値に復帰
End If
End Sub
'**************************************************************************
'以下クラスモジュール
Option Explicit
Private r As Range
Private Sub Class_Initialize()
Set r = ThisWorkbook.Worksheets.Add.Range("A1")
End Sub
Public Property Get tmp() As Range
Set tmp = r
End Property
Private Sub Class_Terminate()
Application.DisplayAlerts = False
r.Parent.Delete
Application.DisplayAlerts = True
End Sub
詳細に書いていただいてありがとうございます。
やはり、セルひとつだけの退避でもシートを作るしかなさそうですね。
ありがとうございました。
No.2
- 回答日時:
長年この質問コーナーの質問を読んでいるが、この質問のようなのは、見たことが無い。
私の勉強不足理解不足か、質問者の根本を思い至らなくて、考えが珍奇なのか。
エクセルVBAではシートということを離れて、1セル(Rangeオブジェクト)だけのオブジェクトを、そっくりのオブジェクトを持った存在として作ることは考えてないはず。
形式を選択して貼り付けの画面に例示される
(1)セルの値
(2)書式
(3)表示形式
(4)コメント
(5)入力規則
(6)列幅・行高
や
その他オブジェクトの台紙(シートの属性かも)としての役割などがオブジェクトとして持たされている。
この(1)-(6)などの全体を1セルだけ取り出すのは不可能だろう。
(1)必要ならあらかじめの時点で別のワークのシートにそのセル全部を全的にコピーしておいて、必要あれば1セルだけを全的なコピーしてコピー元のそのセルに戻す。
(2)上記のセルの値や数式などのうち重要と思うもの(文字列や値)を直前に採って変数に一時退避しておいて、その情報で元のセルの属性を復元するとかする。
しかなかろう。
セルの属性にはセルの「値」以外にも沢山あることを意識したことがありますか。無いのでは。
エクセルなどの最近のウインドウプログラムのオブジェクトは
http://sky.ap.teacup.com/naotan/383.html
のように上下・包摂関係になっていて、VB.NETでいうInherit継承的な考えがとられるため、セルだけのオブジェクトを作ることは難しいのではと思う(この点私も自信なく見当ハズレかも。質問者が今後勉強してください。)VB6(VBAの基)にはなくても、エクセルがC++で作られるとそういう機能は使われているのでは)。
No.1
- 回答日時:
E10セルに値を入れる前に、変更後の値が20を超えてるかどうかを、先に判定してはだめなのですか?
「20を超えてたら元に戻す」って考えじゃなくて、「20以下だったら変更後の値を入れる」
ではだめなのでしょうか。
変更後の値が20以下だったら、変更後の値を、Cells(10,5).Value にセット。
変更後の値が20を超えてたら、何もしない。
-------------------------------------------------------------
Sub aaa()
'変更後の値をbとする
Dim a As Long, b As Long
If b <= 20 Then
Cells(10, 5).Value = b
Else
End If
End Sub
回答ありがとうございます。
ちょっと例が単純すぎました。
もう少し具体的に書きます。
cell(10,5)へ文字列"=sum(a1:a10)"(関数ではありません)が入っていたとします。
ここでマクロ
Sub aaa()
Cells(10, 5) = StrConv(Cells(10, 5), vbWide)
End Sub
を実行すると、Cells(10, 5)が文字列から関数へ変換されてしまうのです。
ですので、
strConvを実行する前のセル情報を保存しておき、
実行結果次第で元のセル情報に戻す。
ということを考えました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
Excelで指定した日付から過去の...
-
エクセルvbaで、別シートの最下...
-
【Excel VBA】指定行以降をクリ...
-
【Excel】指定したセルの名前で...
-
VBA実行後に元のセルに戻りたい
-
特定のセルが空白だったら、そ...
-
Excel VBA マクロ ある列の最終...
-
vba 隣のセルに値がある行だけ...
-
VBA コピーして次の値まで貼り...
-
VBA初心者です。結合セルを保持...
-
VBAでセルをクリックする回...
-
VBSでエクセル内の行数を取得す...
-
i=cells(Rows.Count, 1)とi=cel...
-
”戻り値”が変化したときに、マ...
-
特定の文字を条件に行挿入とそ...
-
ExcelのVBAで数字と文字列をマ...
-
3桁または4桁の数値を時刻に...
-
Excelのプルダウンで2列分の情...
-
クリックされたセルの位置を取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
Excelで指定した日付から過去の...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel VBA】指定行以降をクリ...
-
VBA実行後に元のセルに戻りたい
-
特定のセルが空白だったら、そ...
-
【Excel】指定したセルの名前で...
-
”戻り値”が変化したときに、マ...
-
【EXCEL VBA】Range("A:A").Fi...
-
エクセルvbaで、別シートの最下...
-
連続する複数のセル値がすべて0...
-
セル色なしの行一括削除
-
Excel VBA マクロ ある列の最終...
-
VBAでセルをクリックする回...
-
特定の文字を条件に行挿入とそ...
-
Excel vbaで特定の文字以外が入...
-
Excelのプルダウンで2列分の情...
-
VBからEXCELのセルの値を取得す...
-
EXCELで変数をペーストしたい
-
vba 隣のセルに値がある行だけ...
おすすめ情報