Excel VBAで一時退避用のセルオブジェクトを作成する方法

このQ&Aのポイント
  • Excel VBAで一時退避用のセルオブジェクトを作成する方法についてご質問があります。元の値を保存した後に値を変更しても、元の値に戻すことができない状況です。他のセルに値をコピーしても参照コピーになるため、元の値を復帰させることができません。退避領域のセルを作らずに、単独でセルオブジェクトを退避させる方法が知りたいです。
  • Excel VBAで一時退避用のセルオブジェクトを作成する方法をご教示ください。元の値を保存してから値を変更し、元の値に戻す方法を試しましたが、参照コピーになっているため元の値に戻すことができません。退避領域のセルを作らずに、単独でセルオブジェクトを退避させる方法が知りたいです。
  • Excel VBAで一時退避用のセルオブジェクトを作成する方法に関してお知りになりたいです。セルの元の値を保存してから値を変更し、元の値に戻す方法を試しましたが、参照コピーになってしまい元の値に戻すことができませんでした。退避領域のセルを作らずに、単独でセルオブジェクトを退避させる方法をご教示いただけますでしょうか。
回答を見る
  • ベストアンサー

Excel VBA 一時退避用のセルオブジェクトを作成したい

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)等に変えて実行してみると、明らかに参照コピーになっていると思われる動作でした。 処理対象のシート上やブック上へ退避用のセルは作りたくないです。 退避領域のセルを単独で作りたいです。 方法をご存じの方、お手数ですがサンプルコードを提示頂けませんでしょうか。 よろしくお願いします。

  • elec2
  • お礼率61% (105/171)

質問者が選んだベストアンサー

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答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

elec2
質問者

お礼

詳細に書いていただいてありがとうございます。 やはり、セルひとつだけの退避でもシートを作るしかなさそうですね。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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++で作られるとそういう機能は使われているのでは)。

elec2
質問者

お礼

回答ありがとうございます。 やはり、難しいですか。

  • soixante
  • ベストアンサー率32% (401/1246)
回答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

elec2
質問者

お礼

回答ありがとうございます。 ちょっと例が単純すぎました。 もう少し具体的に書きます。 cell(10,5)へ文字列"=sum(a1:a10)"(関数ではありません)が入っていたとします。 ここでマクロ Sub aaa() Cells(10, 5) = StrConv(Cells(10, 5), vbWide) End Sub を実行すると、Cells(10, 5)が文字列から関数へ変換されてしまうのです。 ですので、 strConvを実行する前のセル情報を保存しておき、 実行結果次第で元のセル情報に戻す。 ということを考えました。

