Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
特定のワークブックを閉じる
投稿日時: 21/11/30 21:40:37
投稿者: 初心者VBA大好き

おしえてくれませんでしょうか
下記のコードはネットでみつけました。
コマンドボタンをクリックすると
A.xlsm以外のエクセルブックを
全て閉じたいのですが、
なぜかA.xlsmが閉じられてしまいます。
どうすればいいのかおしえてくれませんでしょうか
 
 
Dim wbbb As Workbook
For Each wbbb In Workbooks
If wbbb.Name <> "A.xlsm" Then
wbbb.Saved = True
wbbb.Close
End If
Next
Application.Quit
 
 

回答
投稿日時: 21/11/30 22:21:47
投稿者: simple

えーと、
Application.Quit
というのも実行したあとですよね。
それは、Excel自体を終了させる命令なので、
A.xlsmも何もかも閉じて終了するのです。
 
そういう話だと思いますが、
話の前提が違っているのなら、もう少し説明してください。

回答
投稿日時: 21/11/30 22:33:44
投稿者: WinArrow
投稿者のウェブサイトに移動

このマクロは、どのブックに記述しているのでしょうk?

投稿日時: 21/12/01 11:21:53
投稿者: 初心者VBA大好き

Application.Quit は外しました。
下記のようになっています。
 
CommandButton3_Clickをクリックすると
xx.xlsmのシートも開くようになりました。
xx.xlsmを開かずUserForm1だけ表示
させるにはどうしたよろしいでしょうか
あと
これさえクリアすれば いいのですが。
 
 
Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show vbmoderess
Cancel = True
End Sub
 
Private Sub CommandButton1_Click()
Application.Visible = True
CreateObject("Shell.application").Open "C:\Users\user\OneDrive\デスクトップ\B.xlsx"
End Sub
 
Private Sub CommandButton2_Click()
CreateObject("Shell.application").Open "C:\Users\user\OneDrive\デスクトップ\A.xlsx"
End Sub
 
Private Sub CommandButton3_Click()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> "xx.xlsm" Then
wb.Saved = True
wb.Close
End If
Next
End Sub
 
Private Sub UserForm_initialize()
UserForm1.Show vbmoderess
Cancel = True
End Sub
 

回答
投稿日時: 21/12/01 11:39:00
投稿者: simple

既に確認コメントがありましたが、きちんと回答をお願いします。
今回の5つのプロシージャはそれぞれ、どのブックのどのモジュールに書いたものですか?

回答
投稿日時: 21/12/01 11:51:23
投稿者: simple

つっこみどころが色々ありそうですが、それはさて置いて。
 
| xx.xlsmを開かずUserForm1だけ表示
| させるにはどうしたよろしいでしょうか

についてだけコメントすると、
(1)開かずにユーザーフォームだけというのは無理です。
   ユーザーフォームはブックの中で定義されているものなので。
(2)開いたブックを非表示にすればよいでしょう。
   Workbooks("test.xlsm").Windows(1).Visible = False
   などと書くことで可能です。

投稿日時: 21/12/01 12:05:22
投稿者: 初心者VBA大好き

ありがとうございます。
うまくいきました。
助かりました。
 Workbooks("test.xlsm").Windows(1).Visible = False

回答
投稿日時: 21/12/01 12:14:59
投稿者: simple

都合のよいところだけ取り上げて、こちらの質問には回答なしでしょうか。

回答
投稿日時: 21/12/01 12:15:39
投稿者: WinArrow
投稿者のウェブサイトに移動

回答者からの質問を無視しないようにしましょう。
 
今後、アドバイスを貰えなくないrますよ!
 
コードの内容を見ますと、意図不明なコードが見受けられます。
たまたま動いているだけかもしれません。

投稿日時: 21/12/01 12:48:38
投稿者: 初心者VBA大好き

すみませんでした
WinArrow
このマクロは、どのブックに記述しているのでしょうk?
xx.xlsmに記述しております。
他のブックではありません。
 
 
 
Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show vbmoderess
Cancel = True
End Sub
 
 
 UserForm1にコマンドボタンに作成してあります。-----------
Private Sub CommandButton1_Click()
Application.Visible = True
CreateObject("Shell.application").Open "C:\Users\user\OneDrive\デスクトップ\B.xlsx"
End Sub
  
Private Sub CommandButton2_Click()
CreateObject("Shell.application").Open "C:\Users\user\OneDrive\デスクトップ\A.xlsx"
End Sub
 
 
Private Sub CommandButton3_Click()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> "xx.xlsm" Then
wb.Saved = True
wb.Close
End If
Next
End Sub
  
 
 ----------------------------------------
 
Private Sub UserForm_initialize()
UserForm1.Show vbmoderess
Cancel = True
End Sub

回答
投稿日時: 21/12/01 13:28:13
投稿者: WinArrow
投稿者のウェブサイトに移動

回答ありがとうございます。
 
なぜ、質問したkというと

引用:

A.xlsm以外のエクセルブックを
全て閉じたいのですが、

引用:

If wbbb.Name <> "A.xlsm" Then

