[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAでzipファイル内のエントリを読み込めない。(Cドラアクセス禁止環境)』(os)
前提:PCのセキュリティが厳しくてDLLの導入等ができない状況です。ハードディスクへの書き込みが禁止された環境であり、ネットワークドライブにしかファイルが保存できない環境です。
質問内容:以下コードにつき、txtPath(テキストファイル)ではなく、zipファイル内の特定の名称のエントリ(zip内テキストファイル)を読み込むようにしたいのですが、何か方策がありましたらご教示いただきたくお願い申し上げます。
・shift-JIS用
Sub read_shift_JIS(txtPath As String, (引数後略))
Dim buf As String Open txtPath For Input As #1 (中略) Close #1 (後略)
・ユニコード用(UTF-8・UTF-16)
Sub read_Unicode(txtPath As String, (引数中略), encode As String)
With CreateObject("ADODB.Stream")
.Charset = encode .Open .LoadFromFile txtPath bufs = .ReadText .Close End With (後略)
< 使用 Excel:Excel2016、使用 OS:Windows10 >
Zipファイルの中のテキストファイルを直接開くのは難しいので、 いったん tempフォルダにコピーしてから開いたらどうでしょう。
>ハードディスクへの書き込みが禁止された環境 って、tempフォルダにも書き込みできないんでしょうか? その場合、ネットワークドライブにtempファイルをつくらないとだめかも (´・ω・`) 2020/04/29(水) 18:44
(おっしゃる通り、tempフォルダにcopyhereでzip内のエントリをコピーしてそれを読むという方法等がありますが、展開後のテキストファイルのサイズが大きく時間がかかってしまうこと、割り当てられているネットワークドライブの容量が小さいこと、回線に負荷をかけてしまうことから、zipの状態で直接アクセスする方法がないかと思い悩んでおりました。。あとは、SASでzipファイルのエントリに直接アクセスするとファイルの読み込みが格段に早くなったので高速化を期待する面もあります。)
(os) 2020/04/29(水) 19:08
とりあえずできた・・・のか?
Option Explicit
'targetZIPFilePath : zipファイルをフルパスで指定 'targetTextFile : 読み出すテキストファイルを指定 'charSet : BOM なしテキストファイルの文字セットを指定
'PowerShell + .Net FrameWork 4.5 以降 + クリップボード(Clip.exe)使用のテキスト取得 '宣言修正で一応 VBS でも動く
Sub getTextinZip(targetZIPFilePath As String, targetTextFile As String, Optional charSet As String = "")
Dim textEncode As String If charSet = "" Then textEncode = "" Else textEncode = ",[System.Text.Encoding]::GetEncoding('" & charSet & "')" End If
Dim PSScript As String PSScript = Join(Array("PowerShell.exe """, _ "$OutputEncoding = [System.Text.Encoding]::GetEncoding('utf-16');", _ "Add-Type -AssemblyName 'System.IO.Compression.FileSystem';", _ "$stm = New-Object System.IO.StreamReader(", _ "[System.IO.Compression.ZipFile]::OpenRead('", _ targetZIPFilePath, _ "').GetEntry('", _ Replace(targetTextFile, "\", "/"), _ "').Open()", _ textEncode, _ ");$stm.ReadToEnd()|Clip;$stm.Close();"""), "")
CreateObject("WScript.Shell").Run PSScript, 0, True
'確認用 CreateObject("WScript.Shell").PopUp CreateObject("htmlfile").ParentWindow.clipboardData.GetData("text")
End Sub
使い方 getTextinZip "C:\Users\UserName\Downloads\sample.zip", "folderName\textFile.txt", "shift_jis"
Win10 なら Powershell 禁止でない限り、動くんじゃないかな。保障は出来ないけど。 (2u) 2020/05/01(金) 00:23
【コード追記箇所(zipファイルの処理はユニコードPGMに寄せた)】
Private Sub read_Unicode(zipbit As Long, txtFolder As String, txtFile As String, (引数中略), encode As String)
If zipbit = 0 Then
(中略)
Else
getTextinZip txtFolder, txtFile, encode buf = Split(Trim(CreateObject("htmlfile").ParentWindow.clipboardData.GetData("text")), vbCrLf) End If (後略) (os) 2020/05/02(土) 16:55
× buf = Split(Trim(CreateObject("htmlfile").ParentWindow.clipboardData.GetData("text")), vbCrLf)
〇 buf = Split(CreateObject("htmlfile").ParentWindow.clipboardData.GetData("text"), vbCrLf)
buf(0) = Mid(buf(0), 2, Len(buf(0))) (os) 2020/05/02(土) 18:32
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.