(1)作業環境
Windows 7 Professional SP1
Intel(R) Core(TM) i3­3240 CPU @ 3.40GHz 4.00GB
32ビットオペレーティングシステム
Microsoft Office Standard 2010
Excel ver.14


(2)やりたいこと
3つのファイルのzipファイルを同じフォルダに作成したい
  C:\temp\a.txt
  C:\temp\b.txt
  C:\temp\c.txt
  から
  C:\temp\d.zip
  を作りたい。


(3)状況
下記サイトを参照しましたが知識不足で正確にわからないのと、『本当にこんなに長いコードが必要なのか?』と疑問に思っています。

 参考①VBAでZIP圧縮する。
 http://scripting.cocolog-nifty.com/blog/2007/11/ …

 参考②ファイル/フォルダをzipファイルに圧縮
 http://qiita.com/kou_tana77/items/72346c69107fab …

定義、ループ、分岐など基本的なことは分かっています。
APIやFSOなども詳しくはないですが、知っています。
たとえば①の「fso.*******」、「Shell.*******」などの、*******が分かりません。


(4)質問事項
余計なものは除いて必要最低限のコードだけにするとどのようになるかしりたいです。
※エラー処理などに関しては使用環境にあわせて作成します。


ご存じの方ご教示くださいm(_ _)m

質問者からの補足コメント

  • ありがとうございます。
    ここに掲載するときは見やすいように外しちゃいましたが、実際は上記の待つ作業ないとエラーになりました。

    回答いただいたマクロをもとに実用箇所にアレンジすることができました。
    ありがとうございました^_^

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/01/26 20:23

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんな感じでしょうか?


・既に圧縮書庫ファイルが存在する場合は上書きされます。
・指定した被圧縮ファイルが存在しなかった場合はハングアップします。

-----------------------------
Sub MakeZip()
Dim sfo As Object, app As Object
Set sfo = CreateObject("Scripting.FileSystemObject")
Set app = CreateObject("Shell.Application")

Dim zipFolder As Object
Dim file As Variant
Dim count As Long

Const zipFile = "C:\excel\圧縮.zip" '圧縮書庫ファイルの絶対パス
Dim files As Variant
files = Array("C:\excel\あ.txt" _
, "C:\excel\い.txt" _
, "C:\excel\う.txt") ' 圧縮するファイルの絶対パス

'空のzipファイルを作成する
With sfo.CreateTextFile(zipFile, True)
.Write "PK" & Chr(5) & Chr(6) & String(18, 0)
.Close
End With
Set zipFolder = app.Namespace(sfo.GetAbsolutePathName(zipFile))

'zipファイルに圧縮対象のファイルをコピーする
count = 0
For Each file In files
count = count + 1
zipFolder.CopyHere (sfo.GetAbsolutePathName(CStr(file)))
'このファイルのコピーが終わるまで待つ。
Do Until zipFolder.Items().count = count
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Next
Set sfo = Nothing
Set app = Nothing
Set zipFolder = Nothing
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます。
必要な分のみを書き出すと、
-----------------------------
 '空のzipファイルを作成する
 With sfo.CreateTextFile("C:\temp\d.zip", True)
  .Write "PK" & Chr(5) & Chr(6) & String(18, 0)
  .Close
 End With
 Set zip = app.Namespace(sfo.GetAbsolutePathName("C:\temp\d.zip"))
 '作成したzipファイルにファイルをコピー
 zip.CopyHere (sfo.GetAbsolutePathName("C:\temp\a.txt"))
 zip.CopyHere (sfo.GetAbsolutePathName("C:\temp\b.txt"))
 zip.CopyHere (sfo.GetAbsolutePathName("C:\temp\c.txt"))
-----------------------------
ということですね!
とてもシンプルになり、これでいろいろアレンジして使用できます。
ベストアンサーにしたいのですが、ついでに
.Write "PK" & Chr(5) & Chr(6) & String(18, 0)
は何をしているのかも教えていただけないでしょうか?

お礼日時:2016/01/26 13:05

No.1です。



> .Write "PK" & Chr(5) & Chr(6) & String(18, 0)
> は何をしているのかも教えていただけないでしょうか?

ZIPファイルの終端レコードを示すデータを新規作成したファイルに書き込んでいます。
これにより作成したファイルが「空のZIPファイル」と認識されるようになります。


あと気になったのですが
お礼をいただいた中のソースにファイル一つずつのコピー(圧縮)終了を待つ記述(下記)がありません。
この記述が無いとZIPファイルに複数の被圧縮ファイルを追加する際に取りこぼしが生じる可能性があります。


count = 0
For Each file In files
count = count + 1
zipFolder.CopyHere (sfo.GetAbsolutePathName(CStr(file)))
'このファイルのコピーが終わるまで待つ。
Do Until zipFolder.Items().count = count
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Next
この回答への補足あり
    • good
    • 2
この回答へのお礼

今携帯から投稿していて、サイトがかなり使いづらく補足というところに記入してしまいました。

本当はここに記載する内容でした。
ありがとうございました。、

お礼日時:2016/01/26 20:26

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC:\Windows> から C:\Windows\Win98>への変更方法

次のMS DOSプロンプトの状態から
C:\Windows>

次のMS DOSプロンプトの状態にしたい。
C:\Windows\Win98>

色々試して見ましたがうまくいきませんので、教えてください。テストした結果は以下の通りです。

C:\Windows> CD \   と入力してEnterします
C:\>CD C:\Windows\Win98  と入力してEnterします

ディレクトリーの指定が違いますと、表示されてうまくいきません。

Aベストアンサー

>C:\>CD C:\Windows\Win98  と入力してEnterします

↑で別に間違ってはいないので、"C:\WINDOWS\win98"ディレクトリが存在しないのでは?

dir c:\windows\win98

で確認してみた方が良いと思います。

Qcat `find ./` > for_print.txt にファイル名を入れたい!

カレントディレクトリ以下のファイルを連結したいのですが、
cat `find ./` > for_print.txt
に「ファイル名」と、
あと、「区切り」がわかるように
********************************
を入れたいのですが、
どうしたら良いでしょうか?

Aベストアンサー

セパレータの形式にこだわらないのであれば、
more `find ./` > for_print.txt
とか、
tail +0 `find ./` > for_print.txt
とか。

Qruby "\001\376".unpack("C*") => [1, 254]の意味

"\001\376".unpack("C*") => [1, 254] の
[1, 254]ってどういう数字を意味するのですか?8ビット整数なのに配列で結果が出ていることの意味がわかりません。ご教授ください。

Aベストアンサー

"\001\376"
は、バイナリ文字列で
"C*"

バイトとして数値を取り出し配列にする
ということだと思います。
\376は、8進数で、10進にすると254になります。
見当違いだったらすみません。

QC#、VB.NET、C++.NETでのメモリ確保の質問

投稿カテゴリに.NETの言語のカテゴリが無いのが
残念ですが、.NET言語に関する質問をさせてください。

C#でWin32アプリとやり取りするアプリケーションを
作っていて、プログラム内でメモリ確保をする必要があります。
Marshal.AllocCoTaskMem()とMarshal.AllocHGlobalが()
ありますが、これらは動作にどのような違いがあるのでしょうか。

ヘルプなどを読みましたが、よく分かりませんでした。。

Aベストアンサー

あ、言い方を変えると
Marshal.AllocCoTaskMem()
タスク終了時に開放されるメモリ領域
Marshal.AllocHGlobalが()
タスク終了しても開放されないメモリ領域
の違いでは?
通常はMarshal.AllocCoTaskMemを使えば良いんだろうと思います。
まったく知らないので全部想像ですが^^;

QC#の演算でオーバーフローしてるみたいなのですが....

C#の演算でオーバーフローしてるみたいなのですが....

8行8列の逆行列を計算するために
C#で逆行列を掃き出し法を使って計算するプログラムを作ったんですが,どうやら,途中でオーバーフローしているみたいで困っています.
行列の各成分はdouble型で保持しています.


今まで,オーバーフローするような桁数の計算を
プログラムで扱ったことがないので,対策方法がわかりません.
みなさんは,オーバーフローにはどのような対策をしているのでしょうか?


どなたか,知恵を貸していただけないでしょうか?
よろしくお願いします.

Aベストアンサー

演算でオーバーフローになるのは、0に限りなく近い値で除算している場合がほとんどです。

例えば、
1-0.1×10
の計算をしたとき、0になるとは限りません。
処理系によっては、0ではなく、10^(-50)のようなの0に限りなく近い値になる場合があります。
それで除算をするとオーバーフローすることがあります。

対策としては、
0に限りなく近い値は0にする
という処理をします。

(0除算のチェックは当然していますよね)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報