プロが教えるわが家の防犯対策術!

VBA初心者です。色々検索して下記を作成しました.
ワードでは統合できたのですが、順番がばらばらになり修正に時間を要すため、エクセルVBAで統合前のファイル名を取得し、統合順に先頭に連番をつけ該当セルのファイル名に変更して保存しました。
引き続きエクセルで統合できないかやってみると、11行目で「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」がでます。エクセルでは無理なのか、修正すれば可能なのかをなるべく易しく教えていただけるとありがたいです。
宜しくお願いいたします。参照設定済みです。

Dim fld As FileDialog,myFileName As String,myFilePath As String,mySecNum As Integer,WordApp As Word.Application
Set WordApp = New Word.Application
Set fld = Application.FileDialog(msoFileDialogFolderPicker)
If fld.Show = 0 Then Exit Sub
myFilePath = fld.SelectedItems(1)
myFileName = Dir(myFilePath & "\*.doc*")
WordApp.Documents.Add Template:="C:\~.dotx"
Do While myFileName <> ""
With Selection
mySecNum = ActiveDocument.Range(0, Selection.Sections(1).Range.End).Sections.Count
With ActiveDocument.Sections(mySecNum)
With .Headers(wdHeaderFooterPrimary)
.Range.Text = "XXXXX"
End With
End With
End With
myFileName = Dir()
Loop
End Sub

質問者からの補足コメント

  • うーん・・・

    回答いただきありがとうございます。
    統合について以下の箇所の転記がもれており申し訳ありませんでした。
    With ActiveDocument.Sections(mySecNum)
    .InsertFile FileName:=myFilePath & "\" & myFileName
    .InsertParagraphAfter
    .InsertBreak Type:=wdSectionBreakNextPage
    End With
    教えていただきました箇所について、下記の宣言を追加後
    Dim WordApp As Word.Application Dim Doc As Word.Documents
    Set Doc = WordApp.Documents.Add に修正したところ 実行時エラー91 オブジェクト変数またはWith ブロック変数が設定されていません。どこを修正すべきでしょうか。

    No.6の回答に寄せられた補足コメントです。 補足日時:2022/01/03 12:49

A 回答 (11件中1~10件)

すみません


やった事が無かったので、試してみたら
Sub wordModule1実行()
Dim myWord As Word.Application
Set myWord = New Word.Application
myWord.Documents.Open Filename:="C:\Users\~\Documents\WORDマクロ用.docm", ReadOnly:=True
myWord.Application.Visible = True
myWord.Run "ファイルの統合"
End Sub
で実行されました。。
    • good
    • 1
この回答へのお礼

助かりました

ありがとうございます!!
無事実行する事ができました。質問が要領を得ず、何度もご確認いただきお手数をお掛けしました。今回の質問で、エクセルとワードでの記述方法の違いについても少し知ることができました。また機会がありましたら、教えていただけるとありがたいです。感謝いたします。

お礼日時:2022/01/09 15:12

#9です


Documents.Open でした

Sub wordModule1実行()
Dim ファイルの統合 As String, myWord As Word.Application
Dim wdApp As Word.Application
Set myWord = New Word.Application
myWord.Documents.Open Filename:="C:\Users\~\Documents\WORDマクロ用.docm", ReadOnly:=True
myWord.Application.Visible = True
Set wdApp = GetObject(, "word.application")
wdApp.Run "ファイルの統合"
End Sub

すみません。でどうでしょう
    • good
    • 0

こんにちは


>Sub wordModule1実行()
>できればこちらの方法の記述を教えていただけないでしょうか。

テストできませんが、GetObjectでオブジェクトを取得すれば良かったと思います。

Dim ファイルの統合 As String, myWord As Word.Application
Dim wdDoc As Word.Document
Set wdDoc = GetObject("C:\Users\~\Documents\WORDマクロ用.docm", "Word.Document")
wdDoc.Activate
Set myWord = GetObject(, "word.application")
Call myWord.Run("ファイルの統合")

