🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

2388閲覧

VBAでZIPを解凍するコードを改良して、F5で指定フォルダ内のZIPファイルを解凍できるようにしたい。

uwsc

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/03/13 04:36

編集2021/03/13 05:20

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xail2222

2021/03/13 04:51

「F5で指定のフォルダで解凍のみ実行できる形にしたいです。」の「指定」というのは どういう方式の指定を想定していますか? エクセルファイルがあるフォルダ? それともダイアログを表示して選択? それともコード埋め込みで固定? また「F5」は、どこで入力する想定ですか?
uwsc

2021/03/13 05:10

回答ありがとうございます。 F5はVBAプロジェクト画面の実行のショートカットです。実行した時点で解凍されることを想定しております。 指定は、解凍を実行するフォルダのパスをB5に入力するのではなく、ソースコード内に書くという意味で使いました。
xail2222

2021/03/13 05:19

とするとy_waiwaiさんの回答通りになりますね。 コードを読んである程度意味を理解しながら修正していく必要がありますね。 意味が分からないところがあれば質問していけばいいでしょう。
guest

回答2

0

VBA

1 ' PATH 取得 2 'str_path = .Range("B5").Value 3 str_path = "c:\Users\uwsc\Desktop\xxx.zip"

VBA

1 ' 押下ボタン取得 2 'str_button = Application.Caller 3 str_button = "解凍"

投稿2021/03/13 12:12

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

str_pathに、その指定フォルダというのを入れるようにして、そのコードを呼び出せばいいのです

投稿2021/03/13 04:44

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問