VBAツール:【Excel】複数ファイルーファイル毎一括圧縮ツール(Windows標準 zip圧縮)
VBAツール:【Excel】複数ファイルーファイル毎一括圧縮ツール(Windows標準 zip圧縮)Excelの見た目はこんな感じでシンプルです。 複数のファイルを選択すると、ファイルごとに圧縮ファイルが作成されます。 内容的にVBScriptにした方がいい気もしますが、ひとまずExcelで作りました。
【使い方】(1)「圧縮実行」ボタンを押す (2)ダイアログが開くので、圧縮したいファイルを選択(複数も可能) (3)別のダイアログが開くので、保存先のフォルダを選択 (4)ファイル毎に圧縮が終わると「完了」と出ます。
サンプルコード VBA サンプルコード Option Explicit Sub Main_圧縮() Dim FilePath() As String Dim FolderPath As String Dim i As Long '//(1)ファイルの指定' If SelectFileDialog(FilePath()) Then Else MsgBox "実行がキャンセルされました。" Exit Sub End If '//(2)保存先の指定' If SelectFolderDialog(FolderPath) Then Else MsgBox "実行がキャンセルされました。" Exit Sub End If '//(3)圧縮' For i = 0 To UBound(FilePath()) Call zip圧縮(FilePath(i), FolderPath) Next MsgBox "完了" End Sub '*********************************************************' '(1)圧縮するファイルの取得' Public Function SelectFileDialog(ByRef FilePath() As String) As Boolean Dim myF As FileDialog Dim i As Long Set myF = Application.FileDialog(msoFileDialogFilePicker) Dim cnt As Long With myF '最初に開く場所(初期フォルダ)の指定。ここではデスクトップにしています。' .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("Desktop") '//ダイアログの左上に出てくるタイトル名' .Title = "圧縮するファイルの指定(複数選択可)" '//①Falseはファイル一つ指定、Trueだと複数のファイルの選択が可能になる。' .AllowMultiSelect = True If .Show = True Then 'ダイアログを開く' cnt = .SelectedItems.Count - 1 ReDim FilePath(cnt) '複数ファイルを選択するのをTrueにした場合は全てのファイルのパスを戻します。Falseの場合は単独のファイルのパスのみ戻します。' For i = 1 To .SelectedItems.Count '指定した複数のファイルを配列にして返す' FilePath(i - 1) = .SelectedItems(i) Next i SelectFileDialog = True Else SelectFileDialog = False End If End With Set myF = Nothing End Function '*********************************************************' '(2)保存するフォルダの選択' Public Function SelectFolderDialog(ByRef FolderPath As String) As Boolean Dim myF As FileDialog Set myF = Application.FileDialog(msoFileDialogFolderPicker) With myF '//最初に開く場所(初期フォルダ)の指定。ここではデスクトップにしています。' .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("Desktop") '//ダイアログの左上に出てくるタイトル名' .Title = "保存するフォルダの指定" '//保存先フォルダは一つなのでFalseにする' .AllowMultiSelect = False If .Show = True Then 'ダイアログを開く' FolderPath = .SelectedItems(1) '指定したフォルダを返す' SelectFolderDialog = True Else SelectFolderDialog = False End If End With Set myF = Nothing End Function '*********************************************************' '(3)圧縮' Private Sub zip圧縮(ByVal zipTargetPath As String, ByVal FolderPath As String) Dim zipSavePath As String Dim psCommand As String Dim WSH As Object Dim zipResult As Integer Dim zipFolderName As String '//圧縮するフォルダ名orファイル名を取得’ zipFolderName = getLastPathName(zipTargetPath) '//圧縮したzipファイルの保存先' zipSavePath = FolderPath & "\" & zipFolderName '//実行するPowerShellのコマンド作成。「 -Force」で上書き。' psCommand = "powershell -NoLogo -ExecutionPolicy RemoteSigned -Command Compress-Archive -Path " & zipTargetPath & " -DestinationPath " & zipSavePath & " -Force" '" Set WSH = CreateObject("WScript.Shell") '//PowerShellのコマンド実行' '「zipSavePath」で指定した場所に圧縮されます。' zipResult = WSH.Run(Command:=psCommand, WindowStyle:=0, WaitOnReturn:=True) Set WSH = Nothing End Sub '*********************************************************' '//パスの一番最後のフォルダ名orファイル名取得' Function getLastPathName(ByVal zipTargetPath As String) As String Dim FNameArray As Variant Dim lastPathName As String Dim getFileName As String Dim rightPoint As Long Dim chk As Long chk = GetAttr(zipTargetPath) FNameArray = Split(zipTargetPath, "\") '" lastPathName = FNameArray(UBound(FNameArray)) If chk = 16 Then getLastPathName = lastPathName Else '文字列の右端から"."を検索し、左端からの位置を取得する' rightPoint = InStrRev(lastPathName, ".") '拡張子を除いたファイル名の取得' getFileName = Left(lastPathName, rightPoint - 1) getLastPathName = getFileName End If End Function 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 Option Explicit Sub Main_圧縮() Dim FilePath() As String Dim FolderPath As String Dim i As Long '//(1)ファイルの指定' If SelectFileDialog(FilePath()) Then Else MsgBox "実行がキャンセルされました。" Exit Sub End If '//(2)保存先の指定' If SelectFolderDialog(FolderPath) Then Else MsgBox "実行がキャンセルされました。" Exit Sub End If '//(3)圧縮' For i = 0 To UBound(FilePath()) Call zip圧縮(FilePath(i), FolderPath) Next MsgBox "完了" End Sub'*********************************************************''(1)圧縮するファイルの取得'Public Function SelectFileDialog(ByRef FilePath() As String) As Boolean Dim myF As FileDialog Dim i As Long Set myF = Application.FileDialog(msoFileDialogFilePicker) Dim cnt As Long With myF '最初に開く場所(初期フォルダ)の指定。ここではデスクトップにしています。' .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("Desktop") '//ダイアログの左上に出てくるタイトル名' .Title = "圧縮するファイルの指定(複数選択可)" '//①Falseはファイル一つ指定、Trueだと複数のファイルの選択が可能になる。' .AllowMultiSelect = True If .Show = True Then 'ダイアログを開く' cnt = .SelectedItems.Count - 1 ReDim FilePath(cnt) '複数ファイルを選択するのをTrueにした場合は全てのファイルのパスを戻します。Falseの場合は単独のファイルのパスのみ戻します。' For i = 1 To .SelectedItems.Count '指定した複数のファイルを配列にして返す' FilePath(i - 1) = .SelectedItems(i) Next i SelectFileDialog = True Else SelectFileDialog = False End If End With Set myF = Nothing End Function'*********************************************************''(2)保存するフォルダの選択'Public Function SelectFolderDialog(ByRef FolderPath As String) As Boolean Dim myF As FileDialog Set myF = Application.FileDialog(msoFileDialogFolderPicker) With myF '//最初に開く場所(初期フォルダ)の指定。ここではデスクトップにしています。' .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("Desktop") '//ダイアログの左上に出てくるタイトル名' .Title = "保存するフォルダの指定" '//保存先フォルダは一つなのでFalseにする' .AllowMultiSelect = False If .Show = True Then 'ダイアログを開く' FolderPath = .SelectedItems(1) '指定したフォルダを返す' SelectFolderDialog = True Else SelectFolderDialog = False End If End With Set myF = Nothing End Function'*********************************************************''(3)圧縮'Private Sub zip圧縮(ByVal zipTargetPath As String, ByVal FolderPath As String) Dim zipSavePath As String Dim psCommand As String Dim WSH As Object Dim zipResult As Integer Dim zipFolderName As String '//圧縮するフォルダ名orファイル名を取得’ zipFolderName = getLastPathName(zipTargetPath) '//圧縮したzipファイルの保存先' zipSavePath = FolderPath & "\" & zipFolderName '//実行するPowerShellのコマンド作成。「 -Force」で上書き。' psCommand = "powershell -NoLogo -ExecutionPolicy RemoteSigned -Command Compress-Archive -Path " & zipTargetPath & " -DestinationPath " & zipSavePath & " -Force" '" Set WSH = CreateObject("WScript.Shell") '//PowerShellのコマンド実行' '「zipSavePath」で指定した場所に圧縮されます。' zipResult = WSH.Run(Command:=psCommand, WindowStyle:=0, WaitOnReturn:=True) Set WSH = Nothing End Sub'*********************************************************''//パスの一番最後のフォルダ名orファイル名取得'Function getLastPathName(ByVal zipTargetPath As String) As String Dim FNameArray As Variant Dim lastPathName As String Dim getFileName As String Dim rightPoint As Long Dim chk As Long chk = GetAttr(zipTargetPath) FNameArray = Split(zipTargetPath, "\") '" lastPathName = FNameArray(UBound(FNameArray)) If chk = 16 Then getLastPathName = lastPathName Else '文字列の右端から"."を検索し、左端からの位置を取得する' rightPoint = InStrRev(lastPathName, ".") '拡張子を除いたファイル名の取得' getFileName = Left(lastPathName, rightPoint - 1) getLastPathName = getFileName End IfEnd Function