の説明に起因しています。
2回目のコードでは
A.xlsmが説明もなく、A.xlsxやxx.xlsmに変わっているいます。
 
後出しではないけど、
全くに他人にアドバイスを求めるならば、
最初の質問と変わっていることをキチンと説明しましょう。
 
また、
Cancel = True
は、なんのおまじないですか?

投稿日時: 21/12/01 13:36:04
投稿者: 初心者VBA大好き

 
A.xlsm以外のエクセルブックを
全て閉じたいのですが、
 
If wbbb.Name <> "A.xlsm" Then
 
の説明に起因しています。
 
2回目のコードでは
A.xlsmが説明もなく、A.xlsxやxx.xlsmに変わっているいます。
  
後出しではないけど、
全くに他人にアドバイスを求めるならば、
最初の質問と変わっていることをキチンと説明しましょう。
 
申し訳ございません。
間違えてしまいました。
最初の質問で間違えなく、
Dim wbbb As Workbook
For Each wbbb In Workbooks
If wbbb.Name <> "A.xlsm" Then
wbbb.Saved = True
wbbb.Close
End If
Next
です。
"A.xlsm"の中にコードを記述しています。
うまくいかず
そのたびファイル名を変えて実行していました。
申し訳ございません。
 
 
 また、
Cancel = True
は、なんのおまじないですか?
 
"A.xlsm"を開き Userform1が開き
Userform1をアクティブにするためです。
間違えていましたらすみません。
 
 
 

回答
投稿日時: 21/12/01 13:39:38
投稿者: WinArrow
投稿者のウェブサイトに移動

初心者VBA大好き さんの引用:

ありがとうございます。
うまくいきました。
助かりました。
 Workbooks("test.xlsm").Windows(1).Visible = False

このコードは、シートが複数ある時は
有効ですが、シートが1つしかないときは、エラーになります。
 
シートの個数に関係なく、当該ブックを非表示にするばあいは、
Windows("xx.xlsm").Visible = False
を使います。

投稿日時: 21/12/01 13:41:30
投稿者: 初心者VBA大好き

ありがとうございます。
たすかります。

回答
投稿日時: 21/12/01 14:19:32
投稿者: Suzu

念のため。
 
1: Application.Visible = False
と、
2: Windows(〜).Visible = False
 
の挙動は違いますよ。
 
2:は、
Application.Windows(〜).Visible = False
の省略形です。
 
1 は、Excel アプリケーション 自体を非表示にしています。
 
コマンドボタン 3 を押した後、
 1 は、Excel の アプリケーション ウィンド が残りません。
 2 は、Excel の アプリケーション ウィンド が残ります。 (ブック(シート)が表示されていない)
 
どちらも、当該ブックは見えない様になります。
 
 
1は
 ユーザーーフォームだけが表示されている様に見えます。
 他のワークブック も 非表示にしています。
 なので、ユーザーフォームを閉じると、他のブックも見えなくなります。
 見えなくなっただけで、プロセスとしては残っています。(タスクマネージャーで確認できます)
 
 プロセスが残っているので、
 この状態から、エクスプローラー等から Excel のブックをダブルクリックで開こうとしても
 Excel ウィンドが非表示になっているので、開かない 様に見えてしまいます。
 
 さらに、エクスプローラー から ブックをダブルクリックする事で、可視化され、見える様になります。
 
 フォームが閉じる時に、Application.Visible = True にする事で、
 アプリケーションウィンドを可視化するのが常套手段です。
 
 これをしないと 非表示ブックあるとき、ウィンドウズを終了する時に、
 保存するか旨のメッセージダイアログが出てくるはずです。
 
 
2 は、Excel アプリケーション 内 の特定のブックのウィンドを非表示にしています。
  Excelアプリケーションの ウィンドは表示されています。
  この状態から、エクスプローラー で、他のブックを開いても、きちんと表示されます。

回答
投稿日時: 21/12/01 15:00:05
投稿者: WinArrow
投稿者のウェブサイトに移動

WinArrow さんの引用:
初心者VBA大好き さんの引用:

ありがとうございます。
うまくいきました。
助かりました。
 Workbooks("test.xlsm").Windows(1).Visible = False

このコードは、シートが複数ある時は
有効ですが、シートが1つしかないときは、エラーになります。
 
シートの個数に関係なく、当該ブックを非表示にするばあいは、
Windows("xx.xlsm").Visible = False
を使います。

 
> Workbooks("test.xlsm").Windows(1).Visible = False

 Workbooks("test.xlsm").Sheets(1).Visible = False
と、勘違いしていました。
 
Workbooks("test.xlsm").Windows(1).Visible = False

Windows("test.xlsm").Visible = False
は、同じです。
 
申し訳ありません。
 
 

投稿日時: 21/12/01 15:09:56
投稿者: 初心者VBA大好き

とんでもないです。
こちらこそよろしくお願いします

投稿日時: 21/12/01 17:43:46
投稿者: 初心者VBA大好き

とても参考になりました。
今後質問するとときは
きちんと、まとめて
質問いたします。
ありがとうございました。