- ベストアンサー
エクセルVBAでファイルの選択(ZIP解凍後)
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
> VBAでは開けないファイルを手作業で開いて、パスを表示したら、以下のようにやはり違う場所にありました。 ZIP解凍後ではなかったという事ですね、それなら話は分かります。 File Explorerとファイルを開くダイアログとが同じ機能だと勘違いしてたのですね。 File Explorerは、ファイルをクリックする(表示だけでは解凍しない)とTempフォルダに解凍したファイルを作成して開いてくれますが、開くダイアログは、クリックしても現在のファイルのフルパスを返すだけですから。 コピーして解凍で対応するのは最適な対応かもしれませんね。
その他の回答 (10)
- HohoPapa
- ベストアンサー率65% (455/693)
>どのように対応すればよいのでしょうか? を求めているようですので、一案を。 圧縮状態からはVBAで開くことができませんので https://vbabeginner.net/zip-comp-decomp/ にある機能を使い解凍し、その後ファイルを選択します。 Sub sample() Dim Filename As String UnZip "C:\Users\papa\デスクトップ\m.zip", "C:\test" ChDir "C:\test" Filename = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") Workbooks.Open Filename End Sub 'https://vbabeginner.net/zip-comp-decomp/ Function UnZip(a_sZipPath As String, a_sExpandPath As String) As Boolean '参照設定で「Windows Script Host Object Model」を選択 Dim sh As New IWshRuntimeLibrary.WshShell Dim ex As WshExec Dim sCmd As String '// 半角スペースをバッククォートでエスケープ a_sZipPath = Replace(a_sZipPath, " ", "` ") a_sExpandPath = Replace(a_sExpandPath, " ", "` ") '// Expand-Archive:解凍コマンド '// -Path:フォルダパスまたはファイルパスを指定する。 '// -DestinationPath:生成ファイルパスを指定する。 '// -Force:生成ファイルが既に存在している場合は上書きする sCmd = "Expand-Archive -Path " & a_sZipPath & " -DestinationPath " & a_sExpandPath & " -Force" '// コマンド実行 Set ex = sh.Exec("powershell -NoLogo -ExecutionPolicy RemoteSigned -Command " & sCmd) '// コマンド失敗時 If ex.Status = WshFailed Then '// 戻り値に異常を返す UnZip = False '// 処理を抜ける Exit Function End If '// コマンド実行中は待ち Do While ex.Status = WshRunning DoEvents Loop '// 戻り値に正常を返す UnZip = True End Function
お礼
ありがとうございます。 今回は、解凍したファイルを別のフォルダにコピーして対応することにしました。勉強になりました。
- HohoPapa
- ベストアンサー率65% (455/693)
エクスプローラーの検索オプション(添付画像)の設定を行うことで エクスプローラーの機能の中で、zipファイルの中身の一覧を表示できます。 一方、 Application.Dialogs(xlDialogOpen).Show や FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") は、エクスプローラーの機能を内部的に使っていることから この中で検索などを使えば、冒頭の機能が呼び出され、 zipの中身(ファイルの一覧)が表示されます。 だからといって、zipファイル自身が解凍されているわけではなく 検索機能によって、ファイル名(やディレクトリー)の一覧が 単に描写されているだけにすぎません。 VBAのDialogs(xlDialogOpen)などから呼び出すことで開いた エクスプローラー上のファイルを選択し、 このファイルのフルパスを指定してエクセルブックを開こうとしても 解凍された状態ではありませんので、 VBAで開く実態ファイルは存在しない旨のエラーを表示します。 言い換えれば、 エクスプローラーからファイルを見つけ、ダブルクリックする動作と VBAを使いエクセルファイルを開く動作は ことzipファイルの場合は、同じではないということです。 前者はOSが解凍し、開くということです。
お礼
ありがとうございます。 とても勉強になりました。
- kkkkkm
- ベストアンサー率66% (1733/2603)
No.6の一部訂正です。 mFileName = Dir(FileName) は、ファイルがある前提なのでなくても先に進めるように mFileName = Mid(FileName, InStrRev(FileName, "\") + 1) にして、以後どこでエラーになるか確認した方がいいかもですね。
お礼
ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1733/2603)
No6の追加です。 BGtestzipのzipの前にドットがあるような感じに見えるのですが、2013の場合ドットがあるフォルダBGtest.zip(Zipファイルではありません。そもそも*.xls*でフィルターされた開くダイアログではZipファイルは選択肢に出てこないので選択しようがないですね)にしても開きましたが、念のためにフォルダ名をBGtestに変更してみてはいかがでしょう。
お礼
ありがとうございます。手動でファイルをコピーして対応します。
- kkkkkm
- ベストアンサー率66% (1733/2603)
> FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") のあとでPathとファイル名とを分割して様子を見てみてはいかがでしょう。 mFileName = Dir(FileName) PathName = Replace(FileName, mFileName, "") Debug.Print "mPAthName= "; PathName Debug.Print "mFileName= "; mFileName ChDir PathName Workbooks.Open mFileName
お礼
ありがとうございます。 VBAでは開けないファイルを手作業で開いて、パスを表示したら、以下のようにやはり違う場所にありました。 C:\Users\xxxxxx\AppData\Local\Temp\Temp1_BGtest.zip\BG.xlsx
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
>該当のExcelファイルを、べつのフォルダーに移動またはコピーさせてからそのファイルを選択すればちゃんと開きます。そうしなくとも開く方法を知りたいのです。 「移動またはコピー」が、実は「zipの解凍」なので、それをしないで、つまり、解凍しないで開く事は出来ません。どんな方法でも構いませんが「解凍作業が絶対に必要」です。 vbaで自動で何とかしようとしたら、開こうとしてるファイルがzip仮想フォルダの中にあるファイルか調べ、その仮想フォルダ、つまり「zipファイル」を解凍するような実行コマンドを自分で構築し、それをvbaから実行してzipファイルを自分で解凍して、解凍済みのフォルダ名とファイル名でファイルを開く、という、とんでもなく複雑なvbaを書かないとなりません。 自分なら絶対に書きたくない、面倒な処理です。
お礼
ありがとうございます。別のフォルダ内に手動でファイルをコピーさせて対応することにしました。
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
Windowsでzipファイルにアクセスすると、未解凍のまま、中身が見えます。 これは、zipファイルを「仮想的なフォルダ」として扱い、まるで「解凍したかのように見せかけているだけ」なのです。 なので、見えている中身をそのまま開こうとすると「未解凍で、そんなファイルは実在しない」という理由で、エラーになります。 見えているzipファイルの中身を、別のフォルダにコピーすると、普通にコピーしているフリをして、実は「zipファイルを解凍して、中身を取り出している」のです。 なので、zipのまま中身にアクセスすると「ファイルが開けない」とエラーになり、どこかに中身をコピーすると、正常に開けるのです。 解凍作業をせずにzipの中身が直接に見えるのは便利ですが、これは「存在しないファイルを、存在するかのように見せかけて、ユーザーを混乱させる」という、困った仕様なので、この機能を無効にする事も考えて下さい。但し、無効にすると「解凍してみないと、中身が判らない」というデメリットが出ます。
お礼
ありがとうございます。 VBAでは開けないファイルを手作業で開いて、パスを表示したら、以下のようにやはり違う場所にありました。 どうも解凍すると自分で指定しないこうなるようです。 C:\Users\xxxxxx\AppData\Local\Temp\Temp1_BGtest.zip\BG.xlsx
- kon555
- ベストアンサー率51% (1845/3564)
>> フォルダ名に使われている何らかの文字の影響はないはずです あくまで私の経験上ですが、こうしたトラブル対応のコツは『はず』の部分、疑わしい要素を一つずつ潰していく事です。 マクロ経由では開かないファイルがある。 通常の手操作なら該当ファイルは開く。 移動やコピーすればマクロで開く。 この時点でコードの不備とファイル自体の異常は否定されています。ならフォルダ名の影響はないか? という部分も確認して『はず』を『間違いない』に変えておいた方が最終的にはスムーズに進みます。 例えばあまり知られていないvbaの仕様に引っ掛かっていた、みたいなパターンがあったりしますからね。特定の文字列だけは◯◯になる、みたいな。 これは、要は不具合現状の発生条件の絞り込みで、これが確定すれば8割解決したようなものです。切り分け、などと言ったりもします。 仮に貴方の予想通り無駄に終わっても、それはそれで一歩前進なのです。それを元にまた仮説を立てて、要素を確認します。 もちろん確認のための手間との相談ではありますけどね。
お礼
ありがとうございます。 VBAでは開けないファイルを手作業で開いて、パスを表示したら、以下のようにやはり違う場所にありました。 C:\Users\xxxxxx\AppData\Local\Temp\Temp1_BGtest.zip\BG.xlsx
- kon555
- ベストアンサー率51% (1845/3564)
>>該当のExcelファイルを、べつのフォルダーに移動またはコピーさせてからそのファイルを選択すればちゃんと開きます この時点で、フォルダ名に使われている何らかの文字が影響している事が確定したと考えていいと思います。 移動またはコピーをしたくないなら、フォルダ名を変更すると多分対応可能です。 もしそれも不可能なら、(フォルダ名が原因と仮定してですが)少しずつフォルダ名を書き換えて原因の文字を特定し、Microsoft公式のヘルプやコミュニティに現象と対処方法を問い合わせるのがいいでしょう。 あとはVBA的には、例えば「ファイルを一旦作業用フォルダにコピーまたは移動して、作業後に保存し元の場所に戻す」みたいな組み方をする事は可能でしょう。 そもそも開けないのと同様に、移動等も処理できない可能性はありますけどね。
お礼
フォルダ名に使われている何らかの文字の影響はないはずです。エラーメッセージに出ている通り半角のアルファベットだけです。むしろ解凍後のZIPの中にあったBOOKは、このフォルダ内に見えてはいますが実はここには存在しないのではないかと思います。
- kon555
- ベストアンサー率51% (1845/3564)
一旦該当のExcelファイルを、デスクトップなりcドライブ直下なりに移動またはコピーさせてから、マクロで開こうとして下さい。それで開くならフォルダ名の問題です。 開かないなら、次はコピー後のファイルの名前を「book1」あたりに変更して、同様にマクロで開いて下さい。開くなら、ファイル名の問題です。 あとはエラーメッセージの拡張子がxlsxになっているのに、貴方の書かれているコードではxlsになっているのは気になります。 もしかして「xlsファイルを開くためにxlsxでパスを作っている」みたいな事になっていないか、一度コードを見直して下さい。あるいは一度手動で開き、形式を変更して保存してからテストしても確認できます。
お礼
ありがとうございます。 はい、該当のExcelファイルを、べつのフォルダーに移動またはコピーさせてからそのファイルを選択すればちゃんと開きます。そうしなくとも開く方法を知りたいのです。 また、エラーメッセージの拡張子がxlsxになっているのに、コードではxlsになっているのは、.xls* でアスタリスクを入れてあります。 .xlsxと.xlsmの両方に対応するためです。
お礼
ありがとうございます。 勉強になりました。