iT邦幫忙

1

VBA 解壓縮 .tar

利用VBA解壓縮excel檔至某個資料匣,在網路上參考了其他人的寫法,已可以順利處理為副檔名=zip的檔案,但副檔名為.tar則無法成功,下方是我的程式碼:

Sub ExtractAllFiles()
Dim File As String
Dim ShellStr
File = Dir("C:\test")

 While (File <>"") 
    if Instr(1,File,".tar")>0 then 
    ShellStr = "C:\Program Files\PKWARE\PKZIPW -e C:\test\ " & File & "   C:\test\"
    Call Shell(ShellStr, vbHide)
    File = Dir
    DoEvents
Loop

End Sub

結果出現run-time error 53~不知那裡有問題?
是我的解壓縮檔的路徑有錯?還是那裡有漏掉..感謝各位的幫忙

淺水員 iT邦大師 6 級 ‧ 2019-12-07 00:56:46 檢舉
查了一下 run-time error 53 是找不到檔案。
也許可以試著把路徑顯示出來,看看有沒有錯誤。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
小魚
iT邦大師 1 級 ‧ 2019-12-07 08:22:44

你可以用 MsgBox 先把檔案字串印出來,
確認看看名稱有沒有錯誤,
先確定是哪個步驟的問題.

喵仔 iT邦新手 5 級 ‧ 2019-12-07 10:50:52 檢舉

個人覺得是字串那裡引號沒標註好...

2
paicheng0111
iT邦大師 5 級 ‧ 2019-12-07 09:39:37
Sub ExtractAllFiles()
    Dim File As String
    Dim ShellStr
    
    File = Dir("C:\test\*.tar")

    Do Until File = ""
        DoEvents
        ShellStr = "C:\Program Files\PKWARE\PKZIPW -e C:\test\" & File & " C:\test\"
        Call Shell(ShellStr, vbHide)
        File = Dir
    Loop
End Sub
看更多先前的回應...收起先前的回應...
喵仔 iT邦新手 5 級 ‧ 2019-12-07 10:57:47 檢舉

我想請教, 為什麼這裡的引號要空格?
” c:\test\” ,此外我想詢問,我有需要把執行檔pkzipw.exe 加在\PKZIPW後方?

為什麼這裡的引號要空格? " c:\test\"

因為你的command應該是

C:\Program Files\...\pkzipw.exe -e c:\test\abc.tar c:\test\

abc.tarc:\test\之間本來就要有空格。

我想詢問,我有需要把執行檔pkzipw.exe 加在\PKZIPW後方?

應該是要吧。
你可以試試看。

小魚 iT邦大師 1 級 ‧ 2019-12-07 14:30:24 檢舉

話說,
看了一下,
原PO好像少了.tar副檔名...

小魚 iT邦大師 1 級 ‧ 2019-12-07 14:44:18 檢舉

不過這個軟體要去哪裡下載呢?
好像不好找...

0
marlin12
iT邦研究生 5 級 ‧ 2019-12-07 18:07:00

用Shell去執行程式,跟用[命令字元]一樣,如果程式的路徑和參數內含有空格,就要用引號去括起來,否則空格便被誤以為是參數的分隔符。
在你的程式裏,PKZIPW的路徑上有空格,因此出現run-time error 53(即是找不到PKZIPW檔案)。 tar檔案名內也可能含有空格,因此這些檔案也無法成功。

針對這個問題,你的程式可以作以下的修改:

'用雙引號包圍字串
Function Quoted(s As String)
  Quoted = Chr(34) & s & Chr(34)    'Chr(34) 是雙引號字元
End Function

Sub ExtractAllFiles()
  Dim workDir As String: workDir = "C:\test\"
  Dim appPath As String: appPath = "C:\Program Files\PKWARE\PKZIPW"
  Dim tarFilename As String: tarFilename = Dir(workDir & "*.tar")

  While tarFilename <> ""
    Dim tarPath As String: tarPath = workDir & tarFilename
    Dim shellCmd As String: shellCmd = Quoted(appPath) & " -e " & Quoted(tarPath) & " " & Quoted(workDir)
        
    Call Shell(shellCmd, vbHide)
        
    tarFilename = Dir  
        
    DoEvents
  Wend
End Sub

另外,你的程式還有2大問題:
[問題1] 把全部解壓後的檔案放在同一個目錄內

如果來自不同tar檔的解壓檔有相同路徑和檔名,新、舊的解壓檔會產生衝突(或者會被覆蓋)。

[問題2] 用vbHide(隱藏視窗)去執行程式,而且不理執行的狀況和結果

程式不一定會解壓成功,遇到問題時,還可能停下來要用戶輸入。但是視窗被隱藏而無法得知狀況或作出回應,更糟的是程式在背後永遠佔用資源。

看更多先前的回應...收起先前的回應...
喵仔 iT邦新手 5 級 ‧ 2019-12-09 23:56:17 檢舉

謝謝各位的幫忙,
今天試的結果:執行階段錯誤'5':
程序呼叫或引數不正確

marlin12 iT邦研究生 5 級 ‧ 2019-12-10 09:36:36 檢舉

請你打開[命令字元]視窗,運行以下的指令,然後把結果的截圖放上來。
指令的{file}要換為在C:\test目錄內其中一個zip檔名(例如:abc.zip)。

"C:\Program Files\PKWARE\PKZIPW" -e "C:\test\{file}" "C:\test"
喵仔 iT邦新手 5 級 ‧ 2019-12-10 23:32:13 檢舉

https://ithelp.ithome.com.tw/upload/images/20191210/20122796AeImjoank4.png

喵仔 iT邦新手 5 級 ‧ 2019-12-10 23:35:32 檢舉

https://ithelp.ithome.com.tw/upload/images/20191210/20122796qq7DnXQn2R.png

喵仔 iT邦新手 5 級 ‧ 2019-12-10 23:37:33 檢舉

這是在家裡自行安裝的解壓縮檔,真正要解壓縮.tar檔是在公司,家裡或公司皆出現一樣的錯誤訊息,謝謝各位的幫忙~

marlin12 iT邦研究生 5 級 ‧ 2019-12-11 18:05:11 檢舉

你家的peazip跟你公司的pkzip,解壓程式和路徑完全不同。但是你只把peazip的資料放上來,對了解在你公司的pkzip問題有甚麽幫助?!
/images/emoticon/emoticon19.gif

就你家的解壓程式而言,PeaZip只是一個目錄的名稱,真正要運行的程式是在這個目錄內的peazip.exe。

peazip跟pkzip是不同的應用程式,參數定義完全不同,怎可以把pkzip的參數用在peazip上面?!
/images/emoticon/emoticon05.gif

如果用PeaZip去解壓C:\test\python.tar檔案,在[命令字元]的指令應診是

"C:\Program Files\PeaZip\peazip.exe" -ext2folder "C:\test\python.tar"

[備註]peazip的用法和參數定義,可以在PeaZip目錄內的peazip_help.pdf檔內找到。

就你公司的解壓程式而言,如果要解壓C:\test\python.tar檔案,在[命令字元]的指令估計是

"C:\Program Files\PKWARE\PKZIPW" -e "C:\test\python.tar"

在你公司裏,請在[命令字元]運行以上指令,然後把結果的截圖放上來。

建議你先去報讀一些基楚電腦課程,然後才去學寫程式。

我要發表回答

立即登入回答