>⇚の箇所で実行時エラー438オブジェクトはこのプロパティまたはメソッドをサポートしていません。となります。

これは、.InsertFile に問題があります。。と言うより
With Selection はExcelを指していると思われますので
Selectionを使わず良いようにオブジェクトを明示して指定すれば良いと思います。

細切れコードだと思うのとWith Selectionの使い意味が良く分かりませんが、この場合、With Selectionは不要と思われ
Wordを開いてインスタンス終了を待ってからオブジェクトを明示的に指定して処理を行えば良いのでは、と思いました。

どうでしょう
    • good
    • 0

#7です


E:\Desktop\新しいフォルダー\BB.dotx" は、
ざっくり検証した時のパスです。書き直し忘れましたので変更してください。
    • good
    • 1
この回答へのお礼

うーん・・・

ご回答ありがとうございます。教えていただいたように修正し
以下の箇所に、補足した部分を追加し下記でF8で実行すると、ワードは立ち上がりました。
Do While myFileName <> ""
With Selection
With ActiveDocument.Sections(mySecNum).Headers(1)
.Range.Text = "XXXXX"
End With
.InsertFile FileName:=myFilePath & "\" & myFileName ⇚
myFileName = Dir()
Loop
⇚の箇所で実行時エラー438オブジェクトはこのプロパティまたはメソッドをサポートしていません。となります。ご説明を理解できず、色々調べましたが知識不足で作成できませんでした。ワードファイルのマクロでは統合できたため、エクセルからマクロのあるワードを立ち上げてワードのモジュールを実行する場合で検索して下記作成しましたが、実行時エラー1004と出るため、できればこちらの方法の記述を教えていただけないでしょうか。勝手なお願いで申し訳ありません。よろしくお願いいたします。
Sub wordModule1実行()
Dim ファイルの統合 As String,myWord As Word.Application
myWord.Documents.Open FileName:= "C:\Users\~\Documents\WORDマクロ用.docm",ReadOnly:=True
myWord.Application.Visible = True
Call Application.Run("\WORDマクロ用.docm", ファイルの統合)
End Sub

お礼日時:2022/01/06 16:02

こんばんは


横から失礼します

>エクセルVBAで統合前のファイル名を取得し、統合順に先頭に連番をつけ該当セルのファイル名に変更して保存しました。

と言う事は、セルに表示されていると言う事でしょうか・・
もしそうであれば、VBA実行時の最初でファイルpathなどは、配列などで取得しておくのが良いと思います。

Excel
フォルダー内の対象ファイルフルパスを取得、ソートなどで並び替え
結果を配列などに格納

Wordをインスタンス
テンプレからドキュメントを作成
(set や Withで明示する Active・・を使用する時は、.Activateなどを事前に使う)

配列の内容で繰り返し
Documents.Open で開き 該当箇所を新規ドキュメントに
InsertAfterやInsertParagraphAfterなどで追加・・
(テンプレからのドキュメント作成の場合、項目などで書き込み?)
繰り返しに戻る

新規ドキュメントを名前を付けて保存
Wordを閉じる
Excelの処理に戻る

のような流れでしょうか、、

補足を考慮せず、ヘッダに書き込むだけであれば

Dim fld As FileDialog, myFileName As String, myFilePath As String, mySecNum As Integer, WordApp As Word.Application
Dim myDoc As Word.Document
Set WordApp = New Word.Application
Set fld = Application.FileDialog(msoFileDialogFolderPicker)
If fld.Show = 0 Then Exit Sub
myFilePath = fld.SelectedItems(1)
myFileName = Dir(myFilePath & "\*.doc*")

