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

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

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

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

Q&A

解決済

2回答

7169閲覧

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

lovely.wolf

総合スコア15

VBA

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

0グッド

0クリップ

投稿2015/06/04 09:16

編集2015/06/04 11:05

当該ファイルを開く際にリボン等を非表示、閉じる際には表示に戻すところでつまづいています。
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の再起動をしても、治りませんでした。

なにがいけないのか、さっぱりわからず困っています。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

念のため、

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

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

投稿2015/06/04 10:31

takito

総合スコア3111

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

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

lovely.wolf

2015/06/04 10: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
takito

2015/06/04 11:04

あ、ありがとうございました 動くケースがあるのだからそうですよね お手数をおかけしました 恐らく、 SetWindowLong を使ってサブクラス化しておきながら、それを解除していないのが原因ではないでしょうか?
lovely.wolf

2015/06/04 11:20

ご丁寧にありがとうございます。 >サブクラス化しておきながら、それを解除していないのが... う。。。サブクラス化の解除?ぜんぜんわかってません(汗) とりあえず、隣で上司が私の残業代を気にしてゴニョゴニョしているので 明日いろいろ調べてみます。 ひとまず、ありがとうございました。
takito

2015/06/04 11:31

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

2015/06/04 12: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回しか呼ばれないでスムーズに終了します 以上ご参考までに
lovely.wolf

2015/06/05 01: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を使った方が良いのでしょうか... 何か大いなる勘違いをしていたらごめんなさい...なんですが、引続きお手すきの時によろしくお願いいたします。
lovely.wolf

2015/06/05 02: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
takito

2015/06/05 02:59

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

0

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

投稿2015/06/04 09:23

Tak1wa

総合スコア4791

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

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

lovely.wolf

2015/06/04 09: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
lovely.wolf

2015/06/05 02:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問