Word VBA質問箱 IV

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

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


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

【343】フォルダー内のテキストファイルを連結する tootsie 05/9/16(金) 18:11 質問[未読]
【344】Re:フォルダー内のテキストファイルを連結... H. C. Shinopy 05/9/16(金) 23:58 回答[未読]
【348】Re:フォルダー内のテキストファイルを連結... tootsie 05/9/21(水) 17:21 お礼[未読]
【349】Re:フォルダー内のテキストファイルを連結... H. C. Shinopy 05/9/21(水) 23:29 回答[未読]
【355】Re:フォルダー内のテキストファイルを連結... tootsie 05/9/30(金) 16:58 お礼[未読]
【356】Re:フォルダー内のテキストファイルを連結... H. C. Shinopy 05/10/1(土) 22:30 回答[未読]
【357】Re:フォルダー内のテキストファイルを連結... tootsie 05/10/17(月) 17:50 お礼[未読]

【343】フォルダー内のテキストファイルを連結する
質問  tootsie  - 05/9/16(金) 18:11 -

引用なし
パスワード
   関東地方はようやく秋の気配で熱帯夜から解放されそうです。

さて、単刀直入ですが、

フォルダーの中にある複数のテキストデータを連結してワードの画面に表示するというワードマクロを作ることは可能でしょうか。

たとえば、
パソコンのCドライブにある「C:\Documents and Settings\monkey\デスクトップ」内の「作業ファイル」という名前のフォルダーにある複数のテキストファイル(テキストファイル名は位の定まらないランダムな数字で、012.txt、053987.txtなど)をすべて連結して、ワードの画面に表示させる。その後で作業ファイル内のテキストデータを消去する。
というやり方です。
ちなみに、パソコンはDELLでCドライブはPC本体です。

よろしくご教示ください。

【344】Re:フォルダー内のテキストファイルを連結...
回答  H. C. Shinopy  - 05/9/16(金) 23:58 -

引用なし
パスワード
   このごろは、朝夕の気温が下がってきました。さて、

「テキストデータの連結」ということですが、
Word文書上でファイルの挿入の操作をマクロですると解釈して、話を進めます。

ダイアログボックスでファイルを選び、
Word文書上に挿入するマクロが既にありますので、
これにファイル操作の処理を継ぎ足して、
載せておきます。

いきなりファイルの削除をお考えのようですが、
ファイル名の変更で処理するようにしています。

問題がないのであれば、Remを付け替えれば、
ファイル削除に変更できるようにしましたが、
このマクロを実行する前に、ファイルのバックアップをして下さい。

Sub myTxtInsert()
 Rem テキストファイルの挿入
 Dim myDlgPick As FileDialog
 Dim mySelectedItem As Variant
 Dim myWord As Word.Application
 '
 Dim myFso As Variant
 Dim myFile As Variant
 Dim myNewFile As String
 '
 ' 前処理
 If Documents.Count >= 2 Then
  MsgBox "文書を閉じて下さい。"
  Exit Sub
 End If
 If Documents.Count = 1 Then
  If ActiveDocument.Characters.Count > 1 Then
   MsgBox "文書を閉じて下さい。"
   Exit Sub
  Else
   If ActiveDocument.Words(1).Text <> vbCr Then
    MsgBox "文書を閉じて下さい。"
    Exit Sub
   Else
    ActiveDocument.Close
   End If
  End If
 End If
 '
 ' ファイルの指定
 Set myDlgPick = Application.FileDialog(msoFileDialogFilePicker)
 With myDlgPick
  .AllowMultiSelect = True
  .InitialFileName = "C:\Documents and Settings\User\My Documents\Zzz"
  .Filters.Add "テキストファイル", "*.txt", 1
  If .Show = 0 Then
   Rem [キャンセル]
   Set myDlgPick = Nothing
   Set myWord = Nothing
   Application.Documents.Add
   Exit Sub
  End If
 End With
 '
 ' ファイルの挿入
 Set myFso = CreateObject("Scripting.FileSystemObject")
 Set myWord = GetObject(, "Word.Application")
 Application.Documents.Add
 '
 For Each mySelectedItem In myDlgPick.SelectedItems
  With Selection
   .HomeKey unit:=wdStory, Extend:=wdMove
   .InsertFile FileName:=mySelectedItem, Range:="", ConfirmConversions:=False, _
    Link:=False, Attachment:=False
   .InsertBreak Type:=wdPageBreak ' 改ページ
   '
   Set myFile = myFso.GetFile(mySelectedItem)
   Rem *----*----*
   Rem myNewFile = myFso.GetFileName(mySelectedItem)
   Rem myFso.DeleteFile myNewFile ' ファイル削除
   Rem *----*----*
   myNewFile = "Zzz" & myFso.GetFileName(mySelectedItem)
   myFile.Name = myNewFile ' ファイル名を「Zzz〜」に変更
   Rem *----*----*
  End With
 Next mySelectedItem
 '
 ' 後処理
 Set myDlgPick = Nothing
 Set myWord = Nothing
 Set myFso = Nothing
 Set myFile = Nothing
