ファイル分割をしてみました。
ThisWorkbook.Pathを使用するので
サンプルマクロを貼り付けて、一旦エクセルを保存してください。
このマクロを実行するエクセルと同じパスにあるmoto.lzhというファイルを、
約1Mバイトごとに、test0001、test0002....というファイルに分割します。
コメントを入れているのでわかると思いますが、ポイントは2点。
1.Openする際にBinary Accessモードを使用
2.読込むエリアはbyte型で定義
いずれも、テキスト以外のファイルを扱うための工夫です。
Sub ファイル分割()
Dim fileA As String
Dim fileB As String
Dim fileC As String
'分割元ファイル
fileA = ThisWorkbook.Path & "¥moto.lzh"
'分割後ファイル(末尾に通番を付与する)
fileB = ThisWorkbook.Path & "¥test"
'復元用バッチファイル
fileC = ThisWorkbook.Path & "¥recov.bat"
'分割数
Dim ix As Integer
'分割長
Dim ln As Long
'インプットエリア
Dim ReadArea() As Byte
'元ファイル長
Dim TotalLen As Long
'終了フラグ
Dim Last As Boolean
'バッチファイルの内容
Dim Bat As String
'全体長セット
TotalLen = FileLen(fileA)
'分割長セット(1Mバイト)
ln = 1000000
'元ファイルオープン
Open fileA For Binary Access Read As #1
'分割数初期値化
ix = 1
P_loop:
'分割長セット(TotalLenは残りバイト数を保持)
'最後がぴったりだと駄目かも
If TotalLen > ln Then
TotalLen = TotalLen - ln
Else
ln = TotalLen
Last = True
End If
'読込みエリア確保
ReDim ReadArea(1 To ln)
'読込み
Get #1, , ReadArea
'分割ファイル作成
Open fileB & Format(ix, "0000") For Binary Access Write As #2
Put #2, , ReadArea
Close #2
'バッチファイルの内容を作成
If ix = 1 Then
Bat = "copy /b " & "test" & Format(ix, "0000")
Else
Bat = Bat & " + " & "test" & Format(ix, "0000")
End If
'終了処理
If Last Then
Close #1
Bat = Bat & " recov.lzh"
Open fileC For Output As #1
Print #1, Bat
Close #1
Exit Sub
End If
'ループ処理
ix = ix + 1
GoTo P_loop
End Sub
バッチファイルはコピー命令の結合を使用しています。
copy /b test0001 + test0002 + ..... recov.lzhというコマンドですが、
分割数が多いと、コマンドの実行ができません。
copy /b test* recov.hzhとワイルドカードでもできますが、
復元用にマクロを作成しました。
Sub ファイル結合()
Dim fileA As String
Dim fileB As String
Dim Last As Boolean
fileA = ThisWorkbook.Path & "¥recov.lzh"
fileB = ThisWorkbook.Path & "¥test"
Dim ix As Integer
Dim ln As Long
Dim ReadArea() As Byte
TotalLen = FileLen(ThisWorkbook.Path & "¥moto.lzh")
ln = 1000000
Open fileA For Binary Access Write As #1
ix = 1
P_loop:
If TotalLen > ln Then
TotalLen = TotalLen - ln
Else
ln = TotalLen
Last = True
End If
ReDim ReadArea(1 To ln)
Open fileB & Format(ix, "0000") For Binary Access Read As #2
Get #2, , ReadArea
Put #1, , ReadArea
Close #2
If Last Then
Close #1
Exit Sub
End If
ix = ix + 1
GoTo P_loop
End Sub
こちらはコメントを入れていませんが、はじめの分割ファイルを復元します。
ファイルの分割⇒復元のアプリを作るには、
復元時に必要な下記の項目を保存しておく必要があります。
元ファイル名 少なくとも、拡張子はあったほうがよいです。復元しても何のファイルかわからないんじゃね。。
元ファイル長 読み書きするバッファーで長さを把握していますが、これがないとキチンと結合できません。
分割ファイル名 分割のさせ方にもよりますが、この場合通番以外の名称が必要です
分割ファイル長 読み書きするバッファーの省略時値になります。これも必須