undo処理について

解決


アコ  2005-11-15 14:51:58  No: 92644

また皆様のお力を借りにきました。

ワークシート上にマクロから入力したデータを、マクロのコマンドボタンを使いundo処理がどうもできません。

マクロからワークシートにデータを入力した時に、メニューの「元に戻る(undo)」もできない状態です。

実際に人間が操作したようにしなければundo処理はできないのでしょうか?

どうかよろしくお願いします  m(__)m


なな  2005-11-15 18:40:00  No: 92645

Excelの仕様により、
マクロで行うとUndoが効かなくなりますと
どこかのHPで見た覚えがありますので、
探してみてはいかがでしょうか?


ひろ  2005-11-15 19:25:09  No: 92646

「マクロ Undo」で MSDN Library を検索しましょう。
Excelをキーワードから外すのが最大のポイント。


ひろ  2005-11-15 19:27:30  No: 92647

ちょっと補足・・・
VB付属版のMSDN LibraryだとOfficeの分の情報がないかもしれません。
その場合は MSDN Onlineで探してみて下さい。


いな  2005-11-15 20:07:34  No: 92648

どうしてもやり直しが
必要なら何世代まで
やり直しができるかを
決めて変更履歴管理を
行うしかないのかなぁ〜

とこの程度しか思いつかないけど、
もっと良い案があるとは思うけど、なにかないかなぁ


アコ  2005-11-16 02:22:53  No: 92649

ご返答ありがとうございます!

ななさん
>マクロで行うとUndoが効かなくなりますと
>どこかのHPで見た覚えがありますので、
>探してみてはいかがでしょうか?
はい、いろいろと探したのですがマクロでUndoを行える方法はあるようなのです。
どうしても検索にヒットするキーワードが思いつかなくてまだたどり着いてないです。

ひろさん
MSDN Onlineでいろいろと探したのですが
スタックを消去する方法あたりくらいしか近いものが出てこなかったです。
私の見当違いでしょうか・・・
それでもしかするとスタックを工夫して使ってできますでしょうか?
例えばこのコードとか
   Sub ClearAllDocumentsUndoStack()
      Dim oDocUndoStack as Object
      For Each oDocUndoStack In Application.Documents
         oDocUndoStack.UndoClear
      Next oDocUndoStack
   End Sub
利用価値があるのかもちょっと疑問ですがどうでしょうか?

いなさん
変更履歴管理とは初めて耳にしました!
そのようなものが使えますかどうか、ご教授頂きたいです。

皆様よろしくお願いします  m(__)m


いな  2005-11-16 03:36:40  No: 92650

>変更履歴管理
とは、文字通り、
変更した内容を順に覚えておく
っていうだけで、変更された順序が分かれば、Undoも出来るよね?
そうゆうことを言っているだけです。


ひろ  2005-11-16 06:26:16  No: 92651

とりあえず、MSDN Libraryで Office のドキュメントを見ると

・ApplicationオブジェクトのUndoはマクロの先頭でマクロを実行する前にユーザーが実行した最後の操作を取り消す場合にだけ使用できる。マクロで変更した内容のundoは出来ない

・ChartSheet,SpreadsheetのUndoは最後に行った操作か BeginUndo,EndUndo の間の部分の操作の一括Undoができる。

ということですから、どちらも何世代も遡ることは不可能です。

何世代も遡る必要があれば、いなさんの書いたとおり変更履歴の管理をするしかないでしょうね。


いな  2005-11-16 06:35:25  No: 92652

>何世代も遡る必要があれば、いなさんの書いたとおり変更履歴の管理をするしかないでしょうね。

前に、一度実装を検討したことがありましたが、
労力(作業量)の割には、
それほど重要な機能ではなかったため、
仕様変更項目より自然消滅しました。

どうしてUndoをする必要があるのか?
また、Undoを行う必要がある部位をマクロで実行してしまってよいのか?
等を考えてみると、意外と運用回避が出来るかも知れません。


アコ  2005-11-16 15:03:28  No: 92653

皆様ご返事ありがとうござます!

いなさん
>変更履歴管理
すみません。これよくわからないんです(;_;)
これから調べてみます!

>どうしてUndoをする必要があるのか?
>また、Undoを行う必要がある部位をマクロで実行してしまってよいのか?
>等を考えてみると、意外と運用回避が出来るかも知れません。
はい、運用面でなんとか回避策を考えてましたが
どうしてもマクロのみの作業になるので
なんとかそれもマクロに取り込みたいと考えております

ひろさん
>どちらも何世代も遡ることは不可能です。
最悪一度だけのUndo処理できたらいいのですが
マクロでデータ入力を何度も行ってる途中で
その途中のデータ作業の一回分をundoすることは可能でしょうか?
少し調べてやってみたいと思います

これは多少難がありそうですね  (´д`;)トホホ


Blue  2005-11-16 17:51:06  No: 92654

> >変更履歴管理
> すみません。これよくわからないんです(;_;)
> これから調べてみます!
このような機能は、はじめからVBAには備わっていない機能です。
自分でそのアルゴリズムから実装までつくらないといけません。

実際にどのようなつくりなのかは,いなさんが
> 変更した内容を順に覚えておく
> っていうだけで、変更された順序が分かれば、Undoも出来るよね?
> そうゆうことを言っているだけです。
と説明してくださっています。


いな  2005-11-16 18:45:05  No: 92655

> マクロでデータ入力を何度も行ってる途中で
> その途中のデータ作業の一回分をundoすることは可能でしょうか?

データの入力の段階でチェックをかけるのではなく、
なぜUndoという手段に固執するのかがいまひとつ分かりません。

そこで、もう一度確認ですが、

  どうしてUndoをする必要があるのか?

について、教えていただきたいです。


アコ  2005-11-17 00:02:16  No: 92656

はい、

Blueさん
>このような機能は、はじめからVBAには備わっていない機能です。
>自分でそのアルゴリズムから実装までつくらないといけません。
これを作ってしまうと大変手間がかかってしまいそうなのでやらないことにします
ありがとうございます

いなさん
>  どうしてUndoをする必要があるのか?
それは大変膨大な量のデータを迅速に入力する必要があるので
修正するときにはその修正作業の手間を惜しむほど時間的制約があります
そのため手作業での修正ではなくUndo処理によって効率化したいと考えております
マクロの入力によってもどうしても人為的なミスはさけられないので
Undoができればそのミス修正が容易く便利になる次第です

よろしくお願いします


dark  2005-11-17 00:38:13  No: 92657

> Undoができれば
だからできません。(仕様です)つくるしかないのです。
つくらないなら、実現できません。

# 空を飛びたいです。
#   ↓
# 飛行機を作れば飛べます。
#   ↓
# 飛行機をつくるのには時間がかかりますのでできません。
# だけど、空を飛びたいです。

# これとおんなじとといってますよ。


ひろ  2005-11-17 00:58:08  No: 92658

無理矢理Undoを実現する方法としては

案1:ブック全体を丸ごと別のExcelファイルにバックアップしてから操作して、undoはバックアップファイルからのコピーで実現(人が勝手にファイルを操作しないことが保証できる場合はこの方法でもOKかも)

案2:ODBCかOLE DB経由でSQLで操作して必要に応じてrollback

どちらも実際に出来るかいまいち自身がないですが。


いな  2005-11-17 02:00:38  No: 92659

大量データの投入ということでは、
似たようなことを手作業という時点で非効率ではないかなぁ〜。

私は、こうゆうツールを使ってスクリプトにしてしまいます。
明らかに人間の手より早いし時間的制約・・・。っていっても、
これならば夜間も動かしていられるしね。

[UWSC]
http://www.vector.co.jp/soft/win95/util/se115105.html


いな  2005-11-17 02:16:01  No: 92660

ごめん、ますます分からなくなってきた。

・マクロがデータを作成する のに人為的なミスは何処で発生するのか?
  人が入力したミスをマクロが処理してしまい・・・それをやり直したい。
  ってことでよい?

#直前の入力だけならば「クリア」ボタン、一発で
  よさそうな気がするんだけれどもなぁ


アコ  2005-11-17 16:34:52  No: 92661

はい、

dark さん
なんとかundoできないかいろいろな方法で模索します
一度、手入力したようにみせかけるとundoできると耳にしたことがあります
でもどうしてこんな仕様にしたのか疑問です、あると便利なのに・・・  (^。^;)
飛べなければいっそ鳥に生まれ変わって・・・(泣)頑張ります!

ひろさん
ご教授ありがとうございます
でもエクセル一本だけでできないものかなぁと考えております
何せ私はVBA以外の知識が無いときてます  (:Д;)
どうもすみません

いなさん
わざわざ便利なツールを紹介してもらって申し訳ないのですが
私がマクロで行う処理はリアルタイム処理なのです
次々に表示されるものをマクロのボタンをクリックし入力するだけの操作です
例えば
100の記号を現れた順にマクロ上のボタンを順番に押し
それを素早くシートに次々に入力するだけの仕組みとかです
実際はもう少し複雑なのですが・・・
その際にどうしても押し間違えやら、勘違いの人為的ミスが生じるようなので
undoが使えるだけで効率がかなり変わってくるのです。

これはまたショボイマクロかもしれませんが
よろしくお願いします


名無し  2005-11-17 18:23:22  No: 92662

>100の記号を現れた順にマクロ上のボタンを順番に押し
>それを素早くシートに次々に入力するだけの仕組みとかです

そこは自動化できないところなの?
中途半端に人に処理させない方がいいんじゃないかと…。


いな  2005-11-17 22:21:25  No: 92663

>これならば夜間も動かしていられるしね。

夜間「も」です。
リアルタイムにでももちろん動きますよ?

>100をあらわしている部位がプログラムならば
1対1で押すボタンも決まってくるから…。

って言ってもきっと通じないんでしょうね?
頑張ってください。


通りすがり  2005-11-18 04:25:20  No: 92664

アコさん。Excelに用意された小便利なメソッド一発で
Undo できないのはそろそろわかったろ?
まぁ、仕様とあっちゃあしょうがないだろうけど、いくら調べても
見つからないと思うよ。
なぜかっていうと、君の関数の実装は君しかわからないってことよ。
同じ理由で、マクロをUndoできないし、Excelがすべての操作を
Undoできるわけだ。ね。

で、だ。

ちゃんと実装したいのなら、
自前でUndoを実装した方がよさそうだと思うケド・・
自分でマクロ書いたなら、どのような操作をシートに対して行ったかは
解るはずでしょ?それをいちいち記録しておくんだよ。
配列変数に保存してもいいし、テンポラリのシートに書いておいてもよい。
どこどこのセルにあった値をこのように変化させました。とか
ここから個々までの値を使用してグラフを書きましたとかだ。
マクロで行う操作を可能な限り細かく砕いて関数化するんだよ。
その関数の呼び出し履歴とパラメータを記録するんだ。
それと同時に、それを元に戻す関数も書け。
MoveDataHoge() と同時に UndoMoveDataHoge()を用意しろ。
何かの操作を行う関数と、それを元に戻す関数をセットで作るんだよ。
Undoの要求がきたときに、覚えていた呼び出し履歴を逆にたどって
作っておいた元に戻す関数を必要なだけ呼び出すんだよ。
つまり、イナ氏が言っていることなんだけど、わかったかい?

ヒロ氏が言っていることもよい。
切羽詰まったら俺もそうすると思う。
お手軽にやってしまうなら、直前のワークシートをコピーして
たくさん保存しておけば何世代でも戻れるぞ。
ただ、リソースを消費するので要注意だ。

1回戻るだけなら、絶えずActiveなセルの内容を覚えておくだけでも
いいんじゃないか?

まー、がんばってください。
それと、説明は詳しく丁寧にしてくれ。どんなマクロを作りたいのか
サッパリわからんというのが正直なところです。

おじゃましました。


アコ  2005-11-18 14:11:59  No: 92665

みなさんご返答ありがとうございます
名無しさん
>そこは自動化できないところなの?
事象にあわせて人が適切なボタンを押す仕組みになっているのでどうしても自動化はできないのです
例えば写真の仕分けなどを考えてもらえるとわかりやすいかと思います
次々と送られてくる、動物、風景、芸術等の写真を人が見てそれぞれのデータをマクロによって特定のファイルに振り分ける
などといった操作を人がボタンを押すだけでやってくれるマクロです

いなさん
>リアルタイムにでももちろん動きますよ?
はい、人が操作しなければいけない部分はどうしてもソフトに任せられないのです
すみません。。。

通りすがりさん
>自前でUndoを実装した方がよさそうだと思うケド・・
自前で実装することに決めました
ご教授大変参考になりました!
ここまで無知な私に詳しく説明して頂いてとても感謝です
それで個々のデータ変化を記憶するモジュールを作ってundoを表現したいと思います

皆様ここまで付き合ってくれてありがとうございました
m(__)m
無知なぶんだけ多く勉強になりました
多く回答してくださった方、そして皆様に感謝です!
これで解決にしたいと思います

まだまだ知識が浅いのでまた訪れることになるかと思います(泣)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加