痔になりやすい生活習慣とは?

VB.NET (.NET Framework 4.5)にて、ファイルのZIP圧縮をしたいと
思い、.NET4.5から追加になったZipArchiveクラスを利用しようと
考えています。MSDNやらその他解説サイトなどを見てみると、
フォルダ内にあるファイルをフォルダごと圧縮する方法ばかり書いて
あるのですが、フォルダにある特定の1ファイルだけをそのフォルダ内
に圧縮したいと思っています(圧縮のパスはファイルのみでディレクトリは含まない)
ZipArchiveクラスでは、こういった圧縮は出来ないのでしょうか?
もし出来るのであれば、やり方をご教授ください。

A 回答 (1件)

試した訳ではないですが、MSDNのサイトを見ると・・・。



ZipFile.CreateFromDirectory
https://msdn.microsoft.com/ja-jp/library/hh485707(v=vs.110).aspx
これで、フォルダから簡単にZIPが作成出来るので、サンプルが多いのではないでしょうか?

ZipFileExtensions.CreateEntryFromFile メソッド
https://msdn.microsoft.com/ja-jp/library/hh485720(v=vs.110).aspx
このメソッドで一つのファイルを圧縮出来そうに見えますが???
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご教授頂いたMSDNのドキュメントを参考にさせていただきます。

お礼日時:2016/01/04 12:48

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

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

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

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

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVBA zipファイルの作成

(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/vbazip_a144.html

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

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


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


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

(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)状況
下記サイトを参照しましたが知識不足で正確にわからないのと、『本当にこんなに長いコードが必要なのか?』と疑問に思ってい...続きを読む

Aベストアンサー

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

-----------------------------
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

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

-----------------------------
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" '圧縮書庫ファイルの絶...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q[VBA]標準機能のみでパス付zipファイルの解凍

いつもこちらの識者の皆様にはお世話になっております。
VBAのことで質問させてください。

環境はwindows7 Pro
Excel2010(14.0.7128.5000) 32bit
です。

掲題のとおり、パスワード付のzipファイルを解凍しいたいのですが、調べてもやり方が分からず困っています。

■やりたいこと
外部アプリケーションを使わずにWindows7の標準機能のみで"C:\aaa\bbb.zip"をパスワード"111"で解凍する

会社で使っているのですが、アプリケーションのインストールが禁止されており、
毎日複数のパスワード付zipファイルを手動で解凍して処理をしています。
効率を考えVBAで処理したいのですが、どなたか上記内容の場合どのようなコードが適しているか
教えていただけませんでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんばんは。
>>ついでに、その掲示板の質問者さんは、・・・
>実はこの質問も僕なんです。
失礼しました。気が付きませんでした。(^^;

>zipfldr.dllで圧縮・解凍処理をしてるんですね。
これが、私には使いこなせなかったのです。それで、試行錯誤の上、結局、Shell.Application で任せてしまいました。(おそらく、古い環境では動きません)

>ひとまず単一のパス付きzipファイルを解凍するコードをご教示いただければありがたいです。
実に、へんてこなコードですが、試してみてください。こちらの環境ではうまくいきましたが、他人の環境では、失敗する可能性が結構あります。Sendkeyは、Win32 API関数の方が確実ですが、仰々しくなってしまいます。


'//
Sub OneZipExtract()
 Dim fn As Variant
 Dim DestFolder As Variant
 Dim objZip As Variant
 '出来る限り、VBEditor は閉じていたほうがSendkeyの誤動作から免れます。
 Const PSWD As String = "000" 'パスワード
 DestFolder = "C:\aaa\" '展開フォルダ 末尾は、¥(セパレータ)を置くようにしてください。
 
' fn = Application.GetOpenFilename("ZIPファイル*.zip(*.zip),*.zip")
' If VarType(fn) = vbBoolean Then Exit Sub
 fn ="C:\aaa\bbb.zip"  'キメウチ・ファイル名
 ' DestFolder = Mid(fn, 1, InStrRev(fn, "\")) '展開ファルダが、ZIPファイルのある場所の場合
 Set objShell = CreateObject("Shell.Application")
 Set objZip = objShell.Namespace(fn).Items
 Application.SendKeys PSWD & "{Enter}"
 objShell.Namespace(DestFolder).CopyHere (objZip) '*
 Set objShell = Nothing
End Sub
'//

*確実にZIPファイルが展開できたかは、このようにすると良いです。
 ret = objShell.Namespace(DestFolder).CopyHere(objZip)
 If ret > 0 Then
   MsgBox "失敗しました。", 48
 End If

こんばんは。
>>ついでに、その掲示板の質問者さんは、・・・
>実はこの質問も僕なんです。
失礼しました。気が付きませんでした。(^^;

>zipfldr.dllで圧縮・解凍処理をしてるんですね。
これが、私には使いこなせなかったのです。それで、試行錯誤の上、結局、Shell.Application で任せてしまいました。(おそらく、古い環境では動きません)

>ひとまず単一のパス付きzipファイルを解凍するコードをご教示いただければありがたいです。
実に、へんてこなコードですが、試してみてください。こちらの環境ではうま...続きを読む

Q【.net framework 3.5】インストールしたのに、インテリセンスキーで新クラスが参照できない。

いつも大変お世話になっております。
VC++ 初心者です。

現在、WindowsXp (Sp3)で
VC++2005(CLR)(Express Edition)でプログラミングしております。

.net framework 3.0から
System.IO.Packaging.ZipPackageを利用して
zip圧縮できる、と掲載されていたので、
早速インストールしました。

しかしながら、インテイセンスキーで
System::IO::と入力していってもPackagingという項目が
出てきませんでした。

このインテリセンスキー問題を解消し、
ファイルをzip圧縮、解凍するにはどのようにしたら宜しいでしょうか

宜しければ、ご教授頂きたくお願いします。

Aベストアンサー

WindowsBase.dllへの参照設定は追加しましたか?
MSDN: ZipPackage クラス (System.IO.Packaging)
http://msdn.microsoft.com/ja-jp/library/system.io.packaging.zippackage.aspx

なお,「Zipパッケージ」と「Zip書庫」は別物なので注意してください。
.zipファイルの圧縮・展開を行いたいのであれば,DOBON.NETさんの記事
Site: ZIP書庫の作成(圧縮)、展開(解凍)、閲覧を行う: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/links/createzipfile.html
などを参考にすると良いでしょう。

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QVB.NETのListBoxで指定した項目のValueを取得する方法

ListBoxで現在選択している項目のValueを取得する方法はわかるのですが、X個目のValueの値を参照、設定する方法がわかりません。教えてくださいー

Aベストアンサー

>選択した店舗の店舗番号を取得したいんです。
MSDN のListBox のサンプルをComboBox にして今回の質問に合わせて修正したものを以下に挙げておきます。
コマンドプロンプトで
vbc sample.vb
sample
でそのまま実行して試してみることができます。
要点は、DataSource でArrayListをつないでおくということです。
DataSource を使うとSelectedValue で取り出せるので便利ですね。

でもまあ、
こんなふうにしなくても、別にArrayListで保持しているのがわかっていれば、index で対応付けをして取り出したり設定したりできます。
'---------------------------------------------------------------
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Collections

Public Class Store

Private aStoreName As String
Private aStoreNo As Integer

Public Sub New(ByVal name As String, ByVal no As Integer)
MyBase.New()
Me.aStoreName = name
Me.aStoreNo = no
End Sub

Public ReadOnly Property StoreName() As String
Get
Return aStoreName
End Get
End Property

Public ReadOnly Property StoreNo() As Integer
Get
Return aStoreNo
End Get
End Property

Public Overrides Function ToString() As String
Return Me.aStoreName & " - " & Me.aStoreNo
End Function
End Class


Public Class ComboBoxSample
Inherits Form
Friend WithEvents cmbStoreList As ComboBox = New ComboBox()
Dim textBox1 As TextBox = New TextBox()

<System.STAThreadAttribute()> _
Public Shared Sub Main()
System.Windows.Forms.Application.Run(New ComboBoxSample())
End Sub

Public Sub New()
Me.AutoScaleBaseSize = New Size(5, 13)
Me.ClientSize = New Size(292, 181)
Me.Text = "ComboBox Sample"

cmbStoreList.Location = New Point(24, 16)
cmbStoreList.Name = "cmbStoreList"
cmbStoreList.Size = New Size(232, 130)


textBox1.Location = New Point(24, 160)
textBox1.Name = "textBox1"
textBox1.Size = New Size(40, 24)
Me.Controls.AddRange(New Control() {cmbStoreList, textBox1})

Dim Stores As New ArrayList()
Stores.Add(New Store("A店", 15))
Stores.Add(New Store("B店", 20))
Stores.Add(New Store("C店", 45))
Stores.Add(New Store("BLUE店", 99))

cmbStoreList.DataSource = Stores
cmbStoreList.DisplayMember = "StoreName"
cmbStoreList.ValueMember = "StoreNo"

End Sub

Private Sub InitializeComponent()

End Sub

Private Sub cmbStoreList_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbStoreList.SelectedValueChanged
If cmbStoreList.SelectedIndex <> -1 Then
textBox1.Text = cmbStoreList.SelectedValue.ToString()
End If
End Sub
End Class

>選択した店舗の店舗番号を取得したいんです。
MSDN のListBox のサンプルをComboBox にして今回の質問に合わせて修正したものを以下に挙げておきます。
コマンドプロンプトで
vbc sample.vb
sample
でそのまま実行して試してみることができます。
要点は、DataSource でArrayListをつないでおくということです。
DataSource を使うとSelectedValue で取り出せるので便利ですね。

でもまあ、
こんなふうにしなくても、別にArrayListで保持しているのがわかっていれば、index で対応付けをして取り出し...続きを読む

Q【Excel VBA】Windowsの標準機能のみでExcelファイルをZIPファイルに圧縮する方法

質問させて下さい。

Lhaplus などを使用(導入)することなく、Windows7の標準機能のみでExcelファイルをZipファイルに圧縮する事は可能なのでしょうか?

マクロの動作としては、
1.作業中のBOOKから必要なシートのみをコピーし別BOOKとして保存
2.別BOOKとして保存したファイルを、同一フォルダ内にZipファイルとして圧縮
3.別BOOKを削除

上の1.と3.は出来たのですが、
2.の圧縮についてが、理解できずにおります。
自分なりに調べたところ、Lhaplus をShell関数などで指定し圧縮をする方法などは紹介されていたのですが、Windows7の標準機能のみZip圧縮を行う事は可能なのでしょうか?

ご存知の方がいましたら、ご教授いただければ幸いです。

Aベストアンサー

こんにちは。

>2.別BOOKとして保存したファイルを、同一フォルダ内にZipファイルとして圧縮
というのは、2007以降のOffice ファイルは、拡張子が変わっただけで、本来は、Zipファイルなのです。あえて、Zipで圧縮する必要があるか分かりませんが、アーカイブに格納ということで、やってみました。

#2さんのリンク先とは、仕組み自体は同じですが、
Set Shell = CreateObject("Shell.Application")
zFolder.CopyHere sFolderItem
で、ZIPフォルダが認識しないことでした。そこで、何度もやった結果、事前に参照設定することで解決しました。

'//
Sub Files2Zip()
  Dim myPath As String
  Dim ZipFName As String
  Dim ZipFNameB As String
  Dim FName As Variant
  '要参照設定
  'Microsoft Shell Controls and Automation
  Dim objShell As Shell32.Shell 'レイトバインディングだと抜けがあります。
  Dim ar As Variant, fn As String
  Dim i As Long, j As Long, k As Long
  myPath = ThisWorkbook.Path & "\" '任意の場合は、必ず末尾に¥を入れること
  
  ZipFNameB = myPath & "MyFilesABC" ' & ".zip" "圧縮名
  ZipFName = ZipFNameB & ".zip"
  
  '一意の出力ファル名の決定
  fn = Dir(ZipFName & ".zip")
  Do Until fn = ""
   k = k + 1
   ZipFName = ZipFNameB & CStr(k) & ".zip"
   fn = Dir()
  Loop
  
  FName = Application.GetOpenFilename(FileFilter:="Excel Files (*.xl*), *.xl*", _
          MultiSelect:=True, Title:="圧縮ファイル選択")
  If IsArray(FName) = False Then
    Exit Sub
  Else
    Open ZipFName For Output As #1
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #1
   
    Set objShell = New Shell32.Shell
    For i = LBound(FName) To UBound(FName)
      If IsBookOpen(FName(i)) = False Then
       'ファイルは必ず閉じた状態で使ってください 'ここで問題が発生することがある
        objShell.Namespace(ZipFName).CopyHere FName(i)
        Sleep 500
      End If
    Next i
  End If
End Sub
Function IsBookOpen(ByVal FName As Variant)
Dim myFno As Integer
If Dir(FName) <> "" Then
 myFno = FreeFile
 On Error Resume Next
 Open FName For Binary Lock Read Write As #myFno
 Close #myFno
End If
 If Err.Number = 70 Then
  IsBookOpen = True
 End If
End Function
'//

こんにちは。

>2.別BOOKとして保存したファイルを、同一フォルダ内にZipファイルとして圧縮
というのは、2007以降のOffice ファイルは、拡張子が変わっただけで、本来は、Zipファイルなのです。あえて、Zipで圧縮する必要があるか分かりませんが、アーカイブに格納ということで、やってみました。

#2さんのリンク先とは、仕組み自体は同じですが、
Set Shell = CreateObject("Shell.Application")
zFolder.CopyHere sFolderItem
で、ZIPフォルダが認識しないことでした。そこで、何度もやった結果、事前に参照...続きを読む


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

人気Q&Aランキング