EmEditorみんなでまとめサイト

日付形式ファイル保存マクロ(拡張子自動判別)

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

概要

日付形式ファイル保存マクロ を改造して、現在の設定の拡張子を自動的に付加するようにしたマクロです。

現在の日付から作成されたファイル名で保存できます。メニューから拡張子を選択できるようにしました。 Visual Basic なので拡張子 .vbee で保存する必要があります。

ダウンロード

  • version 0.04
    • datesave04.zip
      • 「年」2ケタに対応する「yy」を追加しました

コメント

  • ご意見・ご感想・ご要望 何かあればどぞー -- 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 オプションを作成してトップメニューを選択できるようにしました
    • クイックセーブオプションを作成しました

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

添付ファイル
目安箱バナー