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

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

ただいまの
回答率

90.47%

  • VBA

    1861questions

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

  • Excel

    1594questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

Microsoft office Excel は、動作を停止しました

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,273

lovely.wolf

score 9

当該ファイルを開く際にリボン等を非表示、閉じる際には表示に戻すところでつまづいています。
Win7 Excel2007(今後2013でも使う予定です)


【標準モジュール】
Public booCloseFlag As Boolean

'API宣言
'ウィンドウハンドルを取得する関数
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'ウィンドウに関する情報を返す関数
 Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
'ウィンドウの属性を変更する関数
 Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'メニューバーを描画する関数
 Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long 

【ThisWorkbook】
Private Sub Workbook_Open()
    Call すべて非表示
    booCloseFlag = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)    
    If booCloseFlag = True Then 終了確認1.Show
    Cancel = booCloseFlag
End Sub

【UserForm:終了確認1】
Private Sub UserForm_Initialize()
    Dim hWnd As Long
    Dim lngWstyle As Long
    hWnd = FindWindow(vbNullString, Me.Caption)
    lngWstyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, lngWstyle And (Not WS_SYSMENU)
    DrawMenuBar hWnd
End Sub

Private Sub CB1_保存する_Click()    
    Call すべて表示
    booCloseFlag = False
    ThisWorkbook.Close True
End Sub

Private Sub CB2_保存しない_Click()
    Unload Me: 終了確認2.Show
End Sub

【UserForm:終了確認2】
Private Sub UserForm_Initialize()
    Dim hWnd As Long
    Dim lngWstyle As Long
    hWnd = FindWindow(vbNullString, Me.Caption)
    lngWstyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, lngWstyle And (Not WS_SYSMENU)
    DrawMenuBar hWnd
End Sub

Private Sub CB1_絶対にしない_Click()
    Call すべて表示
    booCloseFlag = False
    ThisWorkbook.Close False
End Sub

Private Sub CB2_やっぱりする_Click()    
    Call すべて表示
    booCloseFlag = False
    ThisWorkbook.Close True
End Sub

【標準モジュール】
Sub すべて表示()
    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",true)"
    Application.DisplayFormulaBar = True
    ActiveWindow.DisplayHorizontalScrollBar = True
    ActiveWindow.DisplayVerticalScrollBar = True
    On Error Resume Next
    For Each s In ThisWorkbook.Sheets
        s.Select
        ActiveWindow.DisplayWorkbookTabs = True
        ActiveWindow.DisplayHeadings = True
    Next
    On Error GoTo 0
End Sub

Sub すべて非表示()
    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",false)"
    Application.DisplayFormulaBar = False
    ActiveWindow.DisplayHorizontalScrollBar = False
    ActiveWindow.DisplayVerticalScrollBar = False
    On Error Resume Next
    For Each s In ThisWorkbook.Sheets
        s.Select
        ActiveWindow.DisplayWorkbookTabs = False
        ActiveWindow.DisplayHeadings = False
    Next
    On Error Resume Next
End Sub


■ 起きている困った事象
 違うファイルを開いた状態で、
 ワークブックの×ボタンをクリック ⇒ 終了確認1、CB2_保存しない ⇒ 終了確認2、CB1_絶対にしない
 の順番で閉じようとすると、
 「Microsoft office Excel は、動作を停止しました」のウィンドウが出てきてしまいます。

■ 試してみたこと
・一緒に開くファイルは、いろいろなファイルを複数試してみましたが、すべて同じ事象が発生します。
・上記の操作以外は問題ありません。
・ユーザーフォームの終了確認1からステップ実行した場合には、上記事象は起こりません。
・当該ファイルを単独で使用すれば問題は起きません。
・PCの再起動をしても、治りませんでした。

なにがいけないのか、さっぱりわからず困っています。
よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

念のため、

FindWindow(vbNullString, Me.Caption) 
GetWindowLong(hWnd, GWL_STYLE) 

