- ベストアンサー
エクセルのマクロで保存して終了が出来ない
- エクセルのVBAマクロを使用して保存して終了する処理が正常に動作しない問題が発生しています。マクロを実行しても画面が一瞬点滅するだけで上書き保存や終了がされず、別の名前で保存したファイルでも同様の問題が発生します。他のマクロは正常に動作しているため、保存して終了させるマクロのみが影響を受けている可能性があります。
- 複数の保存して終了するマクロの書き方を試しましたが、いずれも正常に動作せず、手動での保存や終了はできることが確認されています。問題が発生してから別の名前で保存したファイルでも同様の問題が続くため、ファイルの状態やマクロの内容が影響している可能性が考えられます。
- 質問者はエクセルのマクロで保存して終了する処理が正常に動作しない問題に遭遇しています。マクロを作成し、実行すると一度は正常に動作するが、二度目以降は画面が一瞬点滅するだけで上書き保存や終了がされません。また、他のマクロは正常に動作しており、この保存して終了するマクロだけが問題を抱えています。手動で保存や終了することは可能ですが、マクロを使用する場合に問題が発生しています。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
#7です。補足を拝見しました。 質問者様の仰る通りで、間違いないと思います。 >とすべて記述された状態のWorkbookが保存されるのではないでしょうか? >試しに、別の名前をつけて保存しこのマクロが正常に動作する状態にして、 >もう一度開いて、モジュールを見ても上記の記述が全部残っていました。 私の場合、 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) で、Save前の動作を制御(記述)した時、Save後のマクロが保存されない事が あったので、あるいは・・と思いました。失礼しました。 > あと、これが関係あるのか分かりませんが、この問題のファイルは、 >別のPCの共有フォルダより呼び出して使用していますがこれは関係あるのでしょうか? 共有ファイルの保存は私も悩みました。 ProtectSharing とか・・ 思うような動作にならず・・ もし、コードを提示出来るのであれば、お願いします。 参考になるかもと思い、URL載せますね。
その他の回答 (8)
- starsip
- ベストアンサー率36% (22/60)
解決出来たとの事、お疲れ様でした。 解決しているので、既に回答ではありませんが・・・ >Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) >に、シートに”UserInterfaceOnly”の保護をかけるマクロを作っていました。 >削除したら直りました。 基本、そうして直していくしかないのかな・・と、思います。 自分が解っていないと直せないし、プログラム出来ないですもんね。 >(でもそれが何でいけないのか分からないけど…) 私も全ては解りませんが、希望の動作が出来ればいい。位に考えています。 >天下のマイクロソフトの作ったソフトにもバグなんてあるんですね。 そうですよね。 でも、全てのユーザーの全ての希望は把握出来ないでしょうし、 もし、自分でOSのプログラム作成なんて出来ないし・・・ 反対にユーザー(私を含め)でもプログラム出来る(VBA VBなど)ように している(というOfficeプログラムにしている)MSに感謝しておきましょう。 私もVBAは勉強中ですが、優しく教えてもらえる 「教えて!goo 」はいいですよね。 とりあえず、お礼への返事です。----
お礼
>私も全ては解りませんが、希望の動作が出来ればいい。位に考えています。 そうですね、白黒ハッキリさせようと躍起になって袋小路に嵌ってたような気がします。私もそう考えるようにします。 お蔭様で会社の者皆がボタンクリックで誰でも簡単に使えるものが完成し、活用してもらってます。解決したので回答を締め切りますね。 ここで回答頂いた皆さんに感謝!感謝です! 特にstarsipさんにはずっとお付き合いいただき大変ありがとうございました。
- starsip
- ベストアンサー率36% (22/60)
#1 #5 です。 >Sub 保存して終了() >ActiveWorkbook.Save 'ここで保存します。下記の ActiveWorkbook.close は保存していません。 '( 保存した後の動作を記述しているだけです。 ) >ActiveWorkbook.close >End Sub 保存したのは”アクティブワークブックを保存する”記述です。 次回開いても(何回開いても)覚えているのは(Saveする)迄です。 ActiveWorkbook.Close は保存していません。 不明点あれば、補足下さい。
補足
Sub 保存して終了() ActiveWorkbook.Save ↑上の記述でセーブされるのはあくまで上の記述までで、 ↓下の記述は保存されないので次から開く時は閉じなくなる…って解釈でよろしいでしょうか? ActiveWorkbook.close End Sub しかし、このマクロでWorkbookを保存する時には、 Sub 保存して終了() ActiveWorkbook.Save ActiveWorkbook.close End Sub とすべて記述された状態のWorkbookが保存されるのではないでしょうか?試しに、別の名前をつけて保存しこのマクロが正常に動作する状態にして、もう一度開いて、モジュールを見ても上記の記述が全部残っていました。 あと、もうひとつ気づいたのですが手動で上書き保存をした後であれば保存して(すでに上書き保存されているのでマクロで本当に保存されているかは不明ですが)終了することが分かりました。 あと、これが関係あるのか分かりませんが、この問題のファイルは、別のPCの共有フォルダより呼び出して使用していますがこれは関係あるのでしょうか?
- toshi_2000
- ベストアンサー率30% (306/1002)
No.2です。 一回目、二回目の意味をもう少し詳しく教えてください。 一度マクロを実行すると、ブックは閉じる訳ですから、またそのブックを開いてマクロを実行するのですね。 それなら毎回一回目であって、二回目というものがないような気がするのですが。 貴方のおっしゃる一回目とは、何?ですか。
お礼
おかげ様で何とか動くようになりました。 回答ありがとうございました。
補足
そうですよね^^;紛らわしい表現でした。 1回目は、まず”ファイルを別の名前をつけて保存”し、そのファイルを終了。また、その別の名前をつけて保存したファイルを開いてから、マクロを動かす時です。 その1回目は正常に作ったマクロが動作するのでちゃんと、”保存して終了”します。 2回目は、その1回目のマクロで閉じたファイル(別の名前をつけて保存したファイル)をもう一度開き、マクロを動かす時です。
- starsip
- ベストアンサー率36% (22/60)
#1です。 >”終了.保存して終了”・・・と表示されているのです。 Bookを複数開いていませんか。 複数開いていれば "終了"という名前のブックの"Sub 保存して終了()" という事で >”終了.保存して終了” と表示されたと記憶しますが。 標準モジュールでなく、ThisWorkbook 内に記述すれば良い気がします。 自身(VBAを記述しているブック)を保存してから終了するならば、ThisWorkbook 内に Private Sub Workbook_BeforeClose(Cancel As Boolean) Me.Save End Sub としておいて、Close のマクロをロードすればよいのでは・・ ( もしくは×ボタンで閉じるだけ ) 自身(VBAを記述しているブック)を保存するのではなくて、 他のブックを保存終了させるのならば 話は違ってきます。
補足
Bookはそのファイルしか開いてません。 BeforeCloseに保存するマクロはイザという時に保存しないで終了もさせたいので、あえて止めました。 あと、このマクロは自身を保存するマクロです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>終了.保存して終了”のように、モジュール名.マクロ名、と表示されているのです 通常だと、別モジュールに同じ名前がある場合にこのようにモジュール名を修飾して表示されます。 なので、本来であれば、 終了.保存して終了 TEST.保存して終了 の様に重複して表示されるはずですが、 1つだけということなので、マクロがおかしくなっているのかもしれません。 マクロのエクスポートを行って、 新しいブックにインポートしてみたらどうでしょう。
お礼
ありがとうございます。実は、月曜日に仕事に出るまでそのエクセルファイルを触ることが出来ないので、月曜に出社したら、即試して見ます! 今日が金曜日であることを忘れてて、困り度3にして、皆さん急いで回答くださるのに試せないことに気づきました。迂闊でした。 ここをお借りして皆さんにお詫び申し上げますm(__)m
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 上書き保存も終了もしません。 ブックに変更がなければ、Save メソッドは働かないですが、その辺は OK ですか? 前回の保存時からブックに変更があったかどうかは、 IF ThisWorkbook.Saved Then MsgBox "変更なし" Else MsgBox "変更あり" End If で調べることができます。 > .... 終了させるマクロだけが変なのです。 終了とは? ・ブックを閉じるだけで Excel は残す? ・ブックも閉じるし、Excel も終了させる? ・同時に開いているブックはある? この辺の状況でコーディングが変わってきますので、補足して下さい。
お礼
おかげ様で何とか動くようになりました。 回答ありがとうございました。
補足
>ブックに変更がなければ、Save メソッドは働かないですが、その辺は OK ですか? はい、試しに何か入力してマクロを動かしても同じでした。 終了の方法は、「ブックを閉じるだけで Excel は残す」です。 今までに同じ、保存して終了させるマクロは書いて何度も使ったことあるのですが、今回のようなことは初めてです^^;
- toshi_2000
- ベストアンサー率30% (306/1002)
Sub 保存して終了() のマクロは、これと同じWorkbookに書いてあるのですね。 それとも、マクロのファイルと実際に保存して終了させたいファイルは別々ですか。
お礼
ありがとうございました。
補足
回答ありがとうございます。 はい、同じWorkbookに書いてあります。VBAで、プロジェクトエクスプローラで、ThisWorkbookを右クリックして標準モジュールを挿入してそこに書きました。 モジュールは他にも作ってマクロの種類ごとにモジュールに名前をつけて分けました。 それで新たに気づいたのですが、Alt + F8 でマクロを起動したり、ボタンなどにマクロを登録する時、マクロ名の一覧が出てそれを選んで実行(登録)しますよね。その時のマクロ名の一覧で”保存して終了”のマクロ名だけ”終了.保存して終了”のように、モジュール名.マクロ名、と表示されているのです。試しに同じWorkbookの他のモジュールにマクロを貼り付けても同じ現象が起きます。一体何なんでしょう…。
- starsip
- ベストアンサー率36% (22/60)
こんにちは Thisworkbook.Save Thisworkbook.Close では、どうですか?
お礼
回答ありがとうございます。 それもやってみたけど駄目でした。
お礼
お礼が遅くなり大変申し訳ありません! とりあえず、解決しました。、、、実は、 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) に、シートに”UserInterfaceOnly”の保護をかけるマクロを作っていました。どうやらそれが原因だったみたいで、削除したら直りました。(でもそれが何でいけないのか分からないけど…) 代わりに、Private Sub Workbook_Open()にシートに”UserInterfaceOnly”の保護をかけるマクロを貼り付けました。 載せて頂いたURLは読ませていただきました。天下のマイクロソフトの作ったソフトにもバグなんてあるんですね。世間知らず(?)でした^^;