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

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

ただいまの
回答率

90.01%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,346

KEN_aivan

score 12

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 14:23

    返答ありがとうございます。
    私のミスで勘違いさせていただき申し訳ありません、起動したいのはCSVファイルそのものではなくCSVファイル作成用のxlsファイルでした。



    >提案1:CSVはEXCELでブックとして開く必要があるのか
    xlsファイルなので開く必要があります。入出力を行うExcelアプリなのでテキスト形式で代用も出来ません。

    ご迷惑をおかけしました。

    キャンセル

  • 2016/05/20 18:10

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

    キャンセル

  • 2016/05/20 18:18

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/23 10:43

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

    解答済みにはしていますが、返答してくださっているので返答させていただきます。
    すみません、おそらく意味が伝わっていないようなので詳しく説明しますね。
    質問欄に記載してあるマクロが掲載されたブックの他に、同じプロセス上にもうひとつ質問欄に書いてあるマクロが記載されたブックが開いた状態での挙動についてを検証しています。
    なのでブックは二つ開いている状態が、ただしい検証環境となっています。

    ブック一つだけならApplication.QuitでExcelごと閉じるようにしていますが、このままだと複数のブックが開いている状態でも他のブックを巻き込んでExcelごと閉じてしまうので、二つ以上開いている状態では対象のブックだけを閉じるようにマクロを組みました。
    ですが①~③のエラーが発生するためにここで質問させていただきました。

    で、なのですが。
    このExcelアプリで同じOSバージョン、同じOfficeバージョンでマクロ使用でのブック終了時に結果が違うという現象が発生しています。それの検証結果によってはttyp03さんの言う結果になるやもしれませんので、そちらが解決しだい再びコメントさせていただきます。

    キャンセル

  • 2016/05/23 10:57

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

    キャンセル

  • 2016/05/23 17:52

    返答ありがとうございます。
    結局終了時の差異については原因不明のまま捨て置かれることになりました。

    >Workbooks.Count=2 の話は、最後のブックを閉じてもCountは2だったということなので、そうお答えしました。
    すみません、終了するにしてもマクロで閉じない、両方をマクロありで検証したら右上の終了ボタンでも最初のファイルが邪魔をして正常に終了しない、片方だけか、片方をマクロあり、片方を空白のブックで行ってようやく右上で終了可能という状態だったのでWorkbooks.Count=2のままという返答をさせていただきました。

    Excel2003でのBeforeCloseの挙動について、マイクロソフト公式でこのようなサポートを見つけましたのでご参考までにご確認ください。
    https://support.microsoft.com/ja-jp/kb/932632

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる