2017年6月7日

【Excel】ファイルの作成日時などを取得するマクロ


ファイルの作成日時などを取得するマクロです。

ファイルの種類を取得するには、FileSystemObjectのGetFileでファイルオブジェクトを取得し、そのTypeプロパティからファイルの種類を取得します。

※このFileSystemObjectを使うには、あらかじめ参照設定で「Microsoft Scripting Runtime」にチェックを入れておく必要があります。


Sub GetFileCreatedDate()

    Dim fso As New FileSystemObject
    Dim filePath As String
    Dim message As String

    filePath = "C:\work\image1\cccc.jpg"
    
    message = filePath & vbCrLf & vbCrLf & _
              "作成日時:" & fso.GetFile(filePath).DateCreated & vbCrLf & _
              "最終アクセス日時:" & fso.GetFile(filePath).DateLastAccessed & vbCrLf & _
              "最終更新日時:" & fso.GetFile(filePath).DateLastModified & vbCrLf

    MsgBox message, vbInformation, "FileSystemObject"
    
End Sub

実行結果




2017年6月6日

【Excel】ファイルの種類を取得するマクロ


ファイルの種類を取得するマクロです。

ファイルの種類を取得するには、FileSystemObjectのGetFileでファイルオブジェクトを取得し、そのTypeプロパティからファイルの種類を取得します。

※このFileSystemObjectを使うには、あらかじめ参照設定で「Microsoft Scripting Runtime」にチェックを入れておく必要があります。


Sub GetFileType()

    Dim fso As New FileSystemObject
    Dim filePath As String

    filePath = "C:\work\image1\cccc.jpg"

    MsgBox filePath & vbCrLf & vbCrLf & "ファイルタイプは、『 " & fso.GetFile(filePath).Type & " 』です。", vbInformation, "FileSystemObject"
    
End Sub

実行結果





2017年6月5日

【Excel】ファイルサイズを取得するマクロ


ファイルサイズを取得するには、FileLen関数を使った方法とFileSystemObjectを使った方法があります。

FileLen関数

FileLen関数は、引数に対象のファイルパスを指定します。返される数値の単位はバイト(Byte)になります。
Sub GetFileSize1()

    Dim filePath As String
    
    filePath = "C:\work\image1\cccc.jpg"
    
    MsgBox filePath & vbCrLf & vbCrLf & "ファイルサイズは、" & Format(FileLen(filePath), "#,###") & " Byteです。", vbInformation, "FileLen"

End Sub

実行結果



FileSystemObject

FileSystemObjectでファイルサイズを取得するには、まずGetFileでファイルオブジェクトを取得し、そのSizeプロパティからファイルサイズを取得します。

※このFileSystemObjectを使うには、あらかじめ参照設定で「Microsoft Scripting Runtime」にチェックを入れておく必要があります。


Sub GetFileSize2()

    Dim fso As New FileSystemObject
    Dim filePath As String
    Dim fileSize As Long
    
    filePath = "C:\work\image1\cccc.jpg"
    
    fileSize = fso.GetFile(filePath).Size
    
    MsgBox filePath & vbCrLf & vbCrLf & "ファイルサイズは、" & Format(fileSize, "#,###") & " Byteです。", vbInformation, "FileSystemObject"

End Sub

実行結果





2017年6月4日

【Excel】ファイルの存在確認をするマクロ(PowerShellのTest-Pathを使った方法)


VBAでPowerShellのTest-Pathを使ってファイルの存在確認が出来るか試してみました。


WScript.ShellのExecメソッド

Execメソッドを使うと標準入力、標準出力、標準エラー出力を利用することが出来きますので、これを使ってファイルの存在判定を行います。
Sub CheckFile3()

    Dim filePath As String
    Dim oShell As Object
    
    Set oShell = CreateObject("WScript.Shell")

    Dim oExec As Object
    Dim oOutput As Object
    
    filePath = "C:\work\Excel\output.txt"
    
    'Execメソッド
    Set oExec = oShell.Exec("powershell -WindowStyle Hidden -command Test-Path """ & filePath & """")

    '標準出力の値を取得    
    Set oOutput = oExec.StdOut

    Dim bufStr As String
    
    While Not oOutput.AtEndOfStream

        '取得した値から1行読みとる
        bufStr = oOutput.ReadLine
        
        If bufStr = "True" Then
            MsgBox filePath & " は存在します。"
        Else
            MsgBox filePath & " は存在しません。"
        End If
    Wend

End Sub
Execメソッドでpowershellを起動するときに「-WindowStyle Hidden」を使って、ウィンドウを非表示設定にしてますが、一瞬だけプロンプト画面が表示されてしまいます。この一瞬だけチラって見えるのがカッコ悪くてなんとかならないかといろいろ調べましたが、どうやら無理なようです。

まあ、ちょっとぐらいプロンプトが表示されても気にならないという方は、この方法でいいと思います。

ただ、チラっとか見えるの嫌だ!、という方は次の方法を試してみてください。
ShellのRunメソッドを使って完全非表示にしています。


WScript.ShellのRunメソッド

Runメソッドを使うとプロンプトを非表示にすることが出来ます。
ただ、この方法ですと標準出力の値は取得できませんのでTest-Pathの結果を知る方法が別に必要です。
今回は手っ取り早くクリップボードを使って結果を取得するようにしてみました。
Sub CheckFile4()

    Dim filePath As String
    Dim ret As Long
    Dim ClipBoard As Variant
    Dim cb As New DataObject
    Dim cbText As String
    
    filePath = "C:\work\Excel\output.txt"
    
    Dim cmd As String
    cmd = "powershell Test-Path """ & filePath & """ | Set-Clipboard "
    
    With CreateObject("Wscript.Shell")
        ret = .Run(cmd, 0, True)
    End With

    'クリップボードの値を取得    
    cb.GetFromClipboard
    cbText = cb.GetText
    
    If cbText = "True" Then
        MsgBox filePath & " は存在します。"
    Else
        MsgBox filePath & " は存在しません。"
    End If
    
End Sub
Test-Pathの結果は、パイプラインを使ってSet-Clipboardでクリップボードに格納しています。

ちなみに、DataObjectオブジェクトを使用するには、参照設定で「Microsoft Forms 2.0 Object Library」にチェックを入れる必要があります。


もし、参照設定に「Microsoft Forms 2.0 Object Library」が出てこない場合は、[参照]ボタンから「c:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を追加してください。


今回、試しにPowerShellのTest-Pathを使った方法を考えてみましたが、普通にFileSystemObjectとかを使ったほうがはるかに簡単です。まあでも、PowerShellのコマンドレットを利用したいといったこともあると思いますので、そういったときに今回のやり方が使えそうな気がします。



2017年6月3日

【Excel】ファイルの存在確認をするマクロ


ファイルの存在を確認するには、Dir関数を使った方法とFileSystemObjectを使った方法があります。

Dir関数

Dir関数はファイルが存在するとパスを含まないファイル名だけを返します。また、ファイルが存在しない場合には空文字("")を返します。
Sub CheckFile1()

    Dim filePath As String
    
    filePath = "C:\work\Excel\output.txt"
    
    If Dir(filePath) <> "" Then
        MsgBox filePath & " は存在します。"
    Else
        MsgBox filePath & " は存在しません。"
    End If
    
End Sub


FileSystemObject

FileSystemObjectのFileExistsメソッドでファイルの存在確認が出来ます。
FileExistsメソッドは、対象のファイルが存在する場合には「True」を返します。

ただ、このFileSystemObjectを使うには、あらかじめ参照設定で、「Microsoft Scripting Runtime」にチェックを入れておく必要がありますので注意が必要です。


Sub CheckFile2()

    Dim fso As New FileSystemObject
    Dim filePath As String
    
    filePath = "C:\work\Excel\output.txt"
    
    If fso.FileExists(filePath) = True Then
        MsgBox filePath & " は存在します。"
    Else
        MsgBox filePath & " は存在しません。"
    End If
    
End Sub




2017年6月2日

【Excel】ファイル選択ダイアログボックスを開く


ファイル選択ダイアログボックスを開く方法です。

前回、『テキストファイルから読み込んだデータをセルに格納するマクロ』を改造して、ファイル選択ダイアログからファイルを選択してデータを読み込んでみます。



シートに[読込]ボタンを設置し、Clickイベントハンドラに次のように記述します。

Sub button1_Click()

    Dim i As Integer
    Dim bufStr As String
    Dim filePath As String
    Dim fd As FileDialog
    
    'ファイル選択ダイアログボックス
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        'ファイルの複数選択を不可
        .AllowMultiSelect = False
        
        'タイトル
        .Title = "テキストファイル"
        
        'ファイルフィルタのクリア
        .Filters.Clear
        
        'ファイルフィルタの設定
        .Filters.Add "テキストファイル ", "*.txt"

        '初期表示のフォルダ
        .InitialFileName = ""
        
        If .Show = True Then
            'ファイルパスの取得
            filePath = .SelectedItems(1)
        Else
            'キャンセル
            Exit Sub
        End If
    End With

    'ファイルのオープン
    Open filePath For Input As #1
    
    i = 2
    
    Do While Not EOF(1)
    
        'ファイルから一行読込む
        Line Input #1, bufStr
        
        '読み込んだデータをセルに格納
        Cells(i, 2).Value = bufStr
        
        i = i + 1
    Loop
    
    'ファイルを閉じる
    Close #1

End Sub

実行すると、このようなファイル選択ダイアログボックスが表示されます.



[OK]ボタンを押すと、ファイルパスを取得して読込処理を行います。[キャンセル]ボタンを押した場合は何もせずに処理を抜けるようにしています。
また、初期表示のフォルダを「InitialFileName = ""」としていますが、こうするとどうやらマイドキュメントが表示されるようです。これは規定でそうなっているのか分かりませんが、自分の環境ではマイドキュメントが開いてきました。


実行結果





2017年6月1日

【Excel】テキストファイルから読み込んだデータをセルに格納するマクロ


テキストファイルから読み込んだデータをセルに格納するマクロです。

たとえば、このようなテキストファイルのデータを読み込むとします。




そして、シートに[読込]ボタンを設置し、Clickイベントハンドラに次のように記述します。

Sub button1_Click()

    Dim i As Integer
    Dim bufStr As String
    Dim filePath As String
    
    filePath = "C:\work\Excel\output.txt"

    'ファイルのオープン
    Open filePath For Input As #1
    
    i = 2
    
    Do While Not EOF(1)
    
        'ファイルから一行読込む
        Line Input #1, bufStr
        
        '読み込んだデータをセルに格納
        Cells(i, 2).Value = bufStr
        
        i = i + 1
    Loop
    
    'ファイルを閉じる
    Close #1

End Sub

少し解説すると、まず、OpenステートメントのInputモードでファイルを開きます。

構文
Open ファイルパス For Input As #ファイル番号

次に、EOF(ファイル番号)関数がFalseの間、繰り返しLine Inputを使いファイルから1行ずつデータを読み込みます。

構文
Line Input #ファイル番号, データを格納する変数

そして、最後にCloseステートメントでファイルを閉じます。



実行結果