業務効率化

PAD:開いたフォルダから指定ファイル開く

PADによる開いたフォルダからkeywordがファイル名に入ったファイルを開くマクロです。

記事の内容

・挙動

・コード

・ポイント機能

・挙動

今回は指定フォルダ名に2026年という文字が入っている場合に、その中にある2026年~というファイルを開きたいとします。

まず、フロー戦闘でFolder変数に指定のフォルダパスを入れます。今回はDynamicTestFolderとしていますが、他のフローで取得した動的なパスや使用するパスを指定してください。

2では指定フォルダ内のファイルをリストとして取得します。これによりその後のループによる指定ファイル操作が可能です。

ValToCheckFileでは、その文字がファイル名に含まれていれば開きたい用のキーワードを指定します。今回は2026を含むファイル名のファイルを開きたいとします。

その後ループによる条件分岐でファイルを開きます。指定フォルダからファイルすべてを走査し、名前と上記の指定キーワードを比較します。

もしキーワードが入っていれば、そのファイルパスはFilesに入った状態でループ終了します。

場合によっては隠しファイルとして同じファイル名が存在している場合があります。それを非対象とするため、「~$」が入っていない場合も条件として追加し(7行目)キーワードが入った隠しファイル以外のファイルパスを取得するようにしています。

ファイルがあれば、最後にPSでファイルを開きます。PAD等によるファイル操作ではインスタンス複数存在によって操作が困難になる場合があります。

そのためスクリプトでは既存のインスタンスを基本として、複数のインスタンスが作成されないようにしています。

これにより、「一番最後のファイルを指定して操作」のようなこのフローを応用したフロー作成が可能です。

既存のインスタンスがあればそれを使用、無ければ新規作成し、複数インスタンスの作成回避

・コード

➤コードはこちら
SET Folder TO $'''DynamicTestFolder'''
Folder.GetFiles Folder: Folder FileFilter: $'''*.xl*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
ON ERROR

END
SET ValToCheckFile TO 2026
SET Loopcnt TO 0
LOOP FOREACH CurrentFile IN Files
    IF Contains(CurrentFile.Name, ValToCheckFile, False) THEN
        IF NotContains(CurrentFile.Name, $'''~$''', True) THEN
            EXIT LOOP
        END
    END
    Variables.IncreaseVariable Value: Loopcnt IncrementValue: 1
    IF $'''Loopcnt''' = Files.Count THEN
        Display.ShowMessageDialog.ShowMessage Title: $'''対象ファイルが見つかりません。''' Message: $'''処理対象ファイルを選択してください。''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
    END
END
Scripting.RunPowershellScript.RunScript Script: $'''# 対象ファイルパス(環境に合わせて展開される前提)
$path = \"%CurrentFile.FullName%\"
$ext  = [System.IO.Path]::GetExtension($path).ToLower()

function Open-WithOfficeOrDefault {
    param(
        [string]$comProgId,   # 例: \"Excel.Application\"
        [string]$path
    )

    try {
        # 既存インスタンス取得(起動していなければ例外)
        $app = [Runtime.InteropServices.Marshal]::GetActiveObject($comProgId)

        switch ($comProgId) {
            \"Excel.Application\" {
                $app.Visible = $true
                $wb = $app.Workbooks.Open($path)
                $wb.Activate()
            }
            \"Word.Application\" {
                $app.Visible = $true
                $doc = $app.Documents.Open($path)
                $doc.Activate()
            }
            \"PowerPoint.Application\" {
                $app.Visible = $true
                $pres = $app.Presentations.Open($path, $true, $false, $true)
                $pres.SlideShowSettings.Run() | Out-Null
            }
        }

        Write-Output \"OK ($comProgId)\"
    }
    catch {
        # 対応アプリが起動していなければ既定アプリで開く
        Write-Output \"$comProgId が起動していないため既定アプリで開きます\"
        Start-Process $path
    }
}

switch ($ext) {
    # Excel 系
    \".xls\"  { Open-WithOfficeOrDefault -comProgId \"Excel.Application\" -path $path }
    \".xlsx\" { Open-WithOfficeOrDefault -comProgId \"Excel.Application\" -path $path }
    \".xlsm\" { Open-WithOfficeOrDefault -comProgId \"Excel.Application\" -path $path }

    # Word 系
    \".doc\"  { Open-WithOfficeOrDefault -comProgId \"Word.Application\" -path $path }
    \".docx\" { Open-WithOfficeOrDefault -comProgId \"Word.Application\" -path $path }

    # PowerPoint 系
    \".ppt\"  { Open-WithOfficeOrDefault -comProgId \"PowerPoint.Application\" -path $path }
    \".pptx\" { Open-WithOfficeOrDefault -comProgId \"PowerPoint.Application\" -path $path }

    # PDF / TXT / その他 → 既定アプリでそのまま開く
    \".pdf\"  { Start-Process $path }
    \".txt\"  { Start-Process $path }

    Default { Start-Process $path }
}''' ScriptOutput=> PowershellOutput

・ポイント機能

・ファイル取得とファイル名による判定

・既存インスタンスでファイル開く

ファイル取得とファイル名による判定

PADでフォルダからファイル操作するには、まず下記メソッドを使用します。これにより指定フォルダの全ファイルが、リストとして取得可能です。

リストとなった変数には、ファイル名+パスの情報が入っています。これを用いることで、ファイル操作可能です。

今回は指定フォルダ内の指定keywordが入っている場合、そのファイルを開きたいとしています。その為、For eachによりファイルリストそれぞれの値を取得し、ファイル名をkeywordと比較します。

~$は隠しファイルがある場合に取得される文字です。この隠しファイルrは操作時の誤判定となりますので、条件で除外しています。逆に隠しファイルを対象にする場合は、含む場合をループ終了条件にすればよいです。

既存インスタンスでファイル開く

PSによりエクセル等ファイルを既存インスタンスで開くようにしています。

既存のインスタンスがあればそれを使用、無ければ新規作成し、複数インスタンスの作成回避

PADでエクセル等を開く処理はありますがこれは問題があります。

まず、既存インスタンスで開きたい場合でも開かない場合があります。エクセルを開くメソッドの設定で既存インスタンスで開くという選択肢もありますが、なぜか機能しません。

これは、同じインスタンス内で処理が必要なマクロやVBS含めたプロブラムで、処理ができない問題となります。

また、PADではエクセル等ファイルに応じたメソッドがありますが、すべてのファイルを対象にするにはその分メソッド設定が必要で、その分分岐も複雑になります。

これは構築の手間でありメンテを考えてもよい選択死とは言えません。

そこでPSを使用しどのファイルでも既存インスタンスで開くようにしています。

-業務効率化