(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と関連する良く見られている質問

Q現在のC/C++とjavaの長所短所について

最近プログラミングをかじり始めた初心者です。
C/C++とjavaの本当に基礎的な部分だけ学んだのですが、まだ大規模なプログラムなどを組んだ経験がなく、それぞれの長所短所というものがいまいち分かりません。
自分で感じたりネットで調べた限りでは
・javaはOSなどに左右されず動くことが最大の利点
・コンパイル方式の関係でC/C++の方が動作が速い
・組み込み系では細かく管理できコンパクトに収められるC言語が有利
くらいなのですが、これ以外に大きな違いなどはあるでしょうか?
それと「昔はjavaが遅いと言われていたが、最近ではそれほどでもなくゲーム開発でも使われ始めた」というようなことも聞いたのですが、そのように昔言われていたが今では違うというようなことはあるでしょうか?
ご回答よろしくお願いします。

Aベストアンサー

大体間違ってないんじゃないですかねぇ。

基本的には、

・C++/Javaはオブジェクト指向言語
・Cは手続き型言語

と言うパラダイムの違いはあります。
Java自体はBetter C++となる、と言う目的の為に作られました。
そしてC++はCの上位互換を目指してデザインされました(ただし、今は言語仕様上必ずしもそうはなっていません)。

> ・javaはOSなどに左右されず動くことが最大の利点

はい、一般的にはそう言われています。
ただ、Javaと言う言語仕様と実装、ってのは別次元の話で、これは実装の話、しかもOracleと言うJavaの権利を握っている会社が提供してる「公式の」Javaの話ですね。
実はJavaの言語仕様に則ったOracle以外の別の実装もあることはあって、「Javaと言う言語(仕様では)」って事でもないんです。
「公式の」Javaの場合、コンパイルして吐き出すコード、「ネイティヴ」と呼びますが、要するにコンピュータ自体が直接解釈実行するマシン語ではないんです。
対象はJava仮想マシン(Java Virtual Machine = JVM)と言うソフトウェアなのです。
つまり、「公式の」Javaの場合、その仮想マシンがプラットフォーム別(例えばWindows、MacOS、Linux等)に用意されてて、そこは変えないといけないわけですが、その上で走る「Javaのコードは共通である」って言う設計をしてるんですね。
つまり、マシンの差は「仮想マシンが吸収する」と言うやり方なんです。
ただ、例えば互換のgcj(GNU Compiler for Java)なんかはネイティヴ・コードを吐き出したりも出来ます。
(ただ、最新のJava8にはまだ追っついてないとは思います)

GCJ:
https://gcc.gnu.org/java/

OpenJDK:
http://openjdk.java.net

> コンパイル方式の関係でC/C++の方が動作が速い

これも大体その通りだと思います。
C/C++とJavaの差は、Javaは仮想マシン前提の設計ですが、「一般的には」C/C++は直接マシン語(と言うか実際はアセンブリ言語)を吐き出します。要するに、(公式のJavaと比べた場合、)コンピュータ全体の作業が一段階少ないわけですね。
ただ、実の事を言うと、言語仕様上はC/C++は「コンパイラです」とは指定されてません。
で、探せばC/C++のインタプリタなんかもあるんで、必ずしもC/C++が「確実に速い」とも言えないんです(一般的にはインタプリタはコンパイラより遅い、と言われてます)。

例: Cling(C++インタプリタ):
https://root.cern.ch/cling

> 組み込み系では細かく管理できコンパクトに収められるC言語が有利

これもその通りだと思います。

> そのように昔言われていたが今では違うというようなことはあるでしょうか?

あります。
CPUも速くなってますし、メモリもJavaが登場した90年代のコンピュータより多く積んでますし、あとはJVM、つまり先ほど書いた仮想マシンですよね、その実装も良くなってるでしょう。

・1995年の一般的なコンピュータのメモリ:32Mb〜64Mb -> 2016年の一般的なコンピュータのメモリ:Gbレベル(最低でも32倍以上)
・1995年の一般的なコンピュータのCPUの周波数: 66MHz辺りから -> 2016年の一般的なコンピュータのCPUの周波数: 1GHz突破〜2GHz以上(最低でも15倍以上)

つまり今は、別にJavaに限らないですが、昔のコンピュータの「リソースがとにかくすぐ足りなくなる」と言うような状況と違って

「何が何でも速度を稼ぐ為にC/C++を使わなければいけない」

と言うようなクリティカルな状況はそうそうなくなってきました。
本当に速度が必要な、って状況じゃなければ、組み込みでもない限り、そんなにC/C++を使わなくちゃいけない、と言うような必然性は薄れては来てると思います。

大体間違ってないんじゃないですかねぇ。

基本的には、

・C++/Javaはオブジェクト指向言語
・Cは手続き型言語

と言うパラダイムの違いはあります。
Java自体はBetter C++となる、と言う目的の為に作られました。
そしてC++はCの上位互換を目指してデザインされました(ただし、今は言語仕様上必ずしもそうはなっていません)。

> ・javaはOSなどに左右されず動くことが最大の利点

はい、一般的にはそう言われています。
ただ、Javaと言う言語仕様と実装、ってのは別次元の話で、これは実装の話、しかもOracleと...続きを読む

QPython33\Scripts\easy_install-3.3.exe

Python 3系 64bit版 を Windows10 64bit版にインストールしました。
Scriptsフォルダに、3.3付きのexeと付いていないexeが存在しますが、
その違いは何ですか?
(ex.) pip.exe , pip3.3.exe

Aベストアンサー

> その違いは何ですか?

同じものです。
Linux系のOSにインストールした場合は、pipはpip3.3へのシンボリックリンクとなります。ファイル本体pip3.3で、pipはあくまでもリンクです。
(シンボリックリンクは、ショートカットアイコンの様なものとお考えください)

昔のWindowsでは、このリンク機能が無かったのでファイルそのものをコピーして対応していました。今もその名残りでpip3.3.exeをコピーしてpip.exeを作成しているのだと思います。

Q以下のページ内の用語の意味を教えてください。 https://ja.wikipedia.org/w

以下のページ内の用語の意味を教えてください。

https://ja.wikipedia.org/wiki/%E9%81%85%E5%BB%B6%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

>OITが強く要求される場合においては、遅延シェーディングは

この"OIT"とは一体なんなんでしょうか?

Aベストアンサー

すぐ上に書いてあるじゃないですか。

順序非依存の透明度 (en:Order-independent transparency, OIT)

QMaximaで一括でA:123、B:456, ...する

Maximaにて値の割り当て
A:123$
B:456$
...
が出来ます。これを一行
assign([A,B,...], [123,456, ...])$
とする方法(上のassignは仮)はないでしょうか。

Aベストアンサー

assign あたりをキーワードにしてヘルプを見ると見つかるよ.

Qmkdir -p ~/.vim/bundleの~とは、どう言う意味でしょうか。

mkdir -p ~/.vim/bundleの~とは、どう言う意味でしょうか。

宜しくお願いします。

Aベストアンサー

この場合は「ログイン名が空文字列」に相当するので、 $HOME と同じになります。

文脈で展開内容は変わります。
例えば ~usui-2015/ だったら、 ユーザーusui-2015のホームディレクトリになります(usui-2015が存在していれば)


先に書いたように、展開するのはシェル役目です。
そのため、実際に実行するコマンドを確認できます

・echoコマンドの引数に指定する
echo mkdir -p ~/.vim/bundle

・set -x でトレースを有効にする


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

人気Q&Aランキング

おすすめ情報