Excel (VBA)

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

 
(Windows 11 Home : Excel 2016)
保存時にモジュールを全て消して保存
投稿日時: 24/04/21 21:50:06
投稿者: shimoichimabu

1)親ファイルの或るシートの複製し、
 Sheets(ActiveSheet.Name).Copy
 
2)この複製したブックはデスクトップに保存(.xlsxで)し、
 Application.DisplayAlerts = False
   ActiveWorkbook.SaveAs Filename:=DeskTopアドレス & "\顧客名.xlsx"
 Application.DisplayAlerts = True
 
3)親ブックは閉じる
 Workbooks(親Book名).Close SaveChanges:=True '親ブックを保存して、閉じる
 
この状態では複製したブックのシートモジュールは残っています。.xlsxで保存したせいか?標準モジュールは消えています。
ここで、エンターキーを押すと、閉じた筈の親ブックが起動し、マクロが実行されます。
そこで、デスクトップに保存した複製ファイルを一旦、閉じ、開くと、シートモジュールは消えており、エンターキーを押しても上記現象は起こりませんでした。
解決策としては、複製したブックをデスクトップに保存→すぐ閉じる→また、開く
といった工程を付け加えれば、いいだけのことですが、保存時にマクロを全て消して保存するコマンドはないでしようか?
 
以下はエンターキーを押したときに実行されるコードです。
 
Private Sub worksheet_activate()
    Application.OnKey "~", "商品表示PRG"
    Application.OnKey "{ENTER}", "商品表示PRG"
End Sub
 
 
Private Sub Workbook_Open() 'ThisWowkbookに記載
 Application.OnKey "~", "商品表示PRG"
 Application.OnKey "{ENTER}", "商品表示PRG"
 Sheets(親シート名).Select
ActiveCell.Select
                         
End Sub

回答
投稿日時: 24/04/21 22:37:15
投稿者: WinArrow

>この状態では複製したブックのシートモジュールは残っています。
  
この状態をどのように確認しましたか?
  
また、手操作でも同じ症状になりますか?
 
複写したシートに図形などがあり、その図形にマクロ登録していませんか?

回答
投稿日時: 24/04/22 07:06:25
投稿者: simple

マクロがあるブックを .xlsxで保存するのは動作不良を起こしますのでやめたほうがよいでしょう。
Application.DisplayAlerts = False
をコメントアウトして、表示される警告をよく読んで下さい。
また、きちんとファイルフォーマット(xlOpenXMLWorkbookに)を指定したほうがよいでしょう。
基本なので、SaveAsメソッドのヘルプをよく読んで下さい。
 
シートコピーではなく、シートのセルのコピーにすれば、マクロコードは排除できます。

Sub test()
    Dim wb As Workbook
    Dim cnt As Long
    
    'Sheetが一つのブックを新規作成
    cnt = Application.SheetsInNewWorkbook
    Application.SheetsInNewWorkbook = 1
    Set wb = Workbooks.Add
    Application.SheetsInNewWorkbook = cnt
    
    '最初のシートのセルをコピーペイスト
    ThisWorkbook.ActiveSheet.Cells.Copy wb.Worksheets(1).[A1]
    wb.SaveAs Filename:="test.xlsx", FileFormat:=xlOpenXMLWorkbook
    ThisWorkbook.Close SaveChanges:=True
End Sub
(保存ブックのパス名はそちらで修正してください)
 
# ちなみに、
# Sheets(ActiveSheet.Name).Copy は
# Activesheet.Copyですし、(冗談で例に挙げることがありましたが、驚きです。)
# Workbooks(親Book名).Close SaveChanges:=True
# は、ThisWorkbookを使ったほうが明確かと思います。
# オブジェクトはできるだけそのまま使用したほうが綺麗でしょう。
# なんでも名前で指定するのは、さすがに卒業されたほうがよいのではないですか。
 
マクロでマクロコードを消すことも可能ですが、そうしたことはされないほうがよいです。
安全なことを確実にされたほうが良いと思います。

回答
投稿日時: 24/04/22 11:57:20
投稿者: gombohori

 Application.OnKey "{ENTER}", "商品表示PRG"
 が有効なままだから

回答
投稿日時: 24/04/22 13:15:01
投稿者: Suzu

Private Sub worksheet_activate()
こちらは、ワークシートのクラスモジュールに記載されるプロシージャ
 
 
Sheets(ActiveSheet.Name).Copy の段階で
対象たる ActiceSheet に 前述の クラスモジュールのプロシージャも含まれるのであれば
それらのプロシージャも同時にコピーされます。
 
Sheet クラスなのですから 当然と言えば当然かと。
 
 
手動でも、前述のプロシージャが含まれるシートを新規ブックにxlsx で保存しても
保存段階では、プロシージャは消去されません。
 
一度閉じれば、それらのプロシージャは破棄される事になり
開きなおした段階では、クラスモジュールプロシージャは含まれない状態になります。
 
 

引用:
保存時にマクロを全て消して保存するコマンドはないでしようか?

単体コマンドはありません。
 
VBComponents
https://docs.microsoft.com/ja-jp/office/vba/language/reference/visual-basic-add-in-model/properties-visual-basic-add-in-model#vbcomponents
を使えば、書き換える事はできるでしょうけど。

投稿日時: 24/04/22 20:47:05
投稿者: shimoichimabu

多くの回答いただき、ありがとうございます。
 
>この状態をどのように確認しましたか?
  ALT+F11 → 左上のシートモジュールを確認しました。
>また、手操作でも同じ症状になりますか?
そうです。
  
>複写したシートに図形などがあり、その図形にマクロ登録していませんか?
登録はしていません。
 
simpleさんには、色々基本的ななことを教わりありがとうございます。
>最初のシートのセルをコピーペイスト
この方法が間違いないですね。
 
VBComponentsでマクロを削除できるのですね。
 
デスクトップに保存した複製ファイルを手作業で一旦、閉じ、開くと、シートモジュールは消えており、エンターキーを押しても上記現象は起こりませんでした。
このことから、これをマクロで再現してみました。
 
ActiveWorkbook.SaveAs Filename:=DeskTopアドレス & "\顧客名.xlsx"
     ↓
ActiveWorkbook.Close  一旦、閉じる   
     ↓
Workbooks.Open Filename:=保存ファイルPath & "\" & 保存ファイル名
デスクトップに保存したファイルを直ぐに開く
     ↓
親ブックは閉じる
 
この時点で手作業の時と同様にシートモジュールは消えていました。
ここでエンターキーを押すと、親ファイルが起動して、マクロが実行されます。
不思議です。手作業では問題なかったのに、同じ工程をマクロで実行すると、問題が出てきます。
なぜでしようか?
 

回答
投稿日時: 24/04/23 09:13:39
投稿者: Suzu

Excel2019
 

クラスモジュール
Private Sub Worksheet_Activate()
  MsgBox "AA"
End Sub

標準モジュール
Sub TEST()
  ThisWorkbook.Worksheets("Sheet1").Copy

  Application.DisplayAlerts = False
  ActiveWorkbook.SaveAs "C:\DATA\TEST.xlsx", xlOpenXMLWorkbook
  Application.DisplayAlerts = True

  ActiveWorkbook.Close False
  Workbooks.Open "C:\DATA\TEST.xlsx"

  ThisWorkbook.Close False
End Sub

 
では、確認できませんでした。
WorkBook_Openまでは確認していません。
 
 
再現ファイルをコピーし
各モジュールについて、コメントアウト等を行い
再現する条件を探り、その条件が揃わない方法を探しましょう。

回答
投稿日時: 24/04/23 09:32:19
投稿者: MMYS

shimoichimabu さんの引用:

なぜでしようか?

当然の動作です。なぜなら
    Application.OnKey
ApplicationはExcel本体です。つまりExcel本体を閉じないかぎり、OnKeyは有効の状態です。
 
1.マクロブックてOnkeyを設定
2.Excelを閉じずに、保存したファイルを開く
3.マクロブックを閉じる。
 
これでは、Excel本体ににOnKey設定は残ってますから、OnKey設定は有効のままです。Onkeyは有効ですから、Excelはマクロブックを強制的に開いてマクロを実行します。
 
マクロブックを閉じる際、OnKey設定をクリアしましょう。
 
 
なお、VBComponents はセキュリティの観点からお勧めできません。
 
 

投稿日時: 24/04/23 14:20:23
投稿者: shimoichimabu

Suzuさん、MMYSさん回答ありがとうございます。
 
>ApplicationはExcel本体です。つまりExcel本体を閉じないかぎり、OnKeyは有効の状態です。
ただ、下記コードが最後まで(A)進んで終了した時点で、sheets("見積書")シートでエンターキーを
押すと、ご指摘のように、親ブックが起動して、マクロが自動実行されます。
Sub Macro1()
 
ThisWorkbook.Worksheets("見積書").Copy
 
  Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs "E:\TEST.xlsx", xlOpenXMLWorkbook
  Application.DisplayAlerts = True ・・・@
 
  ActiveWorkbook.Close False
  Workbooks.Open "E:\TEST.xlsx"
 
  ThisWorkbook.Close False・・・A
 
End Sub
 
しかし、@で一旦プログラムを終了し、この後は手動で親ブックを閉じ、sheets("見積書")シートでエンターキーを押した場合、マクロも実行されず、親ブックも起動しません。
尚、見積書シートのシートモジュールは下記の通り、残っています。
Private Sub Worksheet_Activate()
    Application.OnKey "~", "商品表示PRG"
    Application.OnKey "{ENTER}", "商品表示PRG"
End Sub
 
コードを全て実行した場合「Aまで」と途中から手作業で操作した場合で、挙動が異なります。
TEST.xlsxは開いたままで、EXCEL自体は閉じていないのに・・・。

回答
投稿日時: 24/04/24 09:13:49
投稿者: Suzu

引用:
@で一旦プログラムを終了し、この後は手動で親ブックを閉じ、sheets("見積書")シートでエンターキーを押した場合、マクロも実行されず、親ブックも起動しません。
尚、見積書シートのシートモジュールは下記の通り、残っています。

 
 
当方環境 Excel 2019 では
1 でも 2 でも、TEST.xlsx 上で Enter を押すと 商品表示PRG が 実行されます。
 
おっしゃる様に、Application を閉じていないのですから
当方としては、当然 の挙動 を示している としか 思えません。
 
ご質問の様な挙動であれば なぜ? とは思いますが。
 
何にしても 先にも述べた通り その発生条件は何なのか きちんと考えましたか?
なぜ 発生するのか 考えれば 回避策は見えるはずです。
 
Application.OnKey を解除すれば済むのでは?
 
 
そもそも、OnKey で マクロを呼び出す のは 操作環境 全てに影響を与える行為であり
一般的には、それを、防ぐ目的で、特殊なキー に設定します。
 
それを、よく使用する Enter に 設定 するのですから、
その影響についても きちんと考慮・検証が必要と思います。
  (その検証を省く意味でも、特殊キーに設定する)

投稿日時: 24/04/24 22:05:50
投稿者: shimoichimabu

Suzuさん回答ありがとうございます。
 
>1 でも 2 でも、TEST.xlsx 上で Enter を押すと 商品表示PRG が 実行されます。
うーん、そういう結果が出たのですね。
本来はこの結果が正しいと思います。
 
もう少し、こちらでも検証してみます。
一旦、閉じます。
色々とお世話になりました。