Word VBA質問箱 IV

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

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


302 / 308 ツリー ←次へ | 前へ→

【17】フォルダの中の複数ワープロファイルを1つにしたいのですが ikasumi 03/4/17(木) 17:45 質問[未読]
【18】Re:フォルダの中の複数ワープロファイルを1... らいでん 03/4/21(月) 2:15 回答[未読]
【19】Re:フォルダの中の複数ワープロファイルを1... らいでん 03/4/22(火) 23:19 発言[未読]
【20】ありがとうございます! ikasumi 03/4/24(木) 1:29 お礼[未読]

【17】フォルダの中の複数ワープロファイルを1つ...
質問  ikasumi  - 03/4/17(木) 17:45 -

引用なし
パスワード
   初めまして。VBA始めたばかりの超初心者です。
フォルダの中に入っている複数のワードファイルを改ページしながら
1つのファイルにしたいのですが。
どうすればよろしいのでしょうか?

【18】Re:フォルダの中の複数ワープロファイルを1...
回答  らいでん  - 03/4/21(月) 2:15 -

引用なし
パスワード
   はじめまして。らいでんです。
私もこちらへは初めての書き込みになります。

以下はサンプルです。VBEの[ツール]→[参照設定]で
「Microsoft Scripting Runtime」にチェックを入れてください。

処理の内容は大雑把に言えば、文書を順に開いてコピー&新規文書に
ペーストしています。

留意すべき点としては、無限にコピー&ペーストが行えるわけではなく
Wordファイルサイズの制限に引っかかるので
'ファイルサイズの制限
としている下の行の数値をお使いのWordのバージョンにあわせて
適当に調節してください。(2000以降は32MB。バージョンを明記の事)
もっとも、このサイズ制限の処理はいい加減です。^-^;

Sub Test()
  Dim Fso As New FileSystemObject
  Dim myFolder As Folder
  Dim myFile As File
  Dim NewDoc As Document
  Dim OldDoc As Document
  Dim myRng As Range
  Dim myFlag As Boolean
  Dim Fsize As Long
  
  Const myPath = "C:\My Documents" 'フォルダ指定
  myFlag = False

  Set NewDoc = Documents.Add
  Set myFolder = Fso.GetFolder(myPath)
  
  For Each myFile In myFolder.Files
    If myFile.Type Like "Microsoft Word 文書" _
      And Not myFile Like "~$*" Then
      Fsize = Fsize + myFile.Size
      Debug.Print myFile.Size
      'ファイルサイズの制限
      If Fsize > 30000000 Then Exit For
      Debug.Print myFile.Name
      Set OldDoc = Documents.Open(myFile.Path)
      DoEvents
      With OldDoc
        .Content.Copy
        .Close False
      End With
      Set OldDoc = Nothing
      Set myRng = NewDoc.Content
      myRng.Collapse Direction:=wdCollapseEnd
      If myFlag = True Then
        myRng.InsertBreak Type:=wdPageBreak
      End If
      DoEvents
      myRng.Paste
      myFlag = True
    End If
    DoEvents
  Next
  
  Set myFile = Nothing
  Set myFolder = Nothing
  Set Fso = Nothing
  Set myRng = Nothing
  Set NewDoc = Nothing
End Sub

【19】Re:フォルダの中の複数ワープロファイルを1...
発言  らいでん  - 03/4/22(火) 23:19 -

引用なし
パスワード
   らいでんです。
訂正と追記です。

>    If myFile.Type Like "Microsoft Word 文書" _
>      And Not myFile Like "~$*" Then

としている所は
    If myFile.Type Like "Microsoft Word 文書" _
      And Not myFile.Name Like "~$*" Then
に訂正します。

それから実際にコードを走らせてみると

>      Set OldDoc = Documents.Open(myFile.Path)

では、かなりバタバタして忙しい感がありますので
      Set OldDoc = Documents.Open( _
          FileName:=myFile.Path, Visible:=False)
とした方が良いかもしれません。

最後にこういったフォルダ内のファイルを総当りして1ファイル
に統合する処理では、ファイルを取り出す順番が重要になりますね。
今回はFileSearch オブジェクトを使用する方法を紹介します。
コードを全て提示してしまうと、面白くないと思いますので
ファイルをソートして取り出す部分だけのサンプルです。
後はご自分で頑張って組み立ててみてください。

Sub Test2()
  Dim i As Long
  
  Application.ScreenUpdating = False
  
  With Application.FileSearch
    .NewSearch
    '検索対象フォルダの指定
    .LookIn = "C:\My Documents"
    'サブフォルダを検索対象外
    .SearchSubFolders = False
    .MatchAllWordForms = True
    .FileType = msoFileTypeWordDocuments
    'ファイル名でソートして検索実行
    If .Execute(SortBy:=msoSortByFileName, _
      SortOrder:=msoSortOrderAscending) > 0 Then
      For i = 1 To .FoundFiles.Count
        Debug.Print .FoundFiles(i)
        If InStr(1, .FoundFiles(i), "~$") = 0 Then
          Debug.Print FileLen(.FoundFiles(i))
          '以下ファイルオープン処理等
          '
        End If
      Next
    End If
  End With
  
  Application.ScreenUpdating = True
End Sub

【20】ありがとうございます!
お礼  ikasumi  - 03/4/24(木) 1:29 -

引用なし
パスワード
   丁寧に教えてくださってありがとうございます!
仰るとおり、全て教えてもらったのでは自分のためにもなりませんよね。
ここまで教えてもらっておきながらまだ試行錯誤を繰り返していて
恥ずかしい限りですが(汗
頑張って組み立てます!

本当にありがとうございました!

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