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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
好きな「お肉」は?
牛肉、豚肉、鶏肉、ラム肉、クマやシカの狩猟肉……。 いろ〜んな肉が食べられるようになりましたよね。 あなたがこれまで食べて「これはうまい!」とか「なんじゃこりゃ!」と好きになったお肉を教えてください。
-
Rangeオブジェクトを一時的に作成することは出来ますか。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで指定した日付から過去の...
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
vba 隣のセルに値がある行だけ...
-
i=cells(Rows.Count, 1)とi=cel...
-
プロムラミングが得意な人助け...
-
【Excel VBA】指定行以降をクリ...
-
Excel2003 複数セル1列の入力済...
-
VBAでセル同士を比較して色付け
-
VBA初心者です。結合セルを保持...
-
EXCELで変数をペーストしたい
-
【VBA】シート上の複数のチェッ...
-
Excelのプルダウンで2列分の情...
-
DataGridViewのセル編集完了後...
-
VBAでセルをクリックする回...
-
Excel VBAで、 ヘッダーへのセ...
-
エクセル マクロで セルの範...
-
ExcelVBA:オートフィルタをかけ...
-
【EXCEL VBA】Range("A:A").Fi...
-
指定した条件で行セルを非表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
特定のセルが空白だったら、そ...
-
Excelで指定した日付から過去の...
-
Excelのプルダウンで2列分の情...
-
【Excel VBA】指定行以降をクリ...
-
特定の文字を条件に行挿入とそ...
-
EXCELで変数をペーストしたい
-
エクセルVBAでコピーして順...
-
TODAY()で設定したセルの日付...
-
VBAでセルをクリックする回...
-
セル色なしの行一括削除
-
VBA実行後に元のセルに戻りたい
-
【Excel】指定したセルの名前で...
-
”戻り値”が変化したときに、マ...
-
Excel vbaで特定の文字以外が入...
-
EXCELのVBA-フィルタ抽出後の...
-
VBA初心者です。結合セルを保持...
-
指定した条件で行セルを非表示...
-
ExcelのVBAで数字と文字列をマ...
おすすめ情報