
Office2010です。
エクセルに、
保存先パス、ファイル名、文字列1、文字列2、値1、値2 の順に並んだ表があります。
(データは10行位)
これをWordに流し込んで指定のファイル名で指定の場所に保存したいのですがどうすれば良いでしょうか?
※表の流し込みではありません。
Wordは2ページ構成で完成しております。
例えば、1ページ目の右上の指定箇所に文字列1を貼り付け、
2ページ目のある場所に、文字列2、値1、値2を貼り付けて保存です。
注意点は、挿入貼り付けにより今の体裁が崩れないようにすることです。
普段は、手動でWordにコピペして名前を付けて保存しているのですが、
毎月の事なので、間違わずに効率化したく質問しました。
Wordを使うための設定や操作が複雑であれば、エクセルだけで済ませる事も可能です。
どちらが手っ取り早いかも含め相談させてください。
よろしくお願いいたします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.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

ご親切にありがとうございます。後程試してみます。
(自動的に質問が閉じられないようにという意味でも取り急ぎ書き込ませていただきました。)
No.4
- 回答日時:
こんにちは。
>テキストフィールドとは裏では連番が付いてるという事でしょうか?
>「.Fields(i).Result.Text」←ここからの想像です。
そのとおりです。作った順番からインデックスで、1,2,3と割り振られていきます。
これは、差し込み印刷でも使うのですが、差し込み印刷の場合は、Field コードが埋め込まれるのです。これをマクロでしてしまうという方法ですが、こちらのほうがずっと簡単です。
Field コードは、空白とか微妙に影響して、極端に扱いに不便です。
たぶん、ショートカットやコマンドで、グレーの色の消し方もあったと思いますが、グレーの状態をなくしてしまうと、変更が利かなくなったような気がします。(未確認)
ありがとうございます。勉強になりました。
つまりテキストフィールドにはインデックス連番が振られている訳ですから、
表示上の名称は自由でいいという事ですよね?
「システム費、メンテナンス費、保険料、日付」のように表記してもプログラム上では「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」も追加して、
指定ファイル名で保存を繰り返す処理にしたいのです。
可能でしょうか?
No.3
- 回答日時:
こんばんは。
>@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)をみていただけたら分かるかと思います。
--------------------------------

