Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ワードの文章をエクセルに貼り付ける
投稿日時: 20/12/25 02:17:14
投稿者: バルバロッサ

現在、沢山あるワードの書類をコピーしてエクセルの各シートに貼り付ける作業をしています。
ExcelVBAを用いてワードを開いて、コピーまではなんとか出来るようになりました。
しかし、エクセルのシートにペーストするときに、画像データとして貼り付けてしまいます。
 
ワードの文章は表(エクセルで作られたと思うようなセル付きの表)や文章で構成されており、それをそのままコピーしたいと思っています。
コードを記載します。
 
Sub Open_WordExcel()
Dim n As Long
Dim fd As FileDialog
 
'--- Wordのアプリケーションオブジェクト ---'
Dim objWord As Word.Application
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
 
'--- 開いたワードドキュメントを格納する変数 ---'
Dim objDoc As Word.Document
     
    Set fd = Application.FileDialog(msoFileDialogOpen)
    If fd.Show = -1 Then
        For n = 1 To fd.SelectedItems.Count
            Set objDoc = objWord.Documents.Open(Filename:=fd.SelectedItems.Item(n))
                objDoc.Application.ActiveDocument.Repaginate 'documentを読む
                With objDoc.Application.Selection
                    .Goto What:=wdGoToPage, Which:=wdGoToFirst
                    .EndKey Unit:=wdStory, Extend:=wdExtend
                    .Copy
                End With
            [color=red]Worksheets(n).Range("A1").PasteSpecial[/color]
            Worksheets(n).Name = objDoc.Name
            Worksheets.Add
            objDoc.Close savechanges:=False
        Next n
    End If
End Sub
 
上記のコードでは、画像データとしてエクセルにコピーされるだけです。
おまけに、ワードは数頁ありますが、コピーされるのは一枚目だけです。
 
そこで、手動でワードの文章をエクセルにコピーすることをマクロ記録で行いましたが、その時は文章は文章で、表はエクセルのセルにきちんと配置されます。
 
どのように書き換えたら良いのかお教え下さい。
多分赤字のところだと思います。
よろしくお願い申し上げます。

回答
投稿日時: 20/12/25 10:26:31
投稿者: WinArrow
投稿者のウェブサイトに移動

Gotoメソッドは使ったことがないので、よくわかりませんが、
手操作で
[Ctrl]+[A]で全文書が選択できますよね?
それをマクロの記録すると、以下のコードが得られます。
    Selection.WholeStory
    Selection.Copy
この方法を試してみては、いかがでしょう。

回答
投稿日時: 20/12/25 14:30:27
投稿者: simple

おじゃまします。
回答への追記です。
 
(1)文書の全体を選択する については
「すべての文を選択するWordマクロ」
https://www.relief.jp/docs/word-vba-select-whole-story.html
が参考になります。
 
(2)貼付に関しては、もう一度マクロ記録などで確認してください。
  .PasteSpecial だと、Wordオブジェクトが貼り付けられているはずです。
  たぶん望みのものは.Pasteでしょう。
  参考コード例:

      Application.Goto Worksheets(n).Range("A1")
      Worksheets(n).Paste

投稿日時: 20/12/25 22:56:24
投稿者: バルバロッサ

WinArrow様
ありがとうございました。
[Ctrl]+[A]で全文書が選択できると思いましたが、今後のWordで2ページ目からコピーする場合、Gotoメソッドのの方が有利なんだろうなと思いました。
http://hanatyan.sakura.ne.jp/vbhlp/wordref1.htm
を参照にしていました。
 
Simple様
いつもありがとうございます。
始めは、単純に.Pasteを使ったらエラーが出てしまい、なぜだ?と悩んでおりました。
Applicationオブジェクトで解決しました。
ものすごい単純な質問ですが、
今回
      Application.Goto Worksheets(n).Range("A1")
      Worksheets(n).Paste
をお教え頂きました。
これは
      Application.Goto Worksheets(n).Range("A1").Paste
ではダメなのでしょうか?
実行時には当然のようにエラーが出てきたのですが、ヘルプで内容を読んでも十分に理解できませんでした。
ご教授頂ければ幸いです。
よろしくお願い申し上げます。

回答
投稿日時: 20/12/25 23:16:46
投稿者: WinArrow
投稿者のウェブサイトに移動

バルバロッサ さんの引用:

 
ものすごい単純な質問ですが、
今回
      Application.Goto Worksheets(n).Range("A1")
      Worksheets(n).Paste
をお教え頂きました。
これは
      Application.Goto Worksheets(n).Range("A1").Paste
ではダメなのでしょうか?
実行時には当然のようにエラーが出てきたのですが、ヘルプで内容を読んでも十分に理解できませんでした。
ご教授頂ければ幸いです。
よろしくお願い申し上げます。

 
命令には、文法があります。
Worksheets(n).Range("A1")
は、Gotoメソッドの引数です。
引数には、メソッドは付けられません。
また、Pasteのオブジェクトは、セルではなくシートです。

回答
投稿日時: 20/12/25 23:40:03
投稿者: simple

拝見しました。

      Application.Goto Worksheets(n).Range("A1")
      Worksheets(n).Paste
は混乱の元でしたか。
      Worksheets(n).Select
      Range("A1").Select
      Worksheets(n).Paste
としてください。
 
質問にもお答えしておきましょう。
逆にお聞きしますけど、
Application.Goto Worksheets(n).Range("A1").Paste
これはどう解釈して欲しいと思って書いたのですか?
Worksheets(n).Range("A1").Paste に行け と言う意味にしたいのですか?
それとも、
Application.Goto Worksheets(n).Range("A1")を実行して
その結果にPasteせよ 、という意図ですか?
いずれにしても、こういうのは文法からはずれています。
 
WorksheetオブジェクトはPasteと言うメソッドを持っていますが、
Rangeオブジェクトには、そうしたメソッドはありません。
Rangeオブジェクトのヘルプを見てもらいたいですね。そういうメソッドは無いです。
 
この辺は忖度してくれないです。ものすごく厳密に運営されています。

投稿日時: 20/12/26 02:35:31
投稿者: バルバロッサ

WinArrow様
ありがとうございます。大変分かりやすいご回答で納得しました。
 
Simple様
ありがとうございました。特に深い意味の無い質問で申し訳ありませんでした。
ただ、WinArrow様が教えて下さった。Worksheets(n).Range("A1")がGotoメソッドになっていることを無視した考えでした。
申し訳ありませんでした。