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

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

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

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

Q&A

解決済

1回答

1999閲覧

saveメソッドを使うとbeforesave内のvisibleプロパティがうまく機能しない

Tetsuya3456

総合スコア22

VBA

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

0グッド

0クリップ

投稿2020/07/03 12:36

こんにちは。

現在ユーザーに常にマクロを起動して開いてほしいファイルがありまして、下記のコードを記述しダミーシートをオンにしないと作業シートを開けないようにしています。

【ファイルA.xlsm】

Dim temsheet As Worksheet Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.ScreenUpdating = False '全シート表示 For Each temsheet In ThisWorkbook.Worksheets temsheet.Visible = True Next 'ダミーシートのみ表示 For Each temsheet In ThisWorkbook.Worksheets If Not temsheet.Name = "ダミーシート" Then temsheet.Visible = False End If Next Application.ScreenUpdating = True End Sub Private Sub Workbook_AfterSave(ByVal Success As Boolean) Application.ScreenUpdating = False '全シート表示 For Each temsheet In ThisWorkbook.Worksheets temsheet.Visible = True Next '作業シート以外は非表示 For Each temsheet In ThisWorkbook.Worksheets If temsheet.Name = "ダミーシート" Then temsheet.Visible = False End If Next ThisWorkbook.Saved = True Application.ScreenUpdating = True End Sub Private Sub Workbook_Open() Application.ScreenUpdating = False '全シート表示 For Each temsheet In ThisWorkbook.Worksheets temsheet.Visible = True Next '作業シート以外は非表示 For Each temsheet In ThisWorkbook.Worksheets If temsheet.Name = "ダミーシート" Then temsheet.Visible = False End If Next Application.ScreenUpdating = True End Sub

この記述のあるファイルを別のファイルから下記のようなコードイメージでいじっているんですが、Workbook_BeforeSaveイベント内の処理がうまく機能しません。具体的には、visibleプロパティがうまく代入されていないようです。

【ブックB.xlsm】
※コードイメージです。

Sub test() Workbooks.Open "~\Aファイル.xlsm" Workbooks("Aファイル.xlsm").ActiveSheet.Range("A1") = 1 Workbooks("Aファイル.xlsm").Save End Sub

Workbook_OpenイベントとWorkbook_AfterSaveイベントはうまく機能しています。

原因を色々調べてみたのですが、全くわからずもし解決策が分かる方がいらっしゃいましたらご教授頂けると嬉しいです。

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

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

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

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

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

kenshirou

2020/07/04 06:49

保存前イベント(Workbook_BeforeSave)でダミーシートを表示させ、保存後(Workbook_AfterSave)でダミーシートを非表示にしたい理由は何でしょうか? それとも、今回はWorkbook_AfterSaveの動作は無視していいのでしょうか?
Tetsuya3456

2020/07/04 07:06 編集

ご質問ありがとうございます! 保存前に作業シートを非表示にしダミーシートのみを表示させたい理由は、次回エクセルファイルを開く際に「コンテンツの有効化」をオン(マクロを起動)にしないと実際に使用する作業シートが出てこないようにしたかったからです。 実際にはダミーシートには「コンテンツの有効化をオンにしてください。」というメッセージを記入しております。 保存後にAfterSaveにて作業シートのみを表示させているのは、保存後もそのまま閉じず、作業シートを継続して利用する場面が多々あるからです。 ただ、Workbook_OpenイベントとWorkbook_AfterSaveイベントの動作は無視していただいて大丈夫です。
radames1000

2020/07/06 02:21 編集

特に問題なく動いているように思えます。 一度コンテンツの有効化をしたためそれ以降は有効化を求められず、 Workbook_Openが正常に動いています。 「コンテンツの有効化」が求められる状況では、 意図通り「ダミーシート」のみ表示されていました。 うまくいかないと思われる状況をもう少し詳しく教えていただけないでしょうか。 ⇒kenshirouさんの回答によると現象が再現するようですね。失礼しました。
Tetsuya3456

2020/07/06 11:23

ご回答いただきありがとうございます! 内容がわかりづらくなってしまい、大変申し訳ありませんでしたm(__)m
guest

回答1

0

ベストアンサー

確かに、外部からのSave実行では、対象WorkbookのBeforeSaveイベント内でのWorkSheetのVisible設定がうまくいかないようです。
(自分自身で保存を行う場合にはこれが発生しないようなので、おそらく対象WorkBookがアクティブになるタイミング等が影響しているのかも知れません。コンテンツの有効化を聞かれる場合は、すでに対象WorkBookがアクティブになっているでしょうから、問題は発生しないのかも知れません。ただし、詳細は不明です。)

それならば、対象WorkBook内にSave用のPublicなメソッドを用意し、この中でBeforeSaveイベントの内容と自身のSaveを行えば、確実にSave実行前にWorkSheetのVisible設定が行われます。
以下は、上記PublicなメソッドをSaveTest()という名前にして、これを対象WorkbookのThisWorkbook内に書いた例です。

VBA

1'''"Aファイル.xlsm"のThisWorkbook内 2Public Sub SaveTest() 3 ThisWorkbook.Activate 4 Application.ScreenUpdating = False 5 6 '全シート表示 7 For Each temsheet In ThisWorkbook.Worksheets 8 temsheet.Visible = True 9 Next 10 11 'ダミーシートのみ表示 12 For Each temsheet In ThisWorkbook.Worksheets 13 If Not temsheet.Name = "ダミーシート" Then 14 temsheet.Visible = False 15 End If 16 Next 17 18 Application.ScreenUpdating = True 19 20 ThisWorkbook.Save 'これ以外はWorkbook_BeforeSaveと同じ 21End Sub 22 23'''呼び出し側 24 '以下の方法でもいいが、通常はWorkbookの実体を変数で受け取った方がスッキリする。 25 'Workbooks.Open "~\Aファイル.xlsm" 26 'Workbooks("Aファイル.xlsm").Activate 27 'Workbooks("Aファイル.xlsm").ActiveSheet.Range("A1") = 1 28 'Workbooks("Aファイル.xlsm").SaveTest 29 30 Dim w As Workbook 31 Set w = Workbooks.Open("~\Aファイル.xlsm") 32 w.ActiveSheet.Range("A1") = 1 33 w.SaveTest 34

投稿2020/07/06 02:14

kenshirou

総合スコア772

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

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

Tetsuya3456

2020/07/06 11:27

実際に試して頂き、ありがとうございます! また、解決策となるコードも提示していただき本当にありがとうございますm(__)m 提示していただいたコードをもとに、呼び出し側にてシートの表示・非表示を命令することでうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問