プロが教える店舗&オフィスのセキュリティ対策術

Office2010です。
エクセルに、
保存先パス、ファイル名、文字列1、文字列2、値1、値2 の順に並んだ表があります。
(データは10行位)

これをWordに流し込んで指定のファイル名で指定の場所に保存したいのですがどうすれば良いでしょうか?
※表の流し込みではありません。

Wordは2ページ構成で完成しております。
例えば、1ページ目の右上の指定箇所に文字列1を貼り付け、
2ページ目のある場所に、文字列2、値1、値2を貼り付けて保存です。
注意点は、挿入貼り付けにより今の体裁が崩れないようにすることです。

普段は、手動でWordにコピペして名前を付けて保存しているのですが、
毎月の事なので、間違わずに効率化したく質問しました。

Wordを使うための設定や操作が複雑であれば、エクセルだけで済ませる事も可能です。
どちらが手っ取り早いかも含め相談させてください。
よろしくお願いいたします。

A 回答 (5件)

遅くなりました。

これで良いのかと考えたら、アップロードが失速してしまいました。(^^;
まだ、十分な検証されているとは言えません。


'標準モジュール
Option Explicit

Private wdApp As Word.Application
Private wdDoc As Word.Document
'要参照設定、メニュー・ツール-参照設定
'Microsoft Word xx.0 Object Library (xx は数字)

'//標準モジュール
Sub EnterItemsIntoWord()
 Dim fName As String
 Dim mPath As String
 Dim flg As Boolean
 Dim k As Long, i As Long
 Set wdApp = New Word.Application
 '以下、1は、1行目に項目が入っているという前提です。0
 k = Cells(1, Columns.Count).End(xlToLeft).Column
 If k < 2 Then MsgBox "設定の表が違うかもしれません。", vbExclamation: Exit Sub
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
  mPath = Cells(i, k - 1).Value 'パス
  If Right(mPath, 1) <> "\" Then mPath = mPath & "\"
  fName = mPath & Cells(i, k).Value
  If Dir(fName) <> "" Then
   sEnterWordPages Cells(i, 1).Resize(, k - 3), fName
  Else
   Cells(i, k + 1).Value = "err" 'エラー表示
   flg = True
  End If
 Next i
 On Error Resume Next
 wdApp.Quit False
 Set wdApp = Nothing
 On Error GoTo 0
 If flg Then
  MsgBox " 開けなかったファイルがあります。", vbExclamation
 Else
  MsgBox "終了", vbInformation
 End If
End Sub
Sub sEnterWordPages(ByVal Rng As Range, fName As String)
 Dim i As Long
 wdApp.Visible = True
 Set wdDoc = wdApp.Documents.Open(fName)
 With wdDoc
  For i = 1 To .Fields.Count
   If Rng.Cells(1, i).Value <> "" Then
    .Fields(i).Result.Text = Rng.Cells(1, i).Text
   End If
  Next
 End With
 wdDoc.Save
 wdDoc.Close False
 Set wdDoc = Nothing
End Sub


'//おまけのマクロ
'//シートモジュール(Sheet1など)・これを使った表の同じ行のどこかでダブルクリックすれば開きます。

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim myPath As String
 Dim fName As String
 Dim objWd As Object
 Cancel = True
 myPath = Cells(Target.Row, Columns.Count).End(xlToLeft).Offset(, -1).Value
 If Right(myPath, 1) <> "\" Then myPath = myPath & "\"
 fName = Cells(Target.Row, Columns.Count).End(xlToLeft).Value
 If Dir(myPath & fName) <> "" Then
  Set objWd = CreateObject("Word.Application")
  objWd.Visible = True
  objWd.Documents.Open myPath & fName
  AppActivate fName
 End If
End Sub
「【VBA】エクセルの指定セルの値を、Wo」の回答画像5
    • good
    • 0
この回答へのお礼

ご親切にありがとうございます。後程試してみます。
(自動的に質問が閉じられないようにという意味でも取り急ぎ書き込ませていただきました。)

お礼日時:2019/01/31 11:46

こんにちは。



>テキストフィールドとは裏では連番が付いてるという事でしょうか?
>「.Fields(i).Result.Text」←ここからの想像です。

そのとおりです。作った順番からインデックスで、1,2,3と割り振られていきます。
これは、差し込み印刷でも使うのですが、差し込み印刷の場合は、Field コードが埋め込まれるのです。これをマクロでしてしまうという方法ですが、こちらのほうがずっと簡単です。
Field コードは、空白とか微妙に影響して、極端に扱いに不便です。

たぶん、ショートカットやコマンドで、グレーの色の消し方もあったと思いますが、グレーの状態をなくしてしまうと、変更が利かなくなったような気がします。(未確認)
    • good
    • 0
この回答へのお礼

ありがとうございます。勉強になりました。
つまりテキストフィールドにはインデックス連番が振られている訳ですから、
表示上の名称は自由でいいという事ですよね?
「システム費、メンテナンス費、保険料、日付」のように表記してもプログラム上では「1,2,3,4」のインデックスコードで特定できるため、
文書上のどこに配置しても構わないということですか。

頂いた例では、
 10,000
 2,000
 300
 12,300
 2019年2月4日
のように縦に並ぶ値を置き換えていくわけですが、これだと1件の処理で終わってしまいます。

今回の相談では10種類位のWord文書を作成したいので、
 10,000、2,000、300、12,300、2019年2月4日
のように横並びで1行1レコードとして、複数行処理できないでしょうか?
でもこのままだと自動で順繰りに置き換わって意味がないです。
なので、レコード末尾に「、保存先パス、文書1.docx」も追加して、
指定ファイル名で保存を繰り返す処理にしたいのです。
可能でしょうか?

お礼日時:2019/01/24 14:06

こんばんは。



>@01、@02、@03、のように変化する箇所に目印を付けておいて、そこを探し出して入れ替えるという手法が現実的かと思いますが、

とおっしゃっていますが、こちらの想定とはまったく違いますので、よかったら他の方のレスをお待ちになってもよいかと思います。過去の私なら、そのようなコードも書いていたのですが、近年、目を悪くしたせいか集中力を失ってしまい、正直なところいつ出来上がるかわからないです。

それと、Wordはバージョンによって、マクロの反応が大幅に変わることがあります。こちらの開発は、Excel 2013 で行いました。

Excel任意のシート(パスとファイル名はコードの中に入っています)
A1から

10,000
2,000
300
12,300
2019年2月4日

と置きました。

'Excel の標準モジュールに以下のように貼り付けます。
参照設定で、メニュー・ツール-参照設定
Microsoft Word xx.0 Object Library (xx は数字)

'//
Sub EnterWordPages()
 Const FILENAME As String = "BB10931291.docx"
 Const MYPATH As String = "C:\Users\a2022\Documents\WordDoc\" '末尾に¥をいれること
 If Dir(MYPATH & FILENAME) = "" Then MsgBox "ファイルが見つかりません。", vbExclamation: Exit Sub
 Dim objWd As Word.Application
 Dim wdDoc As Word.Document
 Set objWd = CreateObject("Word.Application")
 objWd.Visible = True
 Set wdDoc = objWd.Documents.Open(MYPATH & FILENAME)
 With wdDoc
  For i = 1 To .Fields.Count
   .Fields(i).Result.Text = ActiveSheet.Cells(i, 1).Text
  Next
 End With
 Set wdDoc = Nothing
 Set objWd = Nothing
End Sub

Word側は、拡張子は問いません。パスとファイル名は念のために分けました。

開発-コントロール-右下端のツールボックスをクリック
以前のバージョンのフォーム -|ab| テキストフィールドを、差し込みで必要な部分、文章中に挿入します。

画像(Word)をみていただけたら分かるかと思います。
--------------------------------
「【VBA】エクセルの指定セルの値を、Wo」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます。
Wordでテキストフィールドを使った事がなかったのでそこから調べてトライします。

でもこのソースと画面から察するに、
テキストフィールドとは裏では連番が付いてるという事でしょうか?
「.Fields(i).Result.Text」←ここからの想像です。
だとしたらこれは今後も応用ができそうですね!

お礼日時:2019/01/23 14:00

こんばんは。



私はいくつか分からない部分があります。
セルにある値(文字列)を、Wordに貼り付けることはわかるのですが、

>1ページ目の右上の指定箇所に文字列1を貼り付け、
・左側と右側では大きく意味が違ってきます、
指定の箇所というのは、Excelなら、セル位置は、変動することはないけれども、Wordでは、はっきりした文字・オブジェクトなどの物理的な指定位置がなければ、左側寄せになってしまいますので、それを今度は、右寄せの書式を埋め込む形になってしまいます。

>2ページ目のある場所に、文字列2、値1、値2を貼り付けて保存です。
同様です。ある場所とはどこでしょうか。
それと、MS-Wordのページの概念というのは、少しややこしいのは、もとからページが存在しているのではなく、ドキュメントを読み込んでからページに割り振られる構造です。マクロからすると、2ページ目が確実にあるとは言えないのです。ページが割り振られるまで、待つ時間は大したことはないのですが、それでも待たなくてはならない問題があります。ページ改行がある場合は例外です。

実は、私は、あまり、まったく自信がありません。例えば、テキストボックスがあるとか、はっきりした場所がない限りは、思ったようには行かないと思います。

>指定のファイル名で指定の場所に保存したいのですがどうすれば良いでしょうか?
繰り返すようですが、MS-Wordに表があれば、そこに入れることは可能なのですが、「指定の場所」の意味の具体例がないとわかりません。流し入れではないということは、レイアウトを崩さないという意味なのでしょうけれども、それも難しいです。差し込み印刷のような方法は、私の記憶では、オブジェクトにフィールドコードを書いて、それを値化するので、マクロの場合は、逆に二重に手間が掛かるかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私の質問は、ほぼNo.1さんのお察しの通りです。
毎月印刷して送付するWordの書類があります。
でも文書中の数か所に金額を入れる箇所があり、もちろん毎月変わります。
エクセルで計算結果のセルの値を手動で転記するのが現在のやり方です。
10か所位に対して同じことをしているのでもっと効率化したいのです。
また例えば表紙の右上にある文字列が入るのも同時に行いたいわけです。
そこは右揃えの設定にしてあります。

@01、@02、@03、のように変化する箇所に目印を付けておいて、そこを探し出して入れ替えるという手法が現実的かと思いますが、
具体的にはどうやったらよいかが分かりません。。。

お礼日時:2019/01/20 01:44

こんにちは



実際の使い方のイメージがはっきりしないのですが、仮に、定型書式の文章がなどが固定で存在して、それに対して、毎月違う内容のデータを各所に当てはめてから出力(保存)したいということかと想像しました。
差し込み印刷で印刷せずに、「差し込んだ状態で保存する」みたいな感じでしょうか?

もしも質問者様がマクロの作成・利用ができるのであれば、比較的簡単に実現できると思います。
定型文書の中に、(文章の中では使用しない)特殊文字であらかじめ番号等を入れておいて(例えば、@01@、@02@…)、この部分を検索しながら内容を順に入れ替えてゆけばよさそうに思います。
元の文章はテンプレート保存にでもしておいて、入れ替え処理後に、所定のパスへ保存すれば良いでしょう。

『エクセル→ワード』の場合は、2種類のソフトにまたがるマクロになるので、少しだけ面倒です。(というよりも、メソッド等が異なるので知識が必要)
『エクセル→エクセル』の場合は、内容によってはマクロなど必要もなく、関数でも対応可能かも知れません。
例えば、「差し込み前の文章」「差し込み対象部分」「差し込み後の文章」という構成順で定型文が続いているなら、前後の文章を別々のセルに入れておいて、差し込み後の文章を表示する欄には、
 =「差し込み前の文章」& 差し込み内容のセル &「差し込み後の文章」
のように、文書片を関数的に繋ぎ合わせる構造にしておけば、元の断片(差し込みデータ)を変えるだけで、自動的に合成された文章が表示さるようになります。

とはいうものの、エクセルはワープロではないので、セルから文字があふれた場合や改行の位置、禁則処理などには対応していませんし、画面表示と印刷が必ずしも一致しないことでも有名です。
それでも、定型文書全体が表形式などになっていて、あまり文章、文章していないような場合には、エクセルの方が簡単に実現しやすいと思います。

これに対して、ワードは、文章の送り等は自動で処理をしてくれますが、
>挿入貼り付けにより今の体裁が崩れないようにすることです。
挿入する文書片(文字列)の長短によって、行送りが変わったりしますので、その意味ではレイアウトが(微妙に)変わりますから、事前に、挿入内容によってレイアウトが変化する範囲を想定した上で、定型文書のレイアウトを作成しておく必要があるでしょう。
定型文書が、まさに文章的な内容であるならば、ワードの方が成果物のレイアウトや見栄えは安定したものが得られると予想されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
仰ることよく分かります。
エクセル→ワードでやる場合の手法も理解できましたがソースが書けなさそうです・・・
エクセル→エクセルが現実的かと思い始めています。
エクセルでの文章処理の制限も存じております。

お礼日時:2019/01/20 01:36

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

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


このQ&Aを見た人がよく見るQ&A