• ベストアンサー

エクセルで<名前をつけて保存>するマクロに、保存時マクロを含めて保存させることは可能ですか

エクセル、マクロとも初心者です。 (VBAはわかりません) エクセルのテンプレートファイルを開いて、必要箇所だけ入力すると、その日の日付をファイル名として、<名前を付けて保存する>ようなマクロを作りました。 このままだと、マクロも一緒に保存されてしまいますよね。 マクロを含まずに、<名前を付けて保存>させるマクロって可能ですか? できるとしたら、どうやればいいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 プロシージャのことだけを指しますので、除外されます。しかし、多くの方は、あまり、これについては、明言は避けているようです。理由は、マクロそのものの意味が、ミクロの反対で、全体のひとつのタスクを指すから、厳密な意味を持たせると、言葉としての原義と離れてしまうように思います。

letmebe
質問者

お礼

Wendy02さま ご回答ありがとうございました。 勉強不足で、みなさんの指導内容についていけない面もありますが、 教えていただいたことをこれからゆっくり試してみます。

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

こんなマクロでもできそうです 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ですよ

letmebe
質問者

お礼

zap35さま ご回答ありがとうございました。 教えてくださったマクロ、試してみます。 お礼を一度投稿したはずなんですが、 反映されていないので、もう一度・・・ 不慣れなので、重複していたらごめんなさい。

  • kmmk16
  • ベストアンサー率46% (32/69)
回答No.2

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へのアクセスを信頼する)にチェックを入れてください

letmebe
質問者

お礼

kmmk16さま 早々にご回答をありがとうございました。 4名の方全員にどうしてポイントをつけられないのでしょうか。 ポイントなしになってしまって申し訳ありません。 教えてくださったこと、試してみます。 感謝! ご回答ありがとうございました。 試してみます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

ワークシートを新しいブックにコピーして保存します。

letmebe
質問者

お礼

hana-hana3さま 早々にご回答をありがとうございました。 ポイントなしになってしまって申し訳ありません。 感謝しております!

letmebe
質問者

補足

回答ありがとうございます。 いまさらですが、 質問タイトルを間違えてしまいました(ドジ・・) 保存するときに、マクロを含めずに保存させる、というマクロは作成できますか? というのが質問の趣旨です。混乱させてゴメンナサイ。 なぜこんなマクロが必要かと言うと、 超初心者がファイルを扱うので、上書きされないよう、自動で新規保存させたいためなんです。 その時にマクロをのぞいて自動保存できたらいいな、と思ったものですから・・・

関連するQ&A