- ベストアンサー
エクセルで<名前をつけて保存>するマクロに、保存時マクロを含めて保存させることは可能ですか
エクセル、マクロとも初心者です。 (VBAはわかりません) エクセルのテンプレートファイルを開いて、必要箇所だけ入力すると、その日の日付をファイル名として、<名前を付けて保存する>ようなマクロを作りました。 このままだと、マクロも一緒に保存されてしまいますよね。 マクロを含まずに、<名前を付けて保存>させるマクロって可能ですか? できるとしたら、どうやればいいでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 今は(Excel 2002以上)は、直接、VBEditor 側にアクセスするコードはセキュリティの関係で嫌われることもあります。Excel 2007 の場合は、拡張子で分別できますから、マクロは切り落とされます。今回は、テンプレートということで、あえて、このようなコードになるのであって、本来は、アドインなどで処理したほうが良いかもしれません。アドインの場合は、ThisWorkbook をActiveWorkbook にすればよいはずです。 シートモジュールにマクロがある場合は、 sh.Copy After:=wb.Sheets(wb.Worksheets.Count) と、その下の行のコメントブロックとを切り替えてください。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim shCnt As Integer Dim wb As Workbook Dim i As Integer Dim sh As Worksheet Dim nSh As Worksheet Dim fName As String If Not ThisWorkbook.Name Like "*.x?t" Then Cancel = True fName = ThisWorkbook.Name fName = Left$(fName, Len(fName) - 1) shCnt = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 Set wb = Workbooks.Add wb.Worksheets(1).Name = "temp" Application.ScreenUpdating = False For Each sh In ThisWorkbook.Sheets sh.Copy After:=wb.Sheets(wb.Worksheets.Count) ''シートモジュールマクロがある場合(上のコード切り替えすること) 'Set nSh = wb.Sheets.Add(After:=wb.Sheets(wb.Worksheets.Count)) 'nSh.Name = sh.Name 'sh.Cells.Copy nSh.Cells(1, 1) Next sh wb.Sheets(1).Activate Application.ScreenUpdating = True Application.DisplayAlerts = False wb.Worksheets(1).Delete Application.DisplayAlerts = True Application.SheetsInNewWorkbook = shCnt ChDir Application.DefaultFilePath i = 1 '同名ファイルを探す Do Until Dir(fName & i & ".xls") = "" i = i + 1 Loop fName = fName & i & ".xls" Application.Dialogs(xlDialogSaveAs).Show fName, 1 ThisWorkbook.Close False Set wb = Nothing End If End Sub #3さんのご指摘のマクロですが、マイクロソフトの定義(プログラマーズガイド)からすると、今回のイベント型は、マクロと呼ばないそうです。マクロは、引数を持たないパブリックなSub プロシージャのことだけを指しますので、除外されます。しかし、多くの方は、あまり、これについては、明言は避けているようです。理由は、マクロそのものの意味が、ミクロの反対で、全体のひとつのタスクを指すから、厳密な意味を持たせると、言葉としての原義と離れてしまうように思います。
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
こんなマクロでもできそうです Sub Macro1() Dim ws As Worksheet Set ws = ActiveSheet '元々開いていたシートを退避 Worksheets.Copy '全てのワークシートを新しいブックにコピー ActiveWorkbook.SaveAs "C:\Temp\" & Format(Date, "YYYYMMDD") & ".xls" '新しいブックを日付をファイル名にして新規保存 ActiveWorkbook.Close '新しいブックを閉じる ws.Activate '元々開いていたシートを表示 End Sub なおマクロとはVBAで記述した「処理の固まり」ですからマクロ≒VBAですよ
お礼
zap35さま ご回答ありがとうございました。 教えてくださったマクロ、試してみます。 お礼を一度投稿したはずなんですが、 反映されていないので、もう一度・・・ 不慣れなので、重複していたらごめんなさい。
- kmmk16
- ベストアンサー率46% (32/69)
ThisWorkBookに下のコード貼り付けてください。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim myMacro As Object For Each myMacro In ThisWorkbook.VBProject.VBComponents With myMacro If .Type = 100 Then .CodeModule.DeleteLines 1, .CodeModule.CountOfLines Else Application.VBE.activeVBProject.VBComponents.Remove myMacro End If End With Next myMacro End Sub 使用するときは、(マクロ・セキュリティ)の(Visual Basic Projectへのアクセスを信頼する)にチェックを入れてください
お礼
kmmk16さま 早々にご回答をありがとうございました。 4名の方全員にどうしてポイントをつけられないのでしょうか。 ポイントなしになってしまって申し訳ありません。 教えてくださったこと、試してみます。 感謝! ご回答ありがとうございました。 試してみます。
- hana-hana3
- ベストアンサー率31% (4940/15541)
ワークシートを新しいブックにコピーして保存します。
お礼
hana-hana3さま 早々にご回答をありがとうございました。 ポイントなしになってしまって申し訳ありません。 感謝しております!
補足
回答ありがとうございます。 いまさらですが、 質問タイトルを間違えてしまいました(ドジ・・) 保存するときに、マクロを含めずに保存させる、というマクロは作成できますか? というのが質問の趣旨です。混乱させてゴメンナサイ。 なぜこんなマクロが必要かと言うと、 超初心者がファイルを扱うので、上書きされないよう、自動で新規保存させたいためなんです。 その時にマクロをのぞいて自動保存できたらいいな、と思ったものですから・・・
お礼
Wendy02さま ご回答ありがとうございました。 勉強不足で、みなさんの指導内容についていけない面もありますが、 教えていただいたことをこれからゆっくり試してみます。