End Sub ' myTxtInsert

【348】Re:フォルダー内のテキストファイルを連結...
お礼  tootsie  - 05/9/21(水) 17:21 -

引用なし
パスワード
   Shinopy さん:

ご回答をありがとうございました。

さっそく使ってみましたが、最初のところで「コンパイルエラー」が出てしまい、操作は暗礁に乗り上げてしまいました。

冒頭の「Dim myDlgPick As FileDialog」のところで「ユーザ定義型は定義されていません」と出てしまいます。私の使用しているワード2000のVBAはVersionが6.0なので、そのせいでしょうか。ヘルプを見ると「最初に Type...End Type ステートメントで定義するか、適切に登録されたオブジェクト ライブラリまたはタイプ ライブラリで定義する必要があります」とあります。

どのように定義すればよいのやら・・・・・。途方に暮れています。

また、いただいたマクロの中には、テキストファイルの収納された場所に関する記述がまったく見当たらないのですが、それでも、その場所を探し出して、そのファイルデータをもってくる(挿入する)ということが可能なのでしょうか・・・・・。

お忙しいことと思いますが、お返事いただければ幸いです。

【349】Re:フォルダー内のテキストファイルを連結...
回答  H. C. Shinopy  - 05/9/21(水) 23:29 -

引用なし
パスワード
   エラーが出ましたか? 
実のところ、なぜかは判らないのですが、、
できることを回答しておきます。

「ユーザ定義型は定義されていません」表示の件:
申し遅れましたが、私の環境はWord 2002です。
(当方では、エラーが再現されませんでした。)
2000と2002でVBAの仕様に大幅な変更はないハズなのですが・・・
取り敢えず、Dim文を変更して、「Dim myDlgPick As Variant」で逃げる。
それでもエラーが発生する場合は、参照設定を確認して下さい。

私の環境下の参照設定は、次の4つにチェックボックスがオンになっています。
(「標準状態」です。Word 2000の場合は「10.0」が「9.0」になっていると思います。)
Visual Basic For Applications
Microsoft Word 10.0 Object Library
OLE Automation
Microsoft Office 10.0 Object Library

Variant指定が気になる場合は、
「Set myDlgPick = Application.FileDialog(msoFileDialogFilePicker)」の次に
「MsgBox TypeName(myDlgPick)」を追加して、実行テストをして頂き、
表示された文字列を「Dim myDlgPick As 」の後に付ける。


それから、「テキストファイルの収納された場所に関する記述」の件
ダイアログボックスが表示されれば、
挿入したいファイルを選ぶことができるわけですが、
「With myDlgPick 〜 End With」中の「.InitialFileName = 」に
「"C:\Documents and Settings\monkey\デスクトップ"」を指定して下さい。
(私の作ったマクロでは、実行テストの都合で
「"C:\Documents and Settings\User\My Documents\Zzz"」を指定しています。)

その上で、Wordを起動した直後の状態で処理を実行してみて下さい。
(元々、他のファイルを開いていると、前処理で処理を止めるようにしていますが・・・)

【355】Re:フォルダー内のテキストファイルを連結...
お礼  tootsie  - 05/9/30(金) 16:58 -

引用なし
パスワード
   Shinopyさん

ご回答ありがとうございます。お礼が遅れてすみません。

まず、参照設定についてですが、おっしゃるとおりの4つに加えてNormalにチェックが入っています。(Microsoft Word 10.0 Object Library は 9.0です)Normalのチェックが悪影響しているとも思えないので、というか、チェックを取ってしまうとせっかく作った別のマクロに影響するのではないかと不安に感じて、そのままにしています。

次に、as Variantで実験したところ、

「' ファイルの指定
 Set myDlgPick = Application.FileDialog(msoFileDialogFilePicker)」のところで「.FileDialog」がハイライトされた状態でコンパイルエラー「メソッドまたはメンバが見つかりません」と出てきます。

その他のおっしゃる方法は、自分なりにいろいろ試してみましたが、どうも効果が上がりません。

お忙しいとは存じますが、上記コンパイルエラーを解決する方向でよいお知恵をお貸しいただければ幸いです。

よろしくお願いします。

【356】Re:フォルダー内のテキストファイルを連結...
回答  H. C. Shinopy  - 05/10/1(土) 22:30 -

引用なし
パスワード
   あわわ、調べてみたところ、「FileDialog」は、2002以降の機能でした!
