![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
osはwin7,office2010です。
各県の名前が付いたエクセルファイル(.xlsx)があります。毎回全県のファイルは有りませんが、
例えば、四国内の高知.xlsx、香川.xlsx、愛媛.xlsx、徳島.xlsxが存在したら、この4ファイルを四国.zipとしてツールのようなもので圧縮したいです。
また、このうち1県だけや3県など揃っていなくても、四国の県があれば四国.zipとして圧縮したいのです。
この規則で、大阪、東海、中国、四国、九州をツールのようなもので一括処理したいのですが、webを検索してもなかなか見つかりません。
どなたか教えてください。
よろしくお願いいたします。
No.8ベストアンサー
- 回答日時:
追伸:
内容を書き換えて、もう一度、試しましたら、
"-u -j -m "
で更新されていました。ただ、あれもこれも、ZIP にオプションを付けてはいけないようです。
オプションで進める方針で、設定するなら#6をお使いください。ただし、注意点はオプションの最後にスペースを開けます。
strCommand = " -u -j " ←j の後ろには、半角スペースが入っています。
今回、私は、ゴミ箱に入れる方も作りました。-m オプションで格納されるので問題はありません。自分自身だったら、そのまま使っているとかもしれません。今回、細かい所をあちこちと変えましたが、とても細かくて目で追えるとは思えません。
それから、この部分は忘れないでください。
''※初期条件:パスと拡張子
Const MYPATH = "C:\Users\[MyName]\My Documents\" ''必ず¥が末尾に来ること
Const EXT = ".xlsx"
あとは、#6の画像のように、正しい名称、空白を混ぜないで、ワークシートのリストを作ってください。
'------------------------------------------------
'Option Explicit
Private Declare Function Zip Lib "Zip32j" (ByVal hWnd As Integer, ByVal szCmdLine As String, ByVal szOutPut As String, ByVal dwsize As Integer) As Integer
Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type
Private Const FO_DELETE = &H3& '削除
Private Const FOF_ALLOWUNDO = &H40& 'ごみ箱へ
Private Const FOF_NOCONFIRMATION = &H10& '確認なし
Private Const FOF_NOERRORUI = &H400& 'エラーを表示しない
Private Const FOF_MULTIDESTFILES = &H1& '複数ファイル指定
'----------------------------
''※初期条件:パスと拡張子
Const MYPATH = "C:\Users\[MyName]\My Documents\" ''必ず¥が末尾に来ること
Const EXT = ".xlsx"
'----------------------------
Sub ボタン1_Click()
'シートのデータを拾う
Dim c As Range
'地域は2行目から作ります。
For Each c In Range("A2", Cells(Rows.Count, "A").End(xlUp))
If c.Value <> "" Then
Call FilesFromArea(c)
End If
Next
MsgBox "一応終了しましたが、正しくできたか確認してください。", vbInformation
End Sub
Sub FilesFromArea(rng As Range)
'県名を配列に格納
Dim i As Variant
Dim strArea As String
Dim Prefes As Variant
i = rng.Row
Prefes = Range(Cells(i, 1), Cells(i, Columns.Count).End(xlToLeft)).Value
Prefes = Application.Index(Prefes, 1, 0)
Call XlFilesZipArchive(Prefes) '圧縮プログラムへ
End Sub
Sub XlFilesZipArchive(Filenames As Variant)
'Zip32 による圧縮
Dim strArchiveName As String
Dim strCommand As String
Dim RC As Long
Dim hWnd As Long
Dim strOutPut As String * 512
Dim lngSize As Long
Dim sDir As String
Dim dDir As String
Dim i As Long, j As Long
Dim fn As String
Dim origFn As String
Dim nFilenames As Variant
'ハンドル取得
hWnd = FindWindow("XLMANI", Application.Caption)
sDir = CurDir() '現在のパス
ChDir MYPATH 'パス
'--------削除関連-----------
Dim lpFileOp As SHFILEOPSTRUCT
Dim Result As Long
Dim myFlag As Long
Dim Del_files As String
Dim ret As Long
myFlag = FOF_ALLOWUNDO 'ゴミ箱
myFlag = myFlag + FOF_NOCONFIRMATION '確認なし
myFlag = myFlag + FOF_MULTIDESTFILES '複数ファイル
i = LBound(Filenames)
ReDim nFilenames(UBound(Filenames) - 1)
origFn = Filenames(i) '地域名の取得
j = 0
For i = LBound(Filenames) + 1 To UBound(Filenames)
fn = Dir(Filenames(i) & EXT) '※ここで、実際のファイルの存在を調べる
''fn = Dir(MYPATH & Filenames(i) & EXT) 'フォルダー名付き
If fn <> "" Then
nFilenames(j) = "" & fn & ""
j = j + 1
End If
Next
If Len(Join(nFilenames, "")) = 0 Then MsgBox origFn & "のファイルが見つかりません。", vbExclamation: Exit Sub
strArchiveName = origFn
''strArchiveName = origFn & Format(Date, "yyyymmdd") & Format(Time, "hm")
'-----------圧縮の命令----------
strCommand = " -u -j " & strArchiveName & " " & Join(nFilenames, " ") ' -m 'ZIPオプション
'オプションは、-u 新規格納, -j フォルダー情報は省く -m 格納後削除
lngSize = Len(strOutPut)
RC = Zip(hWnd, strCommand, strOutPut, lngSize)
ChDir sDir
If RC <> 0 Then
MsgBox origFn & "は正しく格納されていない可能性があります。", vbInformation
Else
If MsgBox(Join(nFilenames, ",") & "を削除してよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
'削除の実行
Del_files = Join(nFilenames, vbNullChar)
'構造体に代入
With lpFileOp
.hWnd = hWnd 'ハンドル
.wFunc = FO_DELETE ' 削除命令
.pFrom = Del_files ' 削除するファイル
.fFlags = myFlag '削除方法
End With
ret = SHFileOperation(lpFileOp)
End If
End Sub
WindFallerさま
昨日、時間を忘れていろいろ試したり、ファイルを間引きして実行させたりと確認しました。
オプションについても外したりなど、こんなことができるということに驚いています。
圧縮の際に、zip32.dllも必要なメッセージが出ましたので、これも入手し追加しました。
すべて思い通りにできています。
なかなか初心者から抜けられないので、またよろしくお願いいたします。
本当にありがとうございました。
No.7
- 回答日時:
こんにちは。
#6の回答者です。
「今、バグにも思える部分としては、」の件について。
> "-u -j -m " -u 新規格納, -j フォルダー情報は省く -m 格納後削除
参考:
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
http://openlab.ring.gr.jp/tsuneo/soft/zip32j/zip …
本日中に、もう一度、この部分は検討してみます。万が一には、削除したら、ゴミ箱に入れるようなスタイルに変えます。すみません……。
No.6
- 回答日時:
#5の回答者です。
>ZIPファイルに格納されたファイルについては、不要なので、できれば削除されるとありがたいです。
これは、結果的には、ZIP側にさせることにしました。
"-u -j -m " -u 新規格納, -j フォルダー情報は省く -m 格納後削除
ワークシートにリストを作ってください。(添付の画像を参照のこと)
開発タブ-挿入-フォームコントロールのボタンにマクロを登録します。
'※初期条件の、処理するフォルダーと、拡張子です。
Const MYPATH = "C:\Users\[MyName]\My Documents\" '末尾は、¥が付きます。
Const EXT = ".xlsx"
処理するフォルダーというのは、「格納されるファイルがある所のフォルダー」という意味です。
地域の中のひとつでもファイルがあれば、特にエラーメッセージはでません。
今、バグにも思える部分としては、格納したZIPファイルの中に、同じファイル名がありますと、
更新されてないだけでなく、新しいファイルも無くなる可能性があります。
オプションはあっているつもりですが、実行前に、前のZIPファイルはおいていないほうがよいかもしれませんが、そのままでしたら、以下のように、ZIPに識別の年月日でも入れれば、大丈夫のはずです。
この部分に、
''strArchiveName = origFn
strArchiveName = origFn & Format(Date, "yyyymmdd") & Format(Time, "hm") '日付値が付く
とすれば、[関東201503102337.zip]のようなファイル名になります。
この部分は気をつけてほしいです。
''以下は、実際のコード 2015.03.10
'--標準モジュールの先頭----------------
'Option Explicit '一応、まだ変更の可能性もありますので、Optionにコメントブロックをいれます。
Private Declare Function Zip Lib "Zip32j" (ByVal hWnd As Integer, ByVal szCmdLine As String, ByVal szOutPut As String, ByVal dwsize As Integer) As Integer
Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'----------------------------
''※初期条件:パスと拡張子
Const MYPATH = "C:\Users\[MyName]\My Documents\" ''必ず¥が末尾に来ること
Const EXT = ".xlsx"
'----------------------------
Sub ボタン1_Click()
'シートのデータを拾う
Dim c As Range
'地域は2行目から作ります。
For Each c In Range("A2", Cells(Rows.Count, "A").End(xlUp))
If c.Value <> "" Then
Call FilesFromArea(c)
End If
Next
MsgBox "一応終了しましたが、正しくできたか確認してください。", vbInformation
End Sub
Sub FilesFromArea(rng As Range)
'県名を配列に格納
Dim i As Variant
Dim strArea As String
Dim Prefes As Variant
i = rng.Row
Prefes = Range(Cells(i, 1), Cells(i, Columns.Count).End(xlToLeft)).Value
Prefes = Application.Index(Prefes, 1, 0)
Call XlFilesZipArchive(Prefes) '圧縮プログラムへ
End Sub
Sub XlFilesZipArchive(Filenames As Variant)
'Zip32j.Dll による圧縮
Dim strArchiveName As String
Dim strCommand As String
Dim RC As Long
Dim hWnd As Long
Dim strOutPut As String * 512
Dim lngSize As Long
Dim sDir As String
Dim dDir As String
Dim i As Long, j As Long
Dim fn As String
Dim origFn As String
Dim nFilenames As Variant
'ハンドル取得
hWnd = FindWindow("XLMANI", Application.Caption)
sDir = CurDir()
ChDir MYPATH
i = LBound(Filenames)
ReDim nFilenames(UBound(Filenames) - 1)
origFn = Filenames(i) '地域名の取得
j = 0
For i = LBound(Filenames) + 1 To UBound(Filenames)
fn = Dir(Filenames(i) & EXT) '※ここで、実際のファイルの存在を調べる
''fn = Dir(MYPATH & Filenames(i) & EXT) 'フォルダー名付き
If fn <> "" Then
nFilenames(j) = """" & fn & """"
j = j + 1
End If
Next
If Len(Join(nFilenames, "")) = 0 Then MsgBox origFn & "のファイルが見つかりません。", vbExclamation: Exit Sub
strArchiveName = origFn
''strArchiveName = origFn & Format(Date, "yyyymmdd") & Format(Time, "hm") '日付値が付く
'-----------圧縮の命令----------
strCommand = "-u -j -m " & strArchiveName & " " & Join(nFilenames, " ")
'オプションは、-u 新規格納, -j フォルダー情報は省く -m 格納後削除
lngSize = Len(strOutPut)
RC = Zip(hWnd, strCommand, strOutPut, lngSize)
ChDir sDir
If RC <> 0 Then
MsgBox origFn & "は正しく格納されていない可能性があります。", vbInformation
End If
End Sub
![「エクセルファイルをグループ毎に圧縮したい」の回答画像6](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/3/1138040_54ff037d01c4a/M.jpg)
WindFallerさま
ありがとうございます。とりあえずリストの作成が完了しましたので、モジュールを貼り付けて加工してみます。
No.5
- 回答日時:
こんばんは。
Excel VBA マクロでも、そんなにむつかしいことではありませんが、何度もやり直しになるのは嫌ですから、確認させてください。最後、ZIPファイルに格納され、残されたファイルは、どうするのでしょうか?
ボタンをひと押しで、全部のデータを、それぞれの地域にまとめることは可能です。
しかし、この前の質問者さんのように、zipのdllがないとなると、話が振り出しになってしまいます。おまけに、会社に掛けあっても、許可されないとなっていました。Windows内蔵のものは、ものすぐこ使いづらいのです。会社で使うとなると、以下のものでは承認がおりないことがあります。本家のものは有償です。また、アーカイバに内蔵された圧縮ソフトでは、コマンドのみの指示を受けません。
一応、
C:\Windows\System32\ZIP32J.DLL
で行われます。
http://www.vector.co.jp/soft/win95/util/se062163 …
肝心な確認が取れてないままですと、無駄になってしまいます。
どうぞ、ご確認ください。
WindFallerさま
ご連絡ありがとうございます。
進め方について丁寧にご連絡いただき感謝です。
まずは、ZIPファイルに格納されたファイルについては、不要なので、できれば削除されるとありがたいです。
また、DLLについてはフリーソフトなのでDLに問題はありません。
とてもワクワクしています。
よろしくお願いいたします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
No.4
- 回答日時:
kushiroshiさま
親身にご連絡いただき感謝です。
このページにはたどり着いたのですが、指定した拡張子すべてが対象となるため、地域・県毎の取りまとめについては対応できないようです。
しかしながら、本当に感謝です。ありがとうございます。
No.3
- 回答日時:
bonaronさま
ご連絡いただきありがとうございます。
これも参考になりそうです。
あらかじめ、フォルダを作成し作業するようですね。
できれば、楽ができないかということで、指定した県のファイルをあらかじめ指定した地域名で圧縮 これができないかを探しています。
ありがとうございました。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
No.1
- 回答日時:
kushirosiさま
回答を頂きありがとうございます。
手で圧縮する方法も有りますが、毎日の事なのでできるだけ楽に作業がしたいため、ツール形式で自動で実行される方法を探しています。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA ふたつの同じ様式シートのセルをコピーしたい 2 2023/03/08 15:28
- Excel(エクセル) ドキュメントに保存していたエクセルのファイルが開きません。 2 2022/12/02 09:38
- Excel(エクセル) 1つのファイルを3つのフォルダにファイル名を【明日の日付】にして、コピーをしたい 2 2022/12/21 17:43
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- HTML・CSS エクセルのファイルのダウンロード 前にアップしたファイルがダウンロードされる 1 2022/11/13 13:02
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/11 11:05
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで「ページレイアウト...
-
エクセルの数式バーのフォント...
-
2列に入っているデータを1列...
-
【Excel】別シートから条件に合...
-
EXCELの散布図で日付が1900年に...
-
エクセルをエクセレントに究める
-
F9キーについて。
-
Excelの数式について教えてくだ...
-
数字入力後他の文字等が表示さ...
-
Excelセルを跨いで合計を出す方法
-
計算能力
-
【ExcelVBA】ダブルクォーテー...
-
エクセルのツールバーから数値...
-
エクセル関数を使って
-
エクセル シート表示
-
エクセルでファイルの最終更新...
-
Excel 2019 [オプション]の[リボンのユ...
-
特定の文字列を含む、住所を抽...
-
祝日と土曜、日曜の合計をカウ...
-
Excel分数の表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンに詳しい方教えて下さ...
-
バッチファイルでディレクトリ...
-
Windows上のファイル操作の履歴...
-
ipadで社内ネットワークに接続
-
データベースファイル 機種変の...
-
指定ファイルをFTPで自動アップ...
-
Zipファイルをエクセルに指定変...
-
複数のテキストファイルの特定...
-
Lhaplusが発したと、みられるエ...
-
CSVファイルのマッピング処理の...
-
SystemWalker Centric Manager...
-
別のフォルダにファイルを移動...
-
どうしたらいいか教えて下さい。
-
sftp時の公開鍵認証
-
ダンプツールとは?
-
Batファイルでhostsを追加したい
-
ホームページビルダー17のサイ...
-
jarファイルが開けない
-
postfixの.forwardでメールの転...
-
caclsコマンド実行時のサーバ負荷
おすすめ情報
質問に追加で、できればexcel VBA でお願いします。