質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

5714閲覧

ExcelVBA ほぼ同内容のブックを複数起動状態での終了処理エラーについて

KEN_aivan

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/05/19 09:54

編集2016/05/20 05:26

Excel VBAで、名称違いのほぼ同一内容のxlsファイルを同時に開いているときに、片方のブックだけを終了しようとするともう片方のブックに悪影響を与えていきます。
①xlsファイル起動時にAuto_openで隠すようにしているツールボックスやメニューバーをSystem_Close時に再度表示されるようにマクロを組んでいるのですが、もう片方のブックのツールボックスやメニューバーを起動して終了する。
②BeforeCloseを呼び出し時にもう片方に記載されているBeforeCloseを呼び出しにいき応答なしに。
③loopさせているわけではないのにSystem_CloseのEnd Subまでたどり着くともう一度System_Closeを実行し、エラーになる。

改善方法をいろいろと模索したのですがどこを弄っていいのかすら今一判っていません。
せめてSystem_Closeになにか影響がある文だけでも直したいのですが、お力をお貸し願えないでしょうか?
開いているブックには両方同じ内容が記載されています。

Excel2003 SP3

---ThisWorkbook--- Private Sub Workbook_BeforeClose(Cancel As Boolean) If CanClose = False Then System_Close End If If CanClose = False Then Cancel = True End If End Sub ---標準モジュール--- Public CanClose As Boolean Sub System_Close() Application.ScreenUpdating = False Dim CMsg, CStyle, CTitle, CResponse, CString CMsg = "Excelを終了します。よろしいですか?" CStyle = vbYesNo CTitle = "終了" Response = MsgBox(CMsg, CStyle, CTitle) If Response = vbYes Then ' [はい] がクリックされた場合、 MyString = "Yes" (隠したメニューバーを表示させたりするApplication.CommandBars多数、割愛) Application.DisplayAlerts = False '変更保存のメッセージを表示させない Application.ScreenUpdating = True 'Excelを終了 CanClose = True If Workbooks.Count = 1 Then ThisWorkbook.Saved = True Application.Quit Else ThisWorkbook.Close SaveChanges:=False End If Else ' [いいえ] がクリックされた場合、Msgboxを閉じる MyString = "No" End If End Sub

追記
コメントを参考に検証を行い、不明な点が浮かんできたので質問させてください。

①ファイル起動時に独立したプロセスで起動する方法。
Shell関数で名称を指定してしまうと、拡張子の有無で起動出来るかどうかが変わってしまうため、安定した起動方法を一緒に考えてほしい、ファイルの起動中に同一プロセスに別のファイルが入ってしまうと同じ現象が起こりそうなので、独立したプロセスを維持できるようにしたい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

見当違いでしたらすみません。

CSVファイルが開かれた時に同一プロセスで開いてしまっているのではないかなと思いました。
(同一プロセスで開くことによって、クローズの時にもう一つのファイルも巻き込んでいるのではないかと・・・)

※同一プロセスかどうか調べるには、ファイルが開かれた状態でタスクバー右クリック→タスクマネージャーの起動→プロセスタブにEXCEL.EXEが一つしかないならば同一です。

もし、手動でCSVファイルを開いて実行できるなら、以下の手順をお試し頂けますか?
1:空のブックを2つ開く
2:CSVファイルを空のブックそれぞれ開く
3:別プロセスであることを確認
4:VBAを実行して動作を確認

プロセスを別にすることで問題なく動作ができていれば、ファイルを開く方法をプロセスを分けるように変えるか、プロセスを別にする閉じ方を模索するのがよろしいかと思います。
また、自信はありませんがEXCELのバージョンを変えるという方法でもしかしたら解決できるかもしれません(新しいバージョンのEXCELは容量を小さくするために同一プロセスで動いているような・・・)

不明瞭な点が多々あって、惑わせてしまっただけかもしれませんがお試し頂ければ幸いです。

投稿2016/05/19 10:20

SASAHARA

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEN_aivan

2016/05/20 01:54

回答ありがとうございます。 同一プロセスで動いていたので分けて実行してみたところ、質問内容に記載した①と②は大幅に改善されました、とりあえず起動時にプロセスを分けてみる方向で考えてみようと思います。 Excelバージョンなどやその後の検証で理解できた事や別の質問なども追記したので、よろしければまたお力をお貸しください。
SASAHARA

2016/05/20 03:43

