前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
あるサイトから引用したVBAでZIPを解凍するソースコードですが、このままだとわざわざB5にパスを入力して なおかつ、解凍をクリックしないと動作しません。 Sheet1に入力せずに、VBAProjectの実行キー(F5)で指定のフォルダ(パスをコード内に入力)で解凍のみ実行できる形にしたいです。 圧縮が不要なので、解凍ボタンをクリックしなくても解凍のみが実行できるようにできませんか?
該当のソースコード
Option Explicit Sub main() ' ' PATH 設定 ' Dim str_path As String ' PATH 取得 With ActiveSheet str_path = .Range("B5").Value End With ' PATH 設定確認 If "" = str_path Then MsgBox ("対象パスを入力してください。") Exit Sub End If ' ' 実行処理 設定 ' Dim str_button As String ' 押下ボタン取得 str_button = Application.Caller Dim str_method As String ' ボタンで 圧縮 解凍 切り替え str_method = "Expand-Archive" ' ' 処理開始 ' Dim obj_folder As Object Dim obj_target As Object Dim obj_ws As New IWshRuntimeLibrary.WshShell Dim obj_we As WshExec Dim str_cmd As String Dim str_before As String Dim str_after As String Dim str_result As String str_result = "" ' フォルダ内 取得 With CreateObject("Scripting.FileSystemObject") ' 各フォルダ Set obj_target = IIf(str_button = "圧縮", .GetFolder(str_path).SubFolders, .GetFolder(str_path).Files) For Each obj_folder In obj_target ' 処理の分岐 + スペースをエスケープ If str_button = "圧縮" Then ' 圧縮時 str_before = Replace(obj_folder.Path, " ", "` ") str_after = str_path & Replace(obj_folder.Name, " ", "` ") & ".zip" Else ' 解凍時 If InStr(obj_folder.Path, ".zip") = 0 Then ' .zip が含まれていない場合 処理をスキップ GoTo Continue End If str_before = Replace(obj_folder.Path, " ", "` ") str_after = Replace(Replace(obj_folder.Path, " ", "` "), ".zip", "") End If ' 圧縮コマンド str_cmd = "powershell -ExecutionPolicy RemoteSigned -Command " & str_method & " -Path " & str_before & _ " -DestinationPath " & str_after & " -Force" ' コマンド 実行 Set obj_we = obj_ws.Exec(str_cmd) ' 完了 待機 Do While True If obj_we.Status <> WshRunning Then ' 結果 If obj_we.Status = WshFinished Then ' 成功 str_result = str_result & obj_folder.Name & " " & str_button & "に成功しました。" & vbCrLf ElseIf obj_we.Status = WshFailed Then ' 失敗 str_result = str_result & obj_folder.Name & " " & str_button & "に失敗しました。" & vbCrLf End If Exit Do End If DoEvents Loop ' 初期化 Set obj_we = Nothing ' .zip が含まれていない場合 処理をスキップ先 Continue: Next obj_folder ' 初期化 Set obj_target = Nothing End With
試したこと
Dim str_button As String
' 押下ボタン取得
str_button = Application.Caller
Dim str_method As String
' ボタンで 圧縮 解凍 切り替え
str_method = "Expand-Archive"
を消してみた
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
「F5で指定のフォルダで解凍のみ実行できる形にしたいです。」の「指定」というのは
どういう方式の指定を想定していますか?
エクセルファイルがあるフォルダ? それともダイアログを表示して選択?
それともコード埋め込みで固定?
また「F5」は、どこで入力する想定ですか?
回答ありがとうございます。
F5はVBAプロジェクト画面の実行のショートカットです。実行した時点で解凍されることを想定しております。
指定は、解凍を実行するフォルダのパスをB5に入力するのではなく、ソースコード内に書くという意味で使いました。
とするとy_waiwaiさんの回答通りになりますね。
コードを読んである程度意味を理解しながら修正していく必要がありますね。
意味が分からないところがあれば質問していけばいいでしょう。