その対策をしたのが下のマクロです。

Wordと共にExcelが、パソコンにインストールされていることが前提になりますが、
ファイルを選ぶ部分については、Excelの機能を借りることにしました。
しかし、フォルダの指定が一発でうまくいかず、「DefaultFilePath」を利かせるため、
(不細工ですが)Excelを裏方で二度起動しています。

それから、前回の回答にあった「myWord」は余計なオブジェクトでしたので削除。
取り敢えず、参照設定なしで動作するようにしています。

Sub myTxtInsertU2000()
 Rem *----*----*  *----*----*  *----*----*  *----*----*
 Rem 複数テキストファイルの挿入
 Rem *----*----*  *----*----*  *----*----*  *----*----*
 Rem 参照設定の場合...
 Rem  Microsoft Excel 10.0 Object Library
 Rem  Microsoft Scripting Runtime
 Rem *----*----*  *----*----*  *----*----*  *----*----*
 Dim myExcel As Variant ' Excel.Application
 Dim myDlgPick As Variant
 Dim mySelectedItem As Variant
 '
 Dim myFso As Variant ' Scripting.FileSystemObject
 Dim myFile As Variant
 Dim myNewFile As String
 '
 ' 前処理
 If Documents.Count >= 2 Then
  MsgBox "文書を閉じて下さい。"
  Exit Sub
 End If
 If Documents.Count = 1 Then
  If ActiveDocument.Characters.Count > 1 Then
   MsgBox "文書を閉じて下さい。"
   Exit Sub
  Else
   If ActiveDocument.Words(1).Text <> vbCr Then
    MsgBox "文書を閉じて下さい。"
    Exit Sub
   Else
    ActiveDocument.Close
   End If
  End If
 End If
 '
 ' フォルダの指定
 Set myExcel = CreateObject("Excel.Application")
 myExcel.DefaultFilePath = "C:\Documents and Settings\User\My Documents\Zzz"
 myExcel.Quit
 Set myExcel = Nothing
 '
 'myExcel.DefaultFilePath = "C:\Documents and Settings\User\My Documents\Esperanto"
 ' ↑フォルダ指定は、2回目実行時から有効。
 ' ↓フォルダ指定の効き目なし。
 'ChDrive "C:"
 'ChDir "C:\Documents and Settings\User\My Documents\Zzz"
 '
 ' ファイルの指定
 Set myExcel = CreateObject("Excel.Application")
 myDlgPick = myExcel.Application.GetOpenFilename(filefilter:="テキスト,*.txt,文書,*.doc", _
  Title:="ファイルを選ぶ", _
  MultiSelect:=True)
 If TypeName(myDlgPick) = "Boolean" Then
  Rem [キャンセル]ボタン時
  myExcel.Quit
  Set myExcel = Nothing
  Set myDlgPick = Nothing
  Exit Sub
 End If
 '
 ' ファイルの挿入
 Set myFso = CreateObject("Scripting.FileSystemObject")
 Application.Documents.Add
 '
 For Each mySelectedItem In myDlgPick
  With Selection
   .HomeKey Unit:=wdStory, Extend:=wdMove
   .InsertFile FileName:=mySelectedItem, Range:="", ConfirmConversions:=False, _
    Link:=False, Attachment:=False
   .InsertBreak Type:=wdPageBreak ' 改ページ
   '
   Set myFile = myFso.GetFile(mySelectedItem)
   Rem *----*----*
   Rem myNewFile = myFso.GetFileName(mySelectedItem)
   Rem myFso.DeleteFile myNewFile ' ファイル削除
   Rem *----*----*
   myNewFile = "Zzz" & myFso.GetFileName(mySelectedItem)
   myFile.Name = myNewFile ' ファイル名を「Zzz〜」に変更
   Rem *----*----*
  End With
 Next ' mySelectedItem
 '
 ' 後処理
 myExcel.Quit
 Set myDlgPick = Nothing
 Set myFso = Nothing
 Set myFile = Nothing
 Set myExcel = Nothing
End Sub ' myTxtInsertU2000

【357】Re:フォルダー内のテキストファイルを連結...
お礼  tootsie  - 05/10/17(月) 17:50 -

引用なし
パスワード
   ご教示ありがとうございました。
エクセルを立ち上げたり、My Documents の部分を書き換えたり、自分なりにいろいろ工夫してみたのですが、なにぶんVBAについて基礎学力が足りないため、リタイアとなりそうです。

「文書を閉じてください」というメッセージは出てくるのですが、ワードの画面上は何も変化がありません。砂時計が出ているので、何かしようとしているようなのですが・・・。

この件については、後日研究の上、別の形で質問させていただきます。また、よろしくお願いいたします。

いろいろありがとうございました。

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