Set myDoc = WordApp.Documents.Add(Template:="E:\Desktop\新しいフォルダー\BB.dotx")
WordApp.Application.Visible = True
myDoc.Activate
Application.Wait (Now + TimeValue("0:00:05"))
mySecNum = ActiveDocument.Range(0, myDoc.Sections(1).Range.End).Sections.Count
Do While myFileName <> ""
With ActiveDocument.Sections(mySecNum).Headers(1)
.Range.Text = "XXXXX"
End With
myFileName = Dir()
Loop

コピペで書き直したものです。。。

>With Selection
新規ドキュメントを作成したにもかかわらず、上記はExcelのSelectを取得してしまいます。従って後の
= ActiveDocument.Range(0, Selection.Sections(1).Range.End).Sections.Count もサポートしないオブジェクト、メソッド、プロパティになります、たぶん。

>Application.Wait (Now + TimeValue("0:00:05"))
は、03位で良いかも、また違う方法もありますが、取敢えず・・
    • good
    • 0

No4です。



>エクセルVBAから、ワードファイルを開いて上記マクロを実行
>させるような事はできないのでしょうか。
No4に記した通り、そのままでは動作しませんけれど、適切に修正すれば可能です。
修正方法はNo4に示した通りです。

しかしながら・・・
>各ファイルの末尾に改ページを入れて、次のファイルを結合し、
>フォルダ内のすべてのファイルを統合するというものです
という様な内容の処理は、ご提示のコードには一切記述されていないので、そのような結果を期待しても何も起きないと思います。
理由は、エクセル上で実行しているからできないのではありません。
ご提示のコードをワード上で実行してみればわかるはずですが、統合はされないと思います。


>No5様
試してみればすぐにわかることですが・・
エクセル上のVBAで、いきなり ActiveDocument と記述しても取得できません。
(理由は、No4に記した通り)
No4に記した方法で取得するか、あるいはActiveな文書を取得したいのであれば、
 「ワードApplicationObject」.ActiveDocument
のようにすることでも取得できるはずです。

「参照設定」は、単にオブジェクトの参照を設定しているだけなので、VBAのApplicationベースを変更するものではありません。
変数の宣言等で直接宣言が可能になったり、VBAエディタのオブジェクトブラウザ上で表示ができるようになったり、コード上でメソッドやプロパティのヒントがでるようになるといった違いはありますが。
ですので、仮に参照設定などをしなくても、CreateObject()を用いて宣言することで、他のApplicationを参照したり、処理したりすることは可能です。
この回答への補足あり
    • good
    • 0

fujillin様。



直接の回答ではなく気になりましたので教えて頂きたいのですが。

Wordを参照設定している状態で ActiveDocument の取得は困難になる物なのでしょうか?
    • good
    • 0

こんばんは



そもそもですけれど・・・
VBAのAはApplicationの意味です。
Applicationに依存するスクリプトなので、そのままを別のApplicationにコピペして動くと思うのが基本的に間違っています。
とは言え、Office系のVBAは共通性があるので、きちんとオブジェクトを定義しておけば、異なるApplication上でも動作させることは可能です。