これらを使うための宣言はどこかでしてますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/04 19:47

    ご指摘ありがとうございます&うっかりしておりまして、すみません。
    Public変数と同じ標準モジュールに、以下を記述しております。


    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

    キャンセル

  • 2015/06/04 20:04

    あ、ありがとうございました
    動くケースがあるのだからそうですよね
    お手数をおかけしました

    恐らく、 SetWindowLong を使ってサブクラス化しておきながら、それを解除していないのが原因ではないでしょうか?

    キャンセル

  • 2015/06/04 20:20

    ご丁寧にありがとうございます。

    >サブクラス化しておきながら、それを解除していないのが...
    う。。。サブクラス化の解除?ぜんぜんわかってません(汗)

    とりあえず、隣で上司が私の残業代を気にしてゴニョゴニョしているので
    明日いろいろ調べてみます。
    ひとまず、ありがとうございました。

    キャンセル

  • 2015/06/04 20:31

    とか思っていたら全然違いました
    ウィンドウスタイルを変化させたいだけですね・・・

    キャンセル

  • 2015/06/04 21:24

    乗りかかった船なので・・・

    手元で同じ現象を確認しました

    残念ながら明確には原因がわかりませんでしたが、デバッグすると Workbook_BeforeClose に2回入ってきたので、エクセルの終了の手順が悪い(1度目の終了と2度目の終了で衝突がある?)のかなと思いました

    そこで、コードを書き換えてみました


    【ThisWorkbook】
    Private Sub Workbook_Open()
    Call すべて非表示
    booCloseFlag = True
    bMySave = False
    End Sub

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    終了確認1.Show
    If booCloseFlag = False Then
    'booCloseFlag が False なら終了操作が完結したと判断
    '「保存する」が選ばれたかを判定
    If bMySave = True Then
    Me.Save '上書き保存の実行
    Else
    Me.Saved = True '変更確認のダイアログを出させないよう保存したつもりにする
    End If
    End If
    Cancel = booCloseFlag
    End Sub

    【Form:終了確認1】
    Private Sub CB1_保存する_Click()
    Call すべて表示
    bSave = True
    booCloseFlag = False
    Unload Me
    End Sub

    Private Sub CB2_保存しない_Click()
    終了確認2.Show
    Unload Me
    End Sub

    【Form:終了確認2】
    Private Sub CB1_絶対にしない_Click()
    Call すべて表示
    booCloseFlag = False
    Unload Me
    End Sub

    Private Sub CB2_やっぱりする_Click()
    Call すべて表示
    booCloseFlag = False
    bSave = True
    Unload Me
    End Sub

    【標準モジュール】
    Public bMySave As Boolean

    変更、追加した部分だけを書き出してみましたが、こんな感じでも要件を満たすでしょうか?

    フォームの中で ThisWorkbook.Close をコールするのはやめ、保存するかどうかをフラグに記憶するようにすれば、Workbook_BeforeClose は最初の1回しか呼ばれないでスムーズに終了します

    以上ご参考までに

    キャンセル

  • 2015/06/05 10:57

    おはようございます。昨夜はありがとうございました。

    ご教示いただきましたコードを試行しているところなのですが
    下記の問題が発生してしまいました。

    ・リボン等の表示ができなくなってしまいました。
     →ステップ実行で確認したところ「Call すべて表示」での呼出しはできています。
     →ステップ実行だと表示できるコトもあるので、これから詳しく検証してみます。

    ・保存ができなくなってしまいました。
     →試しにMe.Save の「Me」を「ThisWorkbook」に書き換えてもダメです。
     →ならば!と、【Form:終了確認1】[CB1_保存する]の「bSave = True」を
      「bMySave = True」や「ThisWorkbook.Save」と書いてみましたがダメでした。
     →とりあえず【Form:終了確認1】[CB1_保存する]でThisWorkbook.Close True
      とすると、動作に問題はあるものの保存はされます。

    Workbook_BeforeCloseには見切りをつけて、Auto_Closeを使った方が良いのでしょうか...

    何か大いなる勘違いをしていたらごめんなさい...なんですが、引続きお手すきの時によろしくお願いいたします。

    キャンセル

  • 2015/06/05 11:27

    Auto_Closeですべての問題がスッキリ解決しました。

    takito 様のコードのおかげです。
    本当にありがとうございました<(_ _*)>


    Private Sub Auto_Close()

    終了確認1.Show

    'booCloseFlag が False なら終了操作が完結したと判断
    If booCloseFlag = False Then
    '「保存する」が選ばれたかを判定
    If bMySave = True Then
    ThisWorkbook.Save '上書き保存の実行
    Else
    ThisWorkbook.Saved = True '変更確認のダイアログを出させないよう保存したつもりにする
    End If
    End If

    End Sub

    キャンセル

  • 2015/06/05 11:59

    うまくいったようで何よりです
    がんばってください!

    キャンセル

0

こんにちは。
「動作を停止しました」なのでイベントログの内容が念のため欲しいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/04 18:38

    イベントログがよくわからず、ググってこれかな?という物を調べてみました。
    違っていたらご指摘ください。


    障害が発生しているアプリケーション名: EXCEL.EXE、バージョン: 12.0.6718.5000、タイム スタンプ: 0x54e45be7
    障害が発生しているモジュール名: EXCEL.EXE、バージョン: 12.0.6718.5000、タイム スタンプ: 0x54e45be7
    例外コード: 0xc0000005
    障害オフセット: 0x000663e7
    障害が発生しているプロセス ID: 0x1b70
    障害が発生しているアプリケーションの開始時刻: 0x01d09ea514563f23
    障害が発生しているアプリケーション パス: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
    障害が発生しているモジュール パス: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
    レポート ID: cc07aecf-0a98-11e5-897c-8cc121513809

    キャンセル

  • 2015/06/05 11:30

    コメントありがとうございました<(_ _*)>
    落ち着いたらイベントログについてもお勉強します。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • VBA

    1861questions

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

  • Excel

    1594questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。