※当サイトは、アフィリエイト広告を利用しPRを含みます。

Excel

ExcelのVBAからcmdコマンド投下と7zip実行まとめ

Excel VBAで集計処理などを行なう時、必要なファイルを取り寄せたり不要なファイルをzip圧縮する度にExcelから切り替えて作業するより、ExcelのVBAだけで完結したい時って意外とありますよね?

ただ、VBAのファイルコピーだと処理が煩雑になりがちで実装が面倒だったりも。

「如何に手を抜いてVBAコードを書きたい」という方におすすめの方法をまとめました。

 

VBAからcmdコマンド投下

まずはコマンドプロンプトでも使えるXCOPYコマンドの投下方法から。

コマンドを半角スペースで繋げるだけなので、特にポイントはありません。

コピー元と先を変更することで柔軟に利用できると思います。

 

Sub ファイルコピー()

    Dim オブジェクト As Object
    Dim コマンド結果 As Integer
    Dim コマンドライン As String
    Dim コピー元フォルダパス As String
    Dim コピー先フォルダパス As String
    
    '%USERPROFILE%など、Windowsの環境変数も使える
    Set オブジェクト = CreateObject("WScript.Shell")
    コピー元フォルダパス = "%USERPROFILE%\Desktop\コピー元"
    コピー先フォルダパス = "%USERPROFILE%\Desktop\コピー先"
     
    'XCOPYのオプション
    '/S 再起処理:空の場合を除いて、ディレクトリとサブディレクトリをコピー)
    '/V ベリファイ:コピー先の各ファイルのサイズを検証)
    '/Q コピー中にファイル名を表示しない
    '/Y 上書き保存の確認メッセージを表示せず上書き
    コマンドライン = "XCOPY /S /V /Q /Y " & コピー元フォルダパス & " " & コピー先フォルダパス
    コマンド結果 = オブジェクト.Run(Command:="%ComSpec% /c " & コマンドライン, WindowStyle:=0, WaitOnReturn:=True)
    
    If (コマンド結果 <> 0) Then
        MsgBox ("ファイル移動コマンド異常終了")
        End
    End If
    
    'メモリ開放
    Set オブジェクト = Nothing
    
End Sub

 

応用して別のcmdコマンドも投下できます。

いろいろ試してみてください。

 

VBAから7zipコマンドで解凍する

zip圧縮や解凍で有名な7zipですが、コマンドでも利用できます。

Windows環境に併せて32bit、64bitのexeをダウンロードし、任意のフォルダに設置。(インストールしなくても利用可)

フォルダパスを切って7zip.exeを実行すればOKです。

これを応用し、VBAから実行します。

 

Sub セブンzipで解凍()

    Dim セブンzipコマンド As String
    Dim オブジェクト As Object
    Dim コマンド結果 As Integer
    Dim 解凍元フォルダパス As String
    Dim 解凍先フォルダパス As String

    Set オブジェクト = CreateObject("WScript.Shell")
    解凍元フォルダパス = "C:\解凍元"
    解凍先フォルダパス = "C:\解凍先"

    '7zip解凍コマンドの設定
    'x 解凍の指示
    '-y 上書き保存の確認をせず上書き
    '-o 解凍先フォルダの指定。(よくあるミス。-oとフォルダパスはスペース空けない)
    セブンzipコマンド = """C:\Program Files\7-Zip\7z.exe""" & " x -y -o" & 解凍先フォルダパス & " " & 解凍元フォルダパス & "\*.zip "

    '7zipコマンドを実行
    コマンド結果 = オブジェクト.Run(Command:="%ComSpec% /c " & セブンzipコマンド, WindowStyle:=0, WaitOnReturn:=True)

    If (コマンド結果 = 0) Then
        MsgBox "ファイルを解凍しました", vbInformation + vbOKOnly, "ファイル解凍処理"
    Else
        MsgBox "zipファイルが無い場合の処理", vbExclamation + vbOKOnly, "ファイル解凍処理"
    End If

    'メモリ開放
    Set オブジェクト = Nothing

End Sub

 

注意点として、Windowsだとインストールフォルダからの実行時、半角スペースが入るためダブルクォーテーションを上記のように設定する必要があります。

 

VBAから7zipコマンドで圧縮する

解凍とほぼ同じ方法で圧縮もできます。

Sub セブンzipで圧縮()

    Dim セブンzipコマンド As String
    Dim オブジェクト As Object
    Dim コマンド結果 As Integer
    Dim 圧縮元フォルダパス As String
    Dim 圧縮先フォルダパス As String

    Set オブジェクト = CreateObject("WScript.Shell")
    圧縮元フォルダパス = "C:\圧縮元\test"   'testフォルダが圧縮し移動され、testフォルダは削除されます
    圧縮先フォルダパス = "C:\圧縮先"

    '7zip圧縮コマンドの設定
    'a 圧縮の指示
    '-sdel 圧縮元からファイルを削除
    セブンzipコマンド = """C:\Program Files\7-Zip\7z.exe""" & " a -sdel " & 圧縮先フォルダパス & "\圧縮後ファイル名_" & Format(Now(), "yyyymmdd") & ".zip " & 圧縮元フォルダパス

    '7zipコマンドを実行
    コマンド結果 = オブジェクト.Run(Command:="%ComSpec% /c " & セブンzipコマンド, WindowStyle:=0, WaitOnReturn:=True)

    If (コマンド結果 = 0) Then
        MsgBox "ファイルを圧縮しました", vbInformation + vbOKOnly, "ファイル圧縮処理"
    Else
        MsgBox "圧縮に失敗した時の処理", vbExclamation + vbOKOnly, "ファイル圧縮処理"
    End If

    'メモリ開放
    Set オブジェクト = Nothing

End Sub

 

著作権について

著作権は当サイトの管理者に帰属します。

商用利用以外であれば著作権フリーでお使いいただけますが、利用時はコメントにてお知らせください。

 


社畜系インフラエンジニアブログのTOPへ戻る

コメントもらえたら泣いて喜びます!
  • この記事を書いた人
  • 最新記事
生き残りたいインフラエンジニアのカナデ

kanade

IT関連の仕事に従事し気付けば20余年。好きな言葉は「よくわからないけど動いてる」です。どうにかして生き残りたいアラフォーのIT系エンジニア。

-Excel
-