>11行目で「実行時エラー438 オブジェクトは、このプロパティまたは
>メソッドをサポートしていません」がでます。
すでに指摘があるように、「11行目」がどこなのか不明ですが、想像するところ
>mySecNum = ActiveDocument.Range(0, Selection.Sections(1)~~
だと思われます。
ActiveDocumentが取得できないはずですし、Selectionもエクセル上のSelectionと解釈されます。
などなど、複数のエラーが混在しています。
(他の部分にもいろいろありますが・・)
そもそも、文書のSections.Countを得たいのなら、
 ActiveDocument.Sections.Count
で済むはずです。
ただし、ActiveDocument自体からして取得できないので、
 Set Doc = WordApp.Documents.Add Template:="C:\~.dotx"
などとしておいて、
 Doc.Sections.Count
とすれば、文書のセクションの数を参照することはできます。
とは言え、テンプレートがどのようなものなのか不明ですけれど、既に文章があって、セクションが設定されているようなものなのでしょうか??


一方で、
>ワードでは統合できたのですが、~~
仮に、全体にエラーが出ないとしても、「何を統合している」のか全くわかりません。
ご提示のコードは、単に「テンプレートにヘッダーを設定」しているだけの内容なので、ダイアログでフォルダーを選択したりDir関数でループしているのは全く意味の無い処理になっています。
ですので、ご提示の内容で動作すれば良いのなら、「新しい文書を開いて、ヘッダーを設定する」というシンプルなものにした方が、不要なセンテンスを省けるので、エラーが発生する対象部分は激減すると考えられます。

ちなみに、
 Selection
 Active○○
などはその時の動作環境依存なので、明確になっていない限りは使用を避けた方が宜しいでしょう。
また、上記と同じ理由で、Wordの列挙体はExcelでの列挙体としては解釈されないものが多いです。
    • good
    • 2
この回答へのお礼

うーん・・・

ご回答ありがとうございます。質問が言葉足らずですみません。
この処理では特定フォルダ内に業務マニュアルの項番が30程度のファイルがあり、それを一つの章にまとめるため、スタイル設定済みの新規テンプレートファイルに、各ファイルの末尾に改ページを入れて、次のファイルを結合し、フォルダ内のすべてのファイルを統合するというものです。各ファイル名の先頭には1-Ⅰ-1、1-Ⅱ-2、1-Ⅲ-1(1)~1-Ⅲ-1(17)等の項番がついており、ヘッダーにも前記項番が設定されているため、全体の章番号に上書きするようにしております。
何度か実行したところご指摘いただきましたとおり、新規ワードファイル自体がないため処理ができないというエラーが出て、エクセルでの処理はできませんでした。
かなりの数のファイルを統合する必要があり、複数の処理者がなるべくわかりやすく利用できないかと思い質問させていただきました。エクセルで全ファイル名を取得し、正しい順番で統合できるように項番を付番し直しております。
エクセルVBAから、ワードファイルを開いて上記マクロを実行させるような事はできないのでしょうか。もし可能であれば教えていただきたいと思います。よろしくお願いいたします。

お礼日時:2022/01/02 19:14

No.1のお礼について。



>「実行時エラー4608 値が有効範囲を超えています」とでて止まりました。

停まって黄色く塗られている時にカーソルを移動させ近づけるとmySecNum =??と数値が表示されるかも。
それが3万2千ちょいより大きいってなら、宣言を As Long にすべきかも。

でもファイル名に目安の連番を付け直したのなら、Excelから操作する意味はなくなると未経験者は思いますよ。

元々のWord時のコードとファイル名の付け方(連番部分は明確に、その他はダミーで)があれば回答も付きやすいかと。
    • good
    • 0

No.1です。



>エクセルVBAで統合前のファイル名を取得し、統合順に先頭に連番をつけ該当セルのファイル名に変更して保存しました。

このファイル名がどうなっているのか情報がないですが、少なくとも連番であれば Dir関数で探すっておかしくないですかね?
⇒100%おかしいとは言いませんが、連番を付けファイル名を変更した事を忘れてしまっているような?
連番の付け方が不明ですが文字列なので 11 から始まるファイル名は、2 から始まるファイル名より前になってしまうかもです。

例えば 01 ~ 99 の範囲ならば n_続くファイル名.拡張子 として連番と切り離した方が良いかもですよ。
桁数も 0 埋めで合わせて。

あとDo~Loop内でファイル名の変数はどんな意味があるのでしょう?
    • good
    • 1
この回答へのお礼

回答ありがとうございます。連番は01_~で付番しました。ワードでの統合はうまく行きました。MicrosoftのリファレンスでSelection.Sections プロパティ (Word)とありましたので、これがワード固有のものということを理解しました。初学者のため難しくて理解できない部分は今後学びたいと思います。色々アドバイスいただきまして本当にありがとうございました。

お礼日時:2021/12/29 15:59

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

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