Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5260 / 13644 ツリー ←次へ | 前へ→

【51841】ファイルの合成 ロン 07/10/7(日) 10:47 質問[未読]
【51842】Re:ファイルの合成 Hirofumi 07/10/7(日) 12:03 回答[未読]
【51848】Re:ファイルの合成 Hirofumi 07/10/7(日) 13:13 回答[未読]
【51849】Re:ファイルの合成 ロン 07/10/7(日) 13:38 お礼[未読]
【51843】Re:ファイルの合成 りん 07/10/7(日) 12:27 回答[未読]
【51850】Re:ファイルの合成 ロン 07/10/7(日) 13:49 発言[未読]
【51851】Re:ファイルの合成 りん 07/10/7(日) 13:52 発言[未読]
【51852】Re:ファイルの合成 ロン 07/10/7(日) 13:59 発言[未読]
【51890】Re:ファイルの合成 ロン 07/10/9(火) 19:46 お礼[未読]
【51894】Re:ファイルの合成 りん 07/10/9(火) 20:48 発言[未読]
【51862】コピーの進捗状況 ロン 07/10/8(月) 17:15 質問[未読]

【51841】ファイルの合成
質問  ロン  - 07/10/7(日) 10:47 -

引用なし
パスワード
   見よう見真似でDドライブに在る
AAA.001(001は拡張子)と BBB.002を合成して
CCC.003というファイルにするバッチファイルを作りました。

 COPY /B D:\AAA.001+D:\BBB.002 D:\CCC.003

この工程をVBAで同じように作業をさせるには
どのようにマクロを書けばよろしいですか?
宜しくお願いいたします。

【51842】Re:ファイルの合成
回答  Hirofumi  - 07/10/7(日) 12:03 -

引用なし
パスワード
   Testしていないので上手くいかなかったらごめん?
ファイルサイズが小さいなら、多分、こんなでも出来るかも?
ファイルサイズが大きい場合は少し工夫が必要かも?

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim vntMerge As Variant
  Dim vntOutput As Variant
  Dim strBuff As String
  Dim dfi As Integer
  Dim dfo As Integer
  Dim lngSize As Long
  Dim strProm As String
  
  vntMerge = Array("AAA", "BBB")
  
  '連結するファイルを選択
  For i = 0 To 1
    If Not GetReadFile(vntMerge(i), ThisWorkbook.Path, False) Then
      strProm = "処理がキャンセルされました"
      GoTo Wayout
    End If
  Next i
  
  '出力するファイル名を指定
  vntOutput = "CCC"
  If Not GetWriteFile(vntOutput, ThisWorkbook.Path) Then
    strProm = "処理がキャンセルされました"
    GoTo Wayout
  End If
  'もし、出力ファイルが既に存在するなら削除
  If Dir(vntOutput) <> "" Then
    Kill vntOutput
  End If
  
  '出力ファイルをOpen
  dfo = FreeFile
  Open vntOutput For Binary As dfo
  
  'マージ処理
  For i = 0 To 1
    '連結するファイルOpen
    dfi = FreeFile
    Open vntMerge(i) For Binary As dfi
      'ファイルサイズを取得
      lngSize = LOF(dfi)
      'ファイルを変数に読み込み
      strBuff = Input(lngSize, dfi)
      '変数の値を出力
      Put #dfo, , strBuff
    Close dfi
  Next i
  
  '出力ファイルをClose
  Close dfo
  
  strProm = "処理が完了しました"
  
Wayout:

  MsgBox strProm, vbInformation
  
End Sub