ありがとうございます。
Wordでテキストフィールドを使った事がなかったのでそこから調べてトライします。
でもこのソースと画面から察するに、
テキストフィールドとは裏では連番が付いてるという事でしょうか?
「.Fields(i).Result.Text」←ここからの想像です。
だとしたらこれは今後も応用ができそうですね!
No.2
- 回答日時:
こんばんは。
私はいくつか分からない部分があります。
セルにある値(文字列)を、Wordに貼り付けることはわかるのですが、
>1ページ目の右上の指定箇所に文字列1を貼り付け、
・左側と右側では大きく意味が違ってきます、
指定の箇所というのは、Excelなら、セル位置は、変動することはないけれども、Wordでは、はっきりした文字・オブジェクトなどの物理的な指定位置がなければ、左側寄せになってしまいますので、それを今度は、右寄せの書式を埋め込む形になってしまいます。
>2ページ目のある場所に、文字列2、値1、値2を貼り付けて保存です。
同様です。ある場所とはどこでしょうか。
それと、MS-Wordのページの概念というのは、少しややこしいのは、もとからページが存在しているのではなく、ドキュメントを読み込んでからページに割り振られる構造です。マクロからすると、2ページ目が確実にあるとは言えないのです。ページが割り振られるまで、待つ時間は大したことはないのですが、それでも待たなくてはならない問題があります。ページ改行がある場合は例外です。
実は、私は、あまり、まったく自信がありません。例えば、テキストボックスがあるとか、はっきりした場所がない限りは、思ったようには行かないと思います。
>指定のファイル名で指定の場所に保存したいのですがどうすれば良いでしょうか?
繰り返すようですが、MS-Wordに表があれば、そこに入れることは可能なのですが、「指定の場所」の意味の具体例がないとわかりません。流し入れではないということは、レイアウトを崩さないという意味なのでしょうけれども、それも難しいです。差し込み印刷のような方法は、私の記憶では、オブジェクトにフィールドコードを書いて、それを値化するので、マクロの場合は、逆に二重に手間が掛かるかと思います。
ありがとうございます。
私の質問は、ほぼNo.1さんのお察しの通りです。
毎月印刷して送付するWordの書類があります。
でも文書中の数か所に金額を入れる箇所があり、もちろん毎月変わります。
エクセルで計算結果のセルの値を手動で転記するのが現在のやり方です。
10か所位に対して同じことをしているのでもっと効率化したいのです。
また例えば表紙の右上にある文字列が入るのも同時に行いたいわけです。
そこは右揃えの設定にしてあります。
@01、@02、@03、のように変化する箇所に目印を付けておいて、そこを探し出して入れ替えるという手法が現実的かと思いますが、
具体的にはどうやったらよいかが分かりません。。。
No.1
- 回答日時:
こんにちは
実際の使い方のイメージがはっきりしないのですが、仮に、定型書式の文章がなどが固定で存在して、それに対して、毎月違う内容のデータを各所に当てはめてから出力(保存)したいということかと想像しました。
差し込み印刷で印刷せずに、「差し込んだ状態で保存する」みたいな感じでしょうか?
もしも質問者様がマクロの作成・利用ができるのであれば、比較的簡単に実現できると思います。
定型文書の中に、(文章の中では使用しない)特殊文字であらかじめ番号等を入れておいて(例えば、@01@、@02@…)、この部分を検索しながら内容を順に入れ替えてゆけばよさそうに思います。
元の文章はテンプレート保存にでもしておいて、入れ替え処理後に、所定のパスへ保存すれば良いでしょう。
『エクセル→ワード』の場合は、2種類のソフトにまたがるマクロになるので、少しだけ面倒です。(というよりも、メソッド等が異なるので知識が必要)
『エクセル→エクセル』の場合は、内容によってはマクロなど必要もなく、関数でも対応可能かも知れません。
例えば、「差し込み前の文章」「差し込み対象部分」「差し込み後の文章」という構成順で定型文が続いているなら、前後の文章を別々のセルに入れておいて、差し込み後の文章を表示する欄には、
=「差し込み前の文章」& 差し込み内容のセル &「差し込み後の文章」
のように、文書片を関数的に繋ぎ合わせる構造にしておけば、元の断片(差し込みデータ)を変えるだけで、自動的に合成された文章が表示さるようになります。
とはいうものの、エクセルはワープロではないので、セルから文字があふれた場合や改行の位置、禁則処理などには対応していませんし、画面表示と印刷が必ずしも一致しないことでも有名です。
それでも、定型文書全体が表形式などになっていて、あまり文章、文章していないような場合には、エクセルの方が簡単に実現しやすいと思います。
これに対して、ワードは、文章の送り等は自動で処理をしてくれますが、
>挿入貼り付けにより今の体裁が崩れないようにすることです。
挿入する文書片(文字列)の長短によって、行送りが変わったりしますので、その意味ではレイアウトが(微妙に)変わりますから、事前に、挿入内容によってレイアウトが変化する範囲を想定した上で、定型文書のレイアウトを作成しておく必要があるでしょう。
定型文書が、まさに文章的な内容であるならば、ワードの方が成果物のレイアウトや見栄えは安定したものが得られると予想されます。
ありがとうございます。
仰ることよく分かります。
エクセル→ワードでやる場合の手法も理解できましたがソースが書けなさそうです・・・
エクセル→エクセルが現実的かと思い始めています。
エクセルでの文章処理の制限も存じております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) ExcelVBA メモ帳を起動し名前を付けて指定フォルダに保存 2 2022/04/18 13:15
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/12 16:58
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルマクロでボタン一つでWordにテキスト貼りつけしたいです
Excel(エクセル)
-
ワードからエクセルへ貼り付けるマクロ
Excel(エクセル)
-
WordVBAで規定のところに文字列を挿入したい
Access(アクセス)
-
-
4
エクセルマクロでワードの一ページ目をコピーして新たに二ページを追加して、一ページ目の内容を貼り付ける
Visual Basic(VBA)
-
5
エクセルのマクロでワードの任意のテキストボックスへ文字列を書き込む方法を誰か教えていただけませんか
Visual Basic(VBA)
-
6
ExcelVBAで既に開いてるwordを閉じる
Excel(エクセル)
-
7
wordデータを、excelに自動で入力する
Excel(エクセル)
-
8
実行時エラー´5854´ 文字列型パラメーターが長すぎます。
Visual Basic(VBA)
-
9
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
10
EXCEL VBAで、セルの文字列の前後に文字を入力する方法は?
その他(Microsoft Office)
-
11
(実行時エラー5852)ExcelデータをWordに差し込んだ後、Wordファイルを分割するマクロ
Word(ワード)
-
12
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
13
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
14
VBAで文字を反映させると255文字の制限になってしまいます。
Visual Basic(VBA)
-
15
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
16
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
17
ワード上Shapeの位置情報を統一基準で取得したい
Visual Basic(VBA)
-
18
Word のVBAについて初心者なのですが、質問があります。
Word(ワード)
-
19
EXCELのVBAでWORDが開いてあるかチェック
Excel(エクセル)
-
20
WORDマクロで特定文字から別文字までを範囲選択したい
Word(ワード)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
値が入っているときだけ計算結...
-
尿検査前日に自慰行為した時の...
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
-
彼女のことが好きすぎて彼女の...
-
検便についてです。 便は取れた...
-
至急!尿検査前日にオナニーし...
-
excelでsin二乗のやり方を教え...
-
【Excelで「正弦波」のグラフを...
-
EXCELで条件付き書式で空白セル...
-
VLOOKUP関数を使用時、検索する...
-
2つの数値のうち、数値が小さい...
-
MIN関数で空白セルを無視したい...
-
Excel 0目標に対して数字があ...
-
EXCELで式からグラフを描くには?
-
尿検査の前日は自慰控えたほう...
-
Excel条件付書式(残業45時間以...
-
精子に血が・・・
-
エクセルで空白セルを含む列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
至急!尿検査前日にオナニーし...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
MIN関数で空白セルを無視したい...
-
小数点以下を繰り上げたものを...
-
風俗店へ行く前のご飯
-
エクセルで空白セルを含む列の...
-
Excel 数値の前の「 ' 」を一括...
-
【Excelで「正弦波」のグラフを...
-
納豆食べた後の尿の納豆臭は何故?
-
EXCELで式からグラフを描くには?
-
ある範囲のセルから任意の値を...
おすすめ情報