関連するQ&A

  • エクセルvbaでのセルの情報を貼り付け方法

    vba初心者です。sheet1にあるセルの情報をsheet2にあるセルに貼り付けようと考えています。 下記のようにプログラムしました。 If Cells(Line, 6).Value = "" Then Cells(Line, 6).Value = "データがありません" Cells(Line, 5).Value GoTo コピー貼り付け End If コピー貼り付け: Cells(Line, 5).Copy 'コピーする Worksheets("輸入Parts").Range("A2").PasteSpecial Paste:=xlPasteValues '値を貼り付け 問題はコーピー貼り付けの箇所でRange("A2")ではなくA列の最初の空白のセルに貼り付けるようにしたいです。 どなたかお力をお貸しください。

  • エクセル2000のVBAのcutメゾット

    エクセル2000でセルを他のセルの文字から検索し検索されたセルを特定の場所にコピーし貼り付けるのを空欄になるまで繰り返すVBAを作りました。 Dim a As Range Dim b As Long b = 1 Do Until Cells(2 + b, 5).Value = "" Cells(2 + b, 5).Select Set a = Range("B:B").Find(what:=Cells(2 + b, 5).Value) a.Select Selection.Copy Cells(2 + b, 8).PasteSpecial xlAll Cells(2 + b, 5).Select b = b + 1 Loop なんですが、これだとちゃんと起動するのに「copy」を「cut」に変更したら、「pastespecial」でデバックが発生し止まってしまいます。 どちらかというと、コピーより切り取りして貼り付けたい(んで、残ったセルを検索しメッセージボックスで表示出せたい)のですが、このVBAだとcutメゾットは使えないのでしょうか? また使えるのならば「pastespecial」でなければ、何を使って貼り付ければよいのでしょうか?

  • エクセルVBAで教えて下さい。

    エクセルVBAで以下の方法のマクロが分からず、教えて頂きたいです。 まず、ブックAのシートAがあり、シートAのセルD3には号機No.を入力します(999などの数値のみ) 次にブックBのシートBがあり、このシートのD列にも号機No.が入力されています。 やりたい事はブックAのシートAのD3に号機No.を入力したら、ブックBのシートBのD列から同じ号機No.を 探し、当てはまる号機の行のI列、J列、K列、L列、M列をコピーし ブックAのシートAのF13、F14、F15、F16、F17、に貼り付けたいです。 それぞれの貼り付け先は K列⇒F13 L列⇒F14 M列⇒F15 I列⇒F16 J列⇒F17のようになります。 それとブックBのシートBのD列に入力されている号機No.は同じ数値が入力されている時があります。 この場合は必ず下にある号機No.のが最新ですので、そちらを読み取るようにしたいです。 例えば、4行目と8行目に同じ号機No.がある場合は8行目の方を読み取る。 現在は GYOU = Application.InputBox でターゲットの行番号を入力して その行の列をコピー・ペーストしている感じです。 Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim tmp() As String If Intersect(Target, Range("D3")) Is Nothing Then Exit Sub Else End If Dim buf As String Dim j As Integer Dim GYOU As String Set xCur = Selection Dim OpenFileName As String Workbooks.Open Filename:="業務都合の為載せれません" GYOU = Application.InputBox("行を選択してください", "行指定") '<キャンセルの場合、処理を終わりにします。> If GYOU = "False" Then Exit Sub For j = 11 To 11 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(13, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 12 To 12 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(14, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 13 To 13 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(15, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 9 To 9 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(16, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 10 To 10 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(17, 6).PasteSpecial Paste:=xlPasteValues Next j ActiveWorkbook.Close SaveChanges:=False With xCur .Parent.Parent.Activate '元のブックへもどる .Parent.Activate '元のシートへもどる End With End Sub ど素人の為、めちゃくちゃな並びだとは思いますが一応現在の状態のマクロを載せておきます。 御指導の程、宜しくお願いします。

  • エクセルのVBAで教えて下さい。

    エクセルVBAで以下の方法のマクロが分からず、教えて頂きたいです。 まず、ブックAのシートAがあり、シートAのセルD3には号機No.を入力します(999などの数値のみ) 次にブックBのシートBがあり、このシートのD列にも号機No.が入力されています。 やりたい事はブックAのシートAのD3に号機No.を入力したら、ブックBのシートBのD列から同じ号機No.を 探し、当てはまる号機の行のI列、J列、K列、L列、M列をコピーし ブックAのシートAのF13、F14、F15、F16、F17、に貼り付けたいです。 それぞれの貼り付け先は K列⇒F13 L列⇒F14 M列⇒F15 I列⇒F16 J列⇒F17のようになります。 それとブックBのシートBのD列に入力されている号機No.は同じ数値が入力されている時があります。 この場合は必ず下にある号機No.のが最新ですので、そちらを読み取るようにしたいです。 例えば、4行目と8行目に同じ号機No.がある場合は8行目の方を読み取る。 現在は GYOU = Application.InputBox でターゲットの行番号を入力して その行の列をコピー・ペーストしている感じです。 Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim tmp() As String If Intersect(Target, Range("D3")) Is Nothing Then Exit Sub Else End If Dim buf As String Dim j As Integer Dim GYOU As String Set xCur = Selection Dim OpenFileName As String Workbooks.Open Filename:="業務都合の為載せれません" GYOU = Application.InputBox("行を選択してください", "行指定") '<キャンセルの場合、処理を終わりにします。> If GYOU = "False" Then Exit Sub For j = 11 To 11 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(13, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 12 To 12 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(14, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 13 To 13 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(15, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 9 To 9 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(16, 6).PasteSpecial Paste:=xlPasteValues Next j For j = 10 To 10 ActiveSheet.Cells(GYOU, j).Copy ThisWorkbook.ActiveSheet.Cells(17, 6).PasteSpecial Paste:=xlPasteValues Next j ActiveWorkbook.Close SaveChanges:=False With xCur .Parent.Parent.Activate '元のブックへもどる .Parent.Activate '元のシートへもどる End With End Sub ど素人の為、めちゃくちゃな並びだとは思いますが一応現在の状態のマクロを載せておきます。 御指導の程、宜しくお願いします。

  • エクセルの select case文

    Dim i For i = 1 To 5 Select Case Cells(i, "A") Case "午前" Range("w1").Select Selection.Copy  Cells(i, "C").Select ActiveSheet.Paste Case "午後" Range("x1").Select Selection.Copy Cells(i, "d").Select ActiveSheet.Paste  End Select Next i Dim j For j = 1 To 5 Select Case Cells(j, "A") Case "関東" Range("y1").Select Selection.Copy  Cells(j, "e").Select ActiveSheet.Paste Case "関西" Range("z1").Select Selection.Copy Cells(i, "F").Select ActiveSheet.Paste  End Select Next i 毎回皆様にはお世話になっています。 あるセルを参照してその入力結果により 違うセルを貼り付けるマクロを組みました。 参照するセルが複数個(この例だと2セル)あるので それぞれに変数を宣言してfor nextで まわしています。 この内容を変数ひとつだけで すっきりと記述することは可能でしょうか? 参照するセルや判別する内容が増えると 記述が膨大になって マクロが 見にくくなるので 良い方法がありましたら 御教授ねがいます。

  • エクセルVBAについて

    エクセルVBAについて 下ような、最初に選択したセルに、次に選択したセルをコピーするマクロを使用しています。 Dim Frstcell As Range Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.MergeCells = False And Target.Count > 1 Then Exit Sub On Error Resume Next 'エラーを無視 If Target.Column >= 5 And Target.Column <= 35 Then 'E:AIコピー先 Set Frstcell = Target.Cells(1) ElseIf Target.Column >= 45 And Target.Column <= 46 Then 'AS:ATコピー元 If Target.Cells(1).Value = "" Then Exit Sub Target.Copy Frstcell.MergeArea End If On Error GoTo 0 'エラートラップ終了 End Sub この場合、コピー元の枠線の書式も、コピー先にコピーされてしまうのですが、 書式なしでコピーするにはどうしたらよいでしょうか? よい方法がありましたら、よろしくお願いいたします。

  • EXCEL VBAについて質問です。

    EXCEL VBAについて質問です。 アドバイスを宜しくお願い致します。 現状開いているシートの日付を参照し、新しく開いたシートの日付とあっているセル下部に 貼り付けを行おうとしています。 条件的にはあっている気がしますが、なぜか貼りつきません。 アドバイス宜しくお願いたします。 元シート日付 2014/06/01 添付画像が貼り付け先のEXCELとなっております。 以上宜しくお願い致します。 Dim s As Long Dim wb As String Dim dy2 As String Dim a As String  dy2 = Range("M1")    元EXCELの日付を参照  Range("M5:R41").Copy  元EXCELのデータをコピーする。 wb = "D:\Documents and Settings\ssk\デスクトップ\まとめ.xls"   ’ Workbooks.Open (wb)    新しいブックを開く。 Sheets("data").Select    対象のシートを選択 For n = 2 To 187 Step 6 If Cells(1, n).Value = dy2 Then 元ブックの日付と新しく開いたブックの日付を参照しあっていれば下記のようにはりつけする。 Cells(3, n).Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If Next End Sub

  • エクセルVBAで選択していないシートのセルコピー

    エクセルVBAで質問させてください。 現在選択していないシートから、セルの書式ごとコピーして貼り付けたいのです。 たとえば Sheets(1).Range(Cells(1, 1), Cells(4, 1)).Copy Sheets(2).Range("A1") 等とすると、Sheets(2)が選択されている状態だとエラーになってしまいます。 おそらく、Copyメソッドというのは、選択されているシートにのみ有効だからなのではないか、と思いますが、セルの値だけでなくフォントその他の書式を、別のシート(現在アクティブでない)から持ってくる方法はありますか?

  • Excel 2007 VBAで セル内数値の反映が出来ません

    Excel 2007 VBAで セル内数値の反映が出来ません プログラム中に、セルの数値を参照したいのですが、うまく行きません。 下記にて、コピー元セル指定の範囲指定が、+H3 が反映できません。                          ↓  Sheets("会員台帳").Select              Range(Cells(CopymotoRS, 62), Cells(CopymotoRS + H3 - 1, 71)).Select Application.CutCopyMode = False Selection.Copy

  • VBA Copy/Paste メソッド

    エクセル2002使用です。 sheet1のA7からD19セルの値を sheet2のB列の一列に転記をしたいのですが、 コピーが上手くできません。 Copy、Pasteメソッドを使用するときの セルの選択が良くわからないのですが、 よろしくお願いします。 Sub tenki() Dim i As Integer Dim j As Integer For i = 7 To 19 For j = 1 To 4 Cells(i, j).Copy Worksheets("sheet2").Activate Range("B65536").End(xlUp).Select ActiveCell.past ←ここでエラー(注) Next j Next i End Sub (注) エラー  オブジェクトは、このプロパティーまたはメソッドをサポートしていません。