
Oいつもお世話になります
VBAで実行した処理はUNDOがないので、処理前にBookをC:\tempにBackupしておいて
「戻る」ボタンを押すと作業中のシートをBackUpファイルからActiveSheet.Pasteで
張り替えるいう無謀なプログラムを組んでみました
Book2が作業中のファイルです
(BackUpを取るときのプログラム)・・Book2が作業中のファイルです
Option Explicit
Public orgFileName As String '...BackUpするファイル名
Public orgExtName As String '...BackUpするファイルの拡張子
Public BakFileName As String '...BackUpファイル名
Public sFile As String '...BackUpするファイルのフルネーム
Sub MakeBackUpFile()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
sFile = Book2.FullName
orgFileName = FSO.GetBaseName(Book2.Name)
orgExtName = FSO.GetExtensionName(Book2.Name)
BakFileName = "c:\temp\" & orgFileName & "_" & Format(Now(), "yyyymmdd") & "Bak." & orgExtName
Book2.SaveCopyAs BakFileName '...BackUpファイルの保存(コピーして保存)
End Sub
(UNDOプログラム)・・BakCsNameがUNDOするシートです
Sub UndoForBook2()
Dim Book3 As Workbook
Workbooks.Open BakFileName '...BackUpファイルOpen
Set Book3 = Workbooks(ActiveWorkbook.Name)
Worksheets(BakCsName).Activate
Cells.Select
Selection.Copy '...BackUpファイルのシートをコピー
Book2.Activate '...作業ファイル
Worksheets(BakCsName).Activate
Cells.Select
ActiveSheet.Paste '...シート全体をコピー
Application.DisplayAlerts = False
Book3.Close '...バックアップファイルをクローズ
Application.DisplayAlerts = True
End Sub
初めてActiveSheet.Pasteを使うのですが、式、リンク等が変化しないかがちょっと
心配です
こんな愚策でいいのか皆さんの意見を聞きたくて投稿しました
ぜひ皆さんの意見を教えてください

- 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
- 今の自分の気分スタンプを選ぼう!
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No2です。
>一番怖いのはリンク先が変わったりして結果が変わってしまうことです
No1の回答でも例示しましたが、ご提示の方法ではリンクや参照などが保持されない可能性があります。
(テストしてみればわかると思いますが)
また、Cells.Copy では、セルの書式や幅、高さ、結合状態などはそのまま保持できますけれど、オブジェクト(=画像等)に関しては微妙です。
セルに関しては全て上書きされますが、オブジェクトに関しては「追加」となります。
つまり、コピー先のシートに既に何らかのオブジェクトが存在する状態で、ペーストすると、既オブジェクトは削除されずこれに追加されることになりますので、デフォルトのオブジェクトID等が変わる可能性があります。
(事前に削除しておいても同様と思います)
>シート名が変わるとリンク名などにも対応しなくてはならないので~
No2の控え用シートを利用する場合のことをおっしゃっていると思いますが、控えのコピーを作成するだけなので、一般的な参照形式であれば何もしなくても良いはずと思います。
ご提示の別ブックを利用する方法のほうが、この問題は起きやすいでしょう。
ついでながら、シートの非表示に xlSheetVeryHidden を用いておくことで、通常のユーザーからは認識できなくなるので、控え用のシート名をキー入力では不可能な名称にしておけば、存在しないシートのようにして扱うことも可能と思います。
No.3
- 回答日時:
力業を好む私はBackUpを作成して戻すという事は私もします
以前 こちらで VBA処理を戻す質問に回答した記憶があります
処理の内容にもよりますが 処理前に処理対象の現状をStatic変数や配列や
テキスト、シートやブックに書き出し保持する事で処理回数分、順に処理結果を戻すことが出来ますね
テキストファイルやcsvで追記記録すると該当処理に関しては復元できることになります
Add・・メソッドなどを戻すのは大変ですけれど処理内容が分かっていれば(わかるように記録すれば)できますね・・
いずれにしても取得するタイミングや保持、どこで破棄するかは考察する必要がありますね
こんにちは
いつもお世話になります
貴重な経験からご意見、ありがとうございます
ちょっと安心しました
どのようにやっているのか聞きたいところですが
なんとなく想像しながら改良していきたいと思います
本当にありがとうございます
これからもよろしくお願い申し上げます
No.2
- 回答日時:
No1です。
>間違いがあったときに、一度だけUNDOが出来るように考えました
>処理時間は早くて気になりませんの大丈夫です
「ある固定処理に対して、UNDOが一度だけ可能なようにする」
ということで良いのでしょうかね・・
もしそうなら、固定処理開始時に同一ブック内の非表示シートに控え(=コピー)をとっておくだけでも良さそうに思います。
「一度だけ」なので、控え用シートは一つで済みます。
(わざわざ別にブックを作成するまでもなさそうに感じられます)
控えが同一ブック内であれば、No1で挙げた参照の問題も解消することが期待できます。
「一度だけ」とのことなので、控え用のシートは設置したままで使い回しても良さそうですが、気持ちが悪ければ、終了時に削除するようにしておけば宜しいかと。
いつもお世話になります
すみません、お礼がおくれて(先実は有給休暇でした)
一番怖いのはリンク先が変わったりして結果が変わってしまうことです
大切な資料を壊すことなく目的を達成させられるよう
いろいろテストを重ねています
今のプログラムは列幅が違うシートどうしのやり取り(作表も含む)を
時間を労することなく行えるようにマージ、罫線、書式等のコピーを
考えています
シート名が変わるとリンク名などにも対応しなくてはならないので
最終的に今の形にしていますがそれでも心配なので、聞いてみました
変な質問で本当に申し訳ございません
これからもよろしくお願い申し上げます
No.1
- 回答日時:
こんにちは
使い方がイマイチ想像できませんけれど・・・
セルのコピペは手操作でのコピペと同じですので、大抵のものは問題なくコピペできると思います。
ただし、自ブック内の他シートへのリンクや参照が含まれる場合、参照先がBackUp内のシートへと変換されてしまいますので注意が必要でしょう。
場合によっては、参照式やリンク等に関してはその部分を文字列としてコピーすることが必要になるかもしれませんね。
あるいは、逆に固定値のセルだけをコピペするか・・
(同一シート内への参照であれば、シートをまとめてコピペすれば大丈夫です)
使用する頻度にもよりますが、シートのActivateやSelectを使用すると画面のチラつきの原因になり易いと考えられます。
セルのコピペで良ければ、
SorceSheet.Cells.Copy DestSheet.Cells
の1センテンスで、画面を変えることなくコピペが可能です。
(ScreenUpdatingを停止すればチラつき防止はできますけれど・・)
また、毎回BackUpブックを「開く/閉じる」の処理をすることで、画面が変わってしまいますし処理時間もかかるので、常時開きっぱなしにしておく方が良さそうに思います。(メモリは食いますけれど・・)
上記の場合、BackUpブックは非表示にしておきたいところですが、同一スレッド内では1ブックだけを非表示にはできないようですので、別スレッドで開いておいて、そちらのスレッドを非表示にしておくことで、バックグラウンドの様に振る舞わせることも可能になります。
(後始末を忘れると、見えないスレッドが残りますのでご注意)
いつもお世話様です
早速のご意見ありがとうございます
特殊なコピーが出来るようにプログラムにいろいろ工夫をしました
間違いがあったときに、一度だけUNDOが出来るように考えました
処理時間は早くて気になりませんの大丈夫です
SorceSheet.Cells.Copyは初めてみるコードなので
トライしてみます
本当にありがとうございます
これからもよろしくお願い申し上げます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba ActiveSheet.pasteを使った...
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
Thunderbirdでemlファイルを開...
-
マクロを作成したファイルを立...
-
「VBScript」ADODB.Streamにお...
-
プログラムで文字をBMPファイル...
-
大きいサイズのテキストファイ...
-
動画処理のライブラリについて
-
VBScriptでのファイル結合処理...
-
fopenできる上限の変更
-
ハッシュの計算時間について
-
SSIを使わずに・・・
-
CSVファイル読み込み
-
【C#】リソースファイルの埋め...
-
ファイルをDDE起動(直接ダブル...
-
マウスポインタの変更
-
ASP .NETでファイル選択ダイア...
-
COM相互運用機能のON,OFFによる...
-
SGファイルって何ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
VB.NETによるプロセス間通信
-
営業秘密の漏洩について
-
Thunderbirdでemlファイルを開...
-
ドラッグアンドドロップでファ...
-
CSVファイルへの保存の際、デー...
-
バッチで118項目のCSVを処理し...
-
SGファイルって何ですか?
-
ファイルの結合
-
分割コンパイルの#defineについて
-
VBAにてEXCEL以外のファイル(テ...
-
2つのCSVファイルの比較
-
ShellExecuteEx→WaitForSingleO...
-
VBに、Cのincludeのようなもの...
-
RPGでファイル名(もしくはレコ...
-
マウスポインタの変更
-
Excelマクロでの再読込み方法
-
関数の呼び方について
おすすめ情報
こんにちは
テストの結果、Activeaheet.Copyでもリンク名が変わりますね
これらにも対処が必要なことが分かりました
申し訳ないです
ありがとうございます、これからもよろしくお円買いします
ご回答No2の隠しシートを検討してみます