概要
日付形式ファイル保存マクロ を改造して、現在の設定の拡張子を自動的に付加するようにしたマクロです。
現在の日付から作成されたファイル名で保存できます。メニューから拡張子を選択できるようにしました。 Visual Basic なので拡張子 .vbee で保存する必要があります。
ダウンロード
-
version 0.04
- datesave04.zip
- 「年」2ケタに対応する「yy」を追加しました
- datesave04.zip
コメント
- ご意見・ご感想・ご要望 何かあればどぞー -- Nanasiya
- version 0.01 にはバグがあったので修正しました。ダウンロードされた方は差し替えをお願いします。 -- Nanasiya
- 乙。ファイル名はひとつでいいから、逆に拡張子を選べるようにしてほしいな。 --
- 拡張子をトップメニューにできるようにしました。ExtTopMenu を1にしてみてください。 -- Nanasiya
- 日付をyyで取得できませんか? --
- 「年」2ケタって事ですよね? 追加してみました。「yyyy」の方が優先されます。 -- Nanasiya
- ありがとうございました -- yyのお願いをした人
コード
'**** ' 日付形式ファイル保存マクロ(拡張子自動判別) version 0.04 ' Created by Nanasiya ' ' 改造・再配布等、ご自由にご利用ください。 '**** Option Explicit Dim DefaultExt, Dir, AskBefore, FormatList, ExtTopMenu, QuickSave '*** 設定ここから *** ' デフォルトの拡張子リスト DefaultExt = Array( _ ".txt", _ "" _ ) ' 保存先のフォルダ ("C:\Temp" など) Dir = "" ' 保存する前に確認するか(確認する=1, 確認しない=0) AskBefore = 1 ' 使用するファイル名のフォーマットリスト FormatList = Array( _ "yyyymmdd", _ "yymmdd", _ "yyyy-mm-dd", _ "yyyy年mm月dd日", _ "yyyymmddhhMMss", _ "yyyy年mm月dd日hh時MM分ss秒" _ ) ' フォーマット選択がトップメニュー = 0 ' 拡張子選択がトップメニュー = 1 ExtTopMenu = 0 ' クイックセーブするか(する=1, しない=0) ' FormatList の最初のフォーマット、検出された最初の拡張子が使われます QuickSave = 0 '*** 設定ここまで *** '--- 以下メイン処理 --- Dim Shell, FSO Dim ExtList, Base, Ext, I Set Shell = CreateObject("WScript.Shell") Set FSO = CreateObject("Scripting.FileSystemObject") If Dir = "" Or Not FSO.FolderExists(Dir) Then Dir = Shell.SpecialFolders("MyDocuments") End If For I = LBound(FormatList) To UBound(FormatList) FormatList(I) = FormatFileName( FormatList(I) ) Next Base = FormatList(0) ExtList = GetConfigExtensions(document.ConfigName, DefaultExt) Ext = ExtList(0) ' メニューループ If QuickSave = 0 Then Dim Menu, Sel Do Set Menu = BuildMenu(FormatList, ExtList, Base, Ext) Sel = Menu.Track(0) - 1 If Sel = -1 Then Quit ElseIf Sel <= UBound(FormatList) Then Base = FormatList(Sel) If ExtTopMenu = 0 Then Exit Do Else Ext = ExtList(Sel - UBound(FormatList) - 1) If ExtTopMenu <> 0 Then Exit Do End If Loop End If ' 保存処理 Dim FileName FileName = FSO.BuildPath(Dir, Base & Ext) If AskBefore <> 0 Then If Not confirm("以下で保存します。よろしいですか?" _ & vbCrLf & vbCrLf & FileName) _ Then Quit End If If FSO.FileExists(FileName) Then If Not confirm("同名のファイルが存在します。上書きしますか?" _ & vbCrLf & vbCrLf & FileName) _ Then Quit End If document.Save(FileName) '--- 以下サブルーチン --- ' ファイル名を日時でフォーマット Function FormatFileName(ByVal Format) Dim Current, FileName Current = Now FileName = Format FileName = Replace(FileName, "yyyy", ZeroPad(Year(Current))) FileName = Replace(FileName, "yy", ZeroPad(Year(Current) mod 100)) FileName = Replace(FileName, "mm", ZeroPad(Month(Current))) FileName = Replace(FileName, "dd", ZeroPad(Day(Current))) FileName = Replace(FileName, "hh", ZeroPad(Hour(Current))) FileName = Replace(FileName, "MM", ZeroPad(Minute(Current))) FileName = Replace(FileName, "ss", ZeroPad(Second(Current))) FormatFileName = FileName End Function ' 2桁のゼロ埋め Function ZeroPad(ByVal Num) ZeroPad = CStr(Num) If Len(ZeroPad) < 2 Then ZeroPad = "0" & ZeroPad End Function ' メニュー作成 Function BuildMenu(ByRef FormatList, ByRef ExtList, ByVal Base, ByVal Ext) Dim TopMenu, SubMenu Set TopMenu = CreatePopupMenu Set SubMenu = CreatePopupMenu If ExtTopMenu <> 0 Then BuildExtMenu TopMenu, ExtList, Ext, UBound(FormatList) + 2 BuildFormatMenu SubMenu, FormatList, Base, Ext, 1 TopMenu.Add "", 0, eeMenuSeparator TopMenu.AddPopup "ファイル名(&F) " & Base & Ext, SubMenu Else BuildFormatMenu TopMenu, FormatList, Base, Ext, 1 BuildExtMenu SubMenu, ExtList, Ext, UBound(FormatList) + 2 TopMenu.Add "", 0, eeMenuSeparator TopMenu.AddPopup "拡張子(&E) " & Ext, SubMenu End If TopMenu.Add "", 0, eeMenuSeparator TopMenu.Add "キャンセル(&C)", 0 Set BuildMenu = TopMenu End Function ' フォーマットリストのメニュー作成 Sub BuildFormatMenu(ByRef Menu, ByRef FormatList, ByRef Base, ByRef Ext, ByVal StartIndex) Dim I, Flag For I = LBound(FormatList) To UBound(FormatList) If ExtTopMenu <> 0 And FormatList(I) = Base Then Flag = eeMenuChecked Else Flag = 0 Menu.Add "&" & I & " " & FormatList(I) & Ext, I + StartIndex, Flag Next End Sub ' 拡張子リストのメニュー作成 Sub BuildExtMenu(ByRef Menu, ByRef ExtList, ByRef Ext, ByVal StartIndex) Dim I, Flag For I = LBound(ExtList) To UBound(ExtList) If ExtTopMenu = 0 And ExtList(I) = Ext Then Flag = eeMenuChecked Else Flag = 0 Menu.Add "&" & I & " " & ExtList(I), I + StartIndex, Flag Next End Sub ' バイト配列 Arr の From から4バイトを Integer にして返す Function ReadInteger(ByRef Arr, ByVal From) Dim I ReadInteger = 0 For I = 0 To 3 ReadInteger = ReadInteger + Arr(I+From) * 256^I Next End Function ' バイト配列 Arr の From から Length の長さの Unicode 文字列を String にして返す Function ReadWString(ByRef Arr, ByVal From, ByVal Length) Dim I, W ReadWString = "" For I = 0 To Length-1 W = Arr(From + I*2) W = W + Arr(From + I*2 + 1) * 256 ReadWString = ReadWString & ChrW(W) Next End Function ' ConfigName の設定に関連付けられている拡張子リストを取得する Function GetConfigExtensions(ByVal ConfigName, ByVal DefaultExt) Dim Path, Arr, Count, I, Index, Length, Ext() Path = "HKCU\Software\EmSoft\EmEditor v3\Config\" & ConfigName & "\Assoc" Set Shell = CreateObject("WScript.Shell") Arr = Shell.RegRead(Path) Count = ReadInteger(Arr, 5) ' 拡張子の数 5byte目から If Count <= 0 Then GetConfigExtensions = DefaultExt Exit Function End If ReDim Ext(Count-1) Index = 9 For I = 0 To Count-1 If Arr(Index) <> 1 Then Exit For Index = Index + 1 Length = ReadInteger(Arr, Index) Ext(I) = "." & LCase(ReadWString(Arr, Index+4, Length)) Index = Index + 4 + Length * 2 Next ' 動的配列→Variant配列変換 Dim Code, S Code = "Array(" For Each S In Ext If S <> "" Then If Code <> "Array(" Then Code = Code & "," Code = Code & """" & S & """" DefaultExt = Filter(DefaultExt, S, False, 1) End If Next For Each S In DefaultExt If Code <> "Array(" Then Code = Code & "," Code = Code & """" & S & """" Next Code = Code & ")" GetConfigExtensions = Eval(Code) End Function
Changelog
-
Version 0.04
- 「年」2ケタに対応する「yy」を追加しました
-
Version 0.03
- デフォルト拡張子を複数設定できるようにしました
- ExtTopMenu オプションを作成してトップメニューを選択できるようにしました
- クイックセーブオプションを作成しました
添付ファイル