少し改善されたようで何よりです。 プロセスを分けて起動する方法としては、Shell以外だとcreateobjectかなーと思います(Shellは実行ファイルを起動させる時に使うイメージ) createobjectではどうでしょうか? また、以下はプロセス問題を解決するための別提案です。現状の根本が変わるお話ですので参考までに。 提案1:CSVはEXCELでブックとして開く必要があるのか textファイル形式で開いて処理すればプロセスに悩まされることはないのかなと思いました。また、textファイル形式で開く際もcreateobjectは利用できます。 提案2:1ファイルずつ開いて閉じるを繰り返すことはできないか 提案1でCSVファイルをどうしてもEXCELで開く必要がある場合、1ファイルずつ開いて閉じることが可能ならプロセスなどに悩まされる必要はないのかなと思います。  開くファイルがCSVファイルとのことなので、 1:ファイルを開く 2:CSVのデータを取得 → なんらかの処理 3:ファイルを閉じる を、ファイルの数だけ繰り返すことができれば・・・と考えたのですが実施したい内容との兼ね合いもあると思いますのでこのあたりは検討が必要になるかと思います。 ご参考になれば幸いです。
KEN_aivan

2016/05/20 05:23

返答ありがとうございます。 私のミスで勘違いさせていただき申し訳ありません、起動したいのはCSVファイルそのものではなくCSVファイル作成用のxlsファイルでした。 >提案1:CSVはEXCELでブックとして開く必要があるのか xlsファイルなので開く必要があります。入出力を行うExcelアプリなのでテキスト形式で代用も出来ません。 ご迷惑をおかけしました。
SASAHARA

2016/05/20 09:10

追記回答まで読みました。 すみません、色々勘違いしていたようです(ttyp03さんのご回答のレス(13:51発信のもの)にご提示されているファイル構成だと思っておりました) なんか結局かき乱してしまっただけのようで申し訳ないです。 もし次のご質問の際には今度こそご協力できればと思います。
KEN_aivan

2016/05/20 09:18

返答ありがとうございます。 こちらこそご迷惑をおかけしました、私だけではプロセスを分けるといった発想は出てこなかったので、大変参考になりました。 また質問を行ったときにはよろしくお願いします。
guest

0

プロセスを分けるのは流石に駄目だといわれたので、別の方法を模索することになりました。
改善案やその方法案を整理して再度質問させていただくため、この質問を閉じさせていただきます。
回答していただきありがとうございました。

投稿2016/05/20 09:14

KEN_aivan

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プロセス分けるのは流石に駄目だといわれたので、別の方法を模索することになりました。
改善案やその方法案を整理して再度質問させていただくため、この質問を閉じさせていただきます。
回答していただきありがとうございました。

投稿2016/05/20 06:47

KEN_aivan

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

System_Close関数の中でThisWorkbook.closeをやってるので、二重にイベントが発生しているとかないですか?
元々Workbook_BeforeCloseイベントが発生してからの処理なので、更なるクローズ処理は不要かと思います。
もしくはSystem_Close関数の中の何らかの処理で、Workbooks.Countが1になってしまい、Application.Quitが呼ばれることで、他方のブックに影響を与えているとか。

投稿2016/05/20 00:23

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEN_aivan

2016/05/20 01:39

回答ありがとうございます。 私もそう思いThisWorkbook.Closeを外して見たのですが、そうするとExcelが終了しなくなってしまいました。 Workbooks.Countをウォッチ式に追加してみましたが、1になることはありませんでした。
ttyp03

2016/05/20 04:51

SASAHARAさんとの方で解決に向かっていそうですが、環境の確認だけさせてください(自分の中でモヤモヤしているので) ファイル構成としては、 1.VBAマクロが入ったExcelブック 2.1から開かれるCSVファイル1 3.1から開かれるCSVファイル2 今回の質問に関してはこのような感じでしょうか。 この場合、2と3はCSVファイルですから、開いた状態ではマクロは存在しません。 なのでCSVファイル(のブック)を閉じるときに、Workbook_BeforeCloseイベントが発生することに違和感があります。
KEN_aivan

2016/05/20 05:23 編集

返答ありがとうございます。 すみません、私の入力間違いです。 CSVファイル作成用のxlsファイルです、編集しているファイル名が『CSV』となっているのでそれだけ見てそのまま書き込んでしまいました。 ファイル構成としましては、 1.C#で作成したwindowsアプリケーション 2.1から開かれるxlsファイル1 3.1から開かれるxlsファイル2 となります。(1に関しては完成品しか見たことないので何ともいえません) 2と3に関してはそれぞれ単独でも使用可能なので、1は触らずその2と3だけエラーが出ないように編集してほしいと言われました。 ご迷惑をおかけしました、質問内容を修正しておきます。
ttyp03

2016/05/20 05:54 編集

こちらでも同じような環境を作って試してみました。 質問③の現象は恐らく最初に回答したようにThisWorkbook.Closeを実行しているため、二重にイベントが発生しているからと思われます。 ThisWorkbook.Closeを実行しないようにすると今度は、2つ目のExcelファイルが閉じれなくなります。 これはApplication.DisplayAlerts = Falseが効いているからと思われます(Workbook_BeforeCloseイベントが発生しない) 対策として廃止したThisWorkbook.Closeの代わりにThisWorkbook.Close=Trueとすると改善されました。 コードはこんな感じです。 If Workbooks.Count = 1 Then ThisWorkbook.Saved = True Application.Quit Else 'ThisWorkbook.Close SaveChanges:=False ← 削除 Application.DisplayAlerts = True ← 追加 End If 試してみてください。
KEN_aivan

2016/05/20 06:42

返答ありがとうございます。 入力していただいたコードを実施したところ、確かにエラーは発生しなくなりました。 しかし、やはりブック自体はマクロでは閉じず、右上の終了ボタンで終了しないと終了できません。
ttyp03

2016/05/20 07:21

最後のブックを閉じるとき、Workbooks.Countの値はいくつになってます? ご自分が想定していないファイルが開いているとかないですか? アドインで入れているものとか。
KEN_aivan

2016/05/20 09:22 編集

返答ありがとうございます。 >最後のブックを閉じるとき、Workbooks.Countの値はいくつになってます? マクロではブックは閉じず、右上の終了ボタンですべてのブックを一度に閉じるため、終了を実行する前の状態の2のままです。範囲外になることもありませんでした。 >ご自分が想定していないファイルが開いているとかないですか? 特に別のファイルが開いているといったことはありません、一度アンインストールし再インストールしたExcel2003SP3で検証しましたが、やはりブック自体はマクロでは閉じず、同様の結果でした。
ttyp03

2016/05/20 11:26 編集

解決済みになってしまい残念ですが見解を書いておきます。 Workbooks.Countが2ということは他に何か開いているということです。 Workbooksコレクションの中は確認しましたか? もしかしたらC#のアプリもカウントされているのでは? If Workbooks.Count = 2 とするのが正しいのかもしれません。 これはプロセス云々の話ではないですよ(と思います)
KEN_aivan

2016/05/23 01:43

返答ありがとうございます。 解答済みにはしていますが、返答してくださっているので返答させていただきます。 すみません、おそらく意味が伝わっていないようなので詳しく説明しますね。 質問欄に記載してあるマクロが掲載されたブックの他に、同じプロセス上にもうひとつ質問欄に書いてあるマクロが記載されたブックが開いた状態での挙動についてを検証しています。 なのでブックは二つ開いている状態が、ただしい検証環境となっています。 ブック一つだけならApplication.QuitでExcelごと閉じるようにしていますが、このままだと複数のブックが開いている状態でも他のブックを巻き込んでExcelごと閉じてしまうので、二つ以上開いている状態では対象のブックだけを閉じるようにマクロを組みました。 ですが①~③のエラーが発生するためにここで質問させていただきました。 で、なのですが。 このExcelアプリで同じOSバージョン、同じOfficeバージョンでマクロ使用でのブック終了時に結果が違うという現象が発生しています。それの検証結果によってはttyp03さんの言う結果になるやもしれませんので、そちらが解決しだい再びコメントさせていただきます。
ttyp03

2016/05/23 01:57

いや意味は伝わっていますよ。 SASAHARAさんとのやり取りは無視して考えてくださいね。 ご質問のマクロをExcelブックに取り込み、私の修正を適用しました。 このブックを2つ用意し、同時に開きます。 片方を閉じると、Workbook_BeforeCloseイベントからの流れで、ブックが閉じられ、もう片方も閉じると、同様にWorkbook_BeforeCloseイベントからの流れでApplication.Quitが呼ばれ、Excel自体が終了することが確認できています。 つまりプロセス云々は関係なく、単にイベントの制御をきちんとすればよいのでは、という回答です。 Workbooks.Count=2 の話は、最後のブックを閉じてもCountは2だったということなので、そうお答えしました。 何にしても別の事象も発生しているようですから、それだけの問題でもなさそうですね。 結果は気になりますので、解決されたら報告いただけると助かります。
KEN_aivan

2016/05/23 08:52

返答ありがとうございます。 結局終了時の差異については原因不明のまま捨て置かれることになりました。 >Workbooks.Count=2 の話は、最後のブックを閉じてもCountは2だったということなので、そうお答えしました。 すみません、終了するにしてもマクロで閉じない、両方をマクロありで検証したら右上の終了ボタンでも最初のファイルが邪魔をして正常に終了しない、片方だけか、片方をマクロあり、片方を空白のブックで行ってようやく右上で終了可能という状態だったのでWorkbooks.Count=2のままという返答をさせていただきました。 Excel2003でのBeforeCloseの挙動について、マイクロソフト公式でこのようなサポートを見つけましたのでご参考までにご確認ください。 https://support.microsoft.com/ja-jp/kb/932632
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問