Private Function GetReadFile(vntFileNames As Variant, _
            Optional strFilePath As String, _
            Optional blnMultiSel As Boolean _
                    = False) As Boolean

  Dim strFilter As String
  
  'フィルタ文字列を作成
  strFilter = "Text File (*.txt),*.txt," _
        & "全て (*.*),*.*"
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  'もし、ディフォルトのファイル名が有る場合
  If vntFileNames <> "" Then
    SendKeys vntFileNames & "{TAB}", False
  End If
  '「ファイルを開く」ダイアログを表示
  vntFileNames _
      = Application.GetOpenFilename(strFilter, 2, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If
  
  GetReadFile = True
  
End Function

Private Function GetWriteFile(vntFileName As Variant, _
            Optional strFilePath As String) As Boolean

  Dim strFilter As String
  Dim strInitialFile As String
  
  'フィルタ文字列を作成
  strFilter = "Text File (*.txt),*.txt," _
          & "全て (*.*),*.*"
  '既定値のファイル名を設定
  strInitialFile = vntFileName
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  '「ファイルを保存」ダイアログを表示
  vntFileName _
    = Application.GetSaveAsFilename(vntFileName, strFilter, 2)
  If vntFileName = False Then
    Exit Function
  End If

  GetWriteFile = True
  
End Function

【51843】Re:ファイルの合成
回答  りん E-MAIL  - 07/10/7(日) 12:27 -

引用なし
パスワード
   ロン さん、こんにちわ。
>見よう見真似でDドライブに在る
>AAA.001(001は拡張子)と BBB.002を合成して
>CCC.003というファイルにするバッチファイルを作りました。

> COPY /B D:\AAA.001+D:\BBB.002 D:\CCC.003

>この工程をVBAで同じように作業をさせるには
>どのようにマクロを書けばよろしいですか?
>宜しくお願いいたします。

そのバッチファイルの名前が D:\TEST.BAT として、

Sub test()
  'バッチコマンド実行
  Shell "D:\TEST.BAT"
End Sub

という方法もあります。

テキストファイルなら、FSOを使用する方法も。

Sub test2()
  Dim FSO As Object, buf As String
  '
  Set FSO = CreateObject("Scripting.FileSystemObject")
  'Aをコピー(C)
  FSO.GetFile("D:\AAA.001").Copy "D:\CCC.003"
  'Bを全部読み込む
  buf = FSO.OpenTextFile("D:\BBB.002").ReadAll
  'Cに追加書き出し
  With FSO.GetFile("D:\CCC.003").OpenAsTextStream(8)
   .Write buf
   .Close
  End With
  '
  Set FSO = Nothing
End Sub

こんな感じです。

【51848】Re:ファイルの合成
回答  Hirofumi  - 07/10/7(日) 13:13 -

引用なし
パスワード
   ごめん、ちょっと勘違い
以下を修正して下さい

'  Dim strBuff As String
  Dim bytBuff() As Byte '★変更

  'マージ処理
  For i = 0 To 1
    '連結するファイルOpen
    dfi = FreeFile
    Open vntMerge(i) For Binary As dfi
      'ファイルサイズを取得
      lngSize = LOF(dfi)
      ReDim bytBuff(lngSize - 1) '★追加
      'ファイルを変数に読み込み
'      strBuff = Input(lngSize, dfi) '★削除
      Get #dfi, , bytBuff '★追加
      '変数の値を出力
      Put #dfo, , bytBuff '★変更
    Close dfi
  Next i

【51849】Re:ファイルの合成
お礼  ロン  - 07/10/7(日) 13:38 -

引用なし
パスワード
   Hirofumi さま

ありがとうございます。
そしてスミマセン、全くの素人ですので
回答していただいたのですが
全然意味が分からなくてどうしたものか
愕然としています・・・。
少しずつ理解すべく頑張っていきます。

【51850】Re:ファイルの合成
発言  ロン  - 07/10/7(日) 13:49 -

引用なし
パスワード
   りん さま

ありがとうございます。
補足させていただきます。

・AAA.001と BBB.002 は拡張子こそ001や002ですが
 テキストファイルとしてメモ帳で展開することは可能です。
 AAA.001と BBB.002の関係ですが
 容量の関係上、2つに分割されたものです。
 これを単順に元通り合成したいという趣旨です。

・職場ではLANを構築しており
 職員皆がこの合成するプログラムを使用します。
  Shell "D:\TEST.BAT"
 ですとプログラムが存在するパソコンが故障すると
 ちょっと面倒なのです・・・。
 質問する前に実際にShellで動かそうとして試したのですが
 サーバー上のバッチファイルは単体で起動はできますが
 VBAに組み込みますとサーバー上のShell関数が起動していない
 (バッチファイルを認識してくれない?)ため
 今は暫定でプログラムを使用するパソコンを限定して
 使っている状況なのです。
 でもやはり不便なのです・・・。
 今回VBAで動かせたらと思い質問させていただきました。

このあたりも踏まえて再度いい案をいただければ幸いです・・・。

【51851】Re:ファイルの合成
発言  りん E-MAIL  - 07/10/7(日) 13:52 -

引用なし
パスワード
   ロン さん、こんにちわ。

>・AAA.001と BBB.002 は拡張子こそ001や002ですが
> テキストファイルとしてメモ帳で展開することは可能です。

>このあたりも踏まえて再度いい案をいただければ幸いです・・・。

テキストという事は、下の案(FSO)の方も試したけどダメだったという事でしょうか?

【51852】Re:ファイルの合成
発言  ロン  - 07/10/7(日) 13:59 -

引用なし
パスワード
   りん さま
ありがとうございます。

今、自宅のためLAN環境が無いため
残念ですが検証できないのです・・・。
ローカル上で試させていただきましたら
いい感じでいけそうな気配ですので
次回出勤しましたら検証させていただきます!
お休みの中わざわざありがとうございます。

【51862】コピーの進捗状況
質問  ロン  - 07/10/8(月) 17:15 -

引用なし
パスワード
   こんばんは、りんさん。

りんさんから教えていただいたファイルのコピー部ですが
(実際は今更のFDからHDDへのコピーです ^^;)
処理中作業が進んでいるのかどうか分からないため
コピー進捗状況をステータスバーに”何%処理中です”や
できれば■□□□□□□で進捗状況を表示させたいのです。

自分なりに色々調べファイルサイズを取得するマクロは理解できました。

 Sub Size()
  Dim Path As String
  Dim Size As Long
  Path = " "  ’←コピー元のパスを入力
  Size = FileLen(Path)
  MsgBox Size  ’←とりあえずMsgボックスで結果表示しています
 End Sub

これでコピー元(FD)のファイルの大きさ、
コピー先のファイルの大きさを取得してステータスバーに、
Application.StatusBar = 
を利用して、(コピー先/コピー元)×100
と計算してあげれば%表示できるのでは??
しかしリアルタイムで更新しなければならないので
そこをどうすればよいのか分かりません。
もし可能であればこの辺りも
ご教授いただければ非常に助かります。

【51890】Re:ファイルの合成
お礼  ロン  - 07/10/9(火) 19:46 -

引用なし
パスワード
   りん さま

とてもイイ感じで動いてくれました!
思わず職場で1人感動していました^^;
これで利便性がupし
仕事もスムースにこなせます。
大切に使わせていただきます。
本当にありがとうございました。

あつかましいですが
もう一つの進捗具合を示すマクロも
教えていただければ嬉しいです・・・。

【51894】Re:ファイルの合成
発言  りん E-MAIL  - 07/10/9(火) 20:48 -

引用なし
パスワード
   ロン さん、こんばんわ。

>もう一つの進捗具合を示すマクロも
>教えていただければ嬉しいです・・・。
この方法では1連のコピーの処理という扱いになるので、プログレスは無理かと思います。
Hirofumiさんのコピー方法なら、対応できるかもしれません。

お役に立てなくてすみません。

5260 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free