[[20200429152943]] 『VBAでzipファイル内のエントリを読み込めない。(』(os) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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ファイルを挟まないとやはり難しいですね。。。

(おっしゃる通り、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

ありがとうございます。大変助かります。
PowerShell禁止ではない環境のため、無事zip内エントリからテキストデータを取得できました。

【コード追記箇所(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.