[[20180516160559]] 『ExcelVBAでワードに差し込み印刷』(マクロン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

[削除]『ExcelVBAでワードに差し込み印刷』(マクロン)

Excel VBAでご質問です
エクセルからワードに挿し木み印刷ツールを作成しました
訂正前はうまくrunしていましたが訂正後なんらえらーにはならないものの
値が飛んで行かなくなりました。
どなたか訂正方法を宜しくお願い致します

訂正前

Sub sashikomi_macro()
Dim cmax, cnt, i, k As Long
Dim path, str As String
Dim wdapp As Word.Application
Dim wddoc As Word.Document
Dim wdrg As Word.Range
Dim c As Long
Dim waitTime As Variant

cmax = Range("A65536").End(xlUp).Row
cnt = Range("IV1").End(xlToLeft).Column

Set wdapp = CreateObject("Word.application")
wdapp.Visible = True

For i = 2 To cmax
path = ThisWorkbook.path & "\sample.docx"
Set wddoc = wdapp.Documents.Open(path)
waitTime = Now + TimeValue("0:00:03")
Application.Wait waitTime

For k = 0 To cnt - 2
With wddoc.Content.Find
.Text = Range("B1").Offset(0, k).Value
.Forward = True
.Replacement.Text = Range("B" & i).Offset(0, k).Value
.Wrap = wdFindContinue
.MatchFuzzy = True
.Execute Replace:=wdReplaceAll
End With
Next

wddoc.PrintOut

Next

wdapp.Quit
Set wdapp = Nothing

End Sub

訂正後

Sub sashikomi_macro()
Dim lastRow, cnt, i, k As Long
Dim path, str As String
Dim wdapp As Word.Application
Dim wddoc As Word.Document
Dim wdrg As Word.Range
Dim c As Long
Dim waitTime As Variant
Dim ws1 As Worksheet, ws2 As Worksheet

Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(2)

lastRow = ws2.Cells(Rows.Count, 1).End(xlUp).Row
cnt = ws1.Range("IV1").End(xlToLeft).Column

Set wdapp = CreateObject("Word.application")
wdapp.Visible = True

With ws2
For i = 2 To lastRow
path = ThisWorkbook.path & "\sample.docx"
Set wddoc = wdapp.Documents.Open(path)
waitTime = Now + TimeValue("0:00:03")
Application.Wait waitTime

For k = 0 To cnt - 2
With wddoc.Content.Find
.Text = Range("B1").Offset(0, k).Value
.Forward = True
.Replacement.Text = Range("B" & i).Offset(0, k).Value
.Wrap = wdFindContinue
.MatchFuzzy = True
.Execute Replace:=wdReplaceAll
End With
Next

wddoc.PrintOut

'str = Range("A" & i).Value & "_" & Range("B" & i).Value & Range("C" & i).Value
'wddoc.SaveAs Filename:=ThisWorkbook.path & "\" & str & ".docx"
'wddoc.Close savechanges:=False
'Set wddoc = Nothing
Next

End With

wdapp.Quit
Set wdapp = Nothing

End Sub

ws1に元データ ws2に印刷したい企業番号になっております

補足
補足です。訂正後はThisWorkbook.Worksheets(1)に元データ一覧があります。ThisWorkbook.Worksheets(2)に入力の
キー番号の値のみループして差し込み印刷したいです。
訂正前はThisWorkbook.Worksheets(1)の全部の値をループ処理して印刷しています
宜しくお願い致します

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 .Text = Range("B1").Offset(0, k).Value 
 .Replacement.Text = Range("B" & i).Offset(0, k).Value 
ws1とws2のどちらのRangeなのか?

(mm) 2018/05/16(水) 16:33


(mm)さま
ws1は元データの一覧(印刷したい値のあるシート)
ws2はA列に印刷したい企業IDが入っていてA2から最終行までループして印刷させたいです
(マクロン) 2018/05/16(水) 17:00

Rangeの前にピリオドを入れては?
(mm) 2018/05/16(水) 17:23

>訂正前はうまくrunしていましたが

本当ですか?
訂正前のマクロも、ロジックがおかしいと思いますが…
2行目データの置換はうまくいっても
3行目以降は、置換できないのではありませんか。

そもそもWordの標準機能の差し込み印刷を利用しないのはなぜでしょうか。

今回も

>アイデアを募集しておりません。
>質問の意図と違う回答は望んでおりません。

ということであれば、撤退します。

(マナ) 2018/05/16(水) 19:20


(mm)様
本日帰宅途中の為明日試してみます。ありがとうございました。

マナさま
VBAでの回答をお待ちしております。いつもすみません

またメールで転送してこちらに転記しておりまして
インデントがまたなくなってしまってもうしわけありません

(マクロン) 2018/05/16(水) 23:24


(mm)さま

.Text = Range("B1").Offset(0, k).Value

.Text = ws1.Range("B1").Offset(0, k).Value

.Replacement.Text = Range("B" & i).Offset(0, k).Value

.Replacement.Text = ws1.Range("B" & i).Offset(0, k).Value

に変更して見ましたがダメでした。

ws2が企業番号だけのリストなので、ws2の値をws1から探すロジックが必要だとしたら構文は
どんな風にかくのでしょうか
(マクロン) 2018/05/17(木) 09:18


細かなところを訂正しましたので、最新版を転記いたします

Sub sashikomi_macro()
Dim lastRow As Long, cnt As Long, i As Long, k As Long, c As Long
Dim path As String, str As String
Dim wdapp As Word.Application
Dim wddoc As Word.Document
Dim wdrg As Word.Range
Dim waitTime As Variant
Dim ws1 As Worksheet, ws2 As Worksheet
Dim wb1 As Workbook

Set ws1 = ThisWorkbook.Worksheets(1)
Set ws2 = ThisWorkbook.Worksheets(2)

    lastRow = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
    cnt = ws1.Range("IV1").End(xlToLeft).Column

    Set wdapp = CreateObject("Word.application")
    wdapp.Visible = True

    path = ThisWorkbook.path & "\sample.docx"
    Set wddoc = wdapp.Documents.Open(path)
    waitTime = Now + TimeValue("0:00:03")
    Application.Wait waitTime

With ws2

    For i = 2 To lastRow

            For k = 0 To cnt - 2
            With wddoc.Content.Find
                .Text = ws1.Range("B1").Offset(0, k).Value
                .Forward = True
                .Replacement.Text = ws1.Range("B" & i).Offset(0, k).Value
                .Wrap = wdFindContinue
                .MatchFuzzy = True
                .Execute Replace:=wdReplaceAll
            End With
    Next

        wddoc.PrintOut

'記入例印刷
Set wb1 = Workbooks.Open(ThisWorkbook.path & "\記入例.xlsx")
Set sh = wb1.Worksheets(1)
sh.PrintOut

Next

End With

    wdapp.Quit
    Set wdapp = Nothing

wb1.Close

End Sub

ws2の値をws1から探すロジックはどんなか書き方になるのでしょうか
(マクロン) 2018/05/17(木) 11:39


ws2.Range("B1").Offset(0, k).Value
ws2.Range("B" & i).Offset(0, k).Value
では駄目ですか?

(mm) 2018/05/17(木) 13:22


ステップ実行したところ i=0,K=0 なので値が飛んでいかないのかと。。。。。
WS2の i とws1を紐付けるにはどうしたら良いのでしょうか?

ps、他のトピでも同様の質問を投稿しておりますm)(mm)さま
(mm)さま

試して見ましたがダメでした。

(マクロン) 2018/05/17(木) 13:59


 >ps、他のトピでも同様の質問を投稿しておりますm)(mm)さま 
 別のトピではなく別の掲示板だな。

http://www.moug.net/faq/viewtopic.php?t=77106
(ねむねむ) 2018/05/17(木) 14:08


https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12190454402

 追加
 なお、元のプログラムも作成したのではなく

http://www.fastclassinfo.com/entry/vba_word_control

 から持ってきたもののようだ。
(ねむねむ) 2018/05/17(木) 14:42

こちらは削除したいのですがどうすればよろしいでしょうか
(マクロン) 2018/05/17(木) 15:10

 別にマルチポストでも削除する必要はないが。
 以下の「(n) [マルチポストについて]」を見てくれ。

http://www.excel.studio-kazu.jp/wiki/excelboard/

(ねむねむ) 2018/05/17(木) 15:18


 mougでWinArrowsさんがどちらかを消すように書いたのは
 >ps、他のトピでも同様の質問を投稿しております
 とまるで同一掲示板内で同じ質問をしているかのように書いたからだろうし。
 そもそもすでに回答がついているものを削除するのは回答してくれた人に失礼だ。
(ねむねむ) 2018/05/17(木) 15:19

マルチポストは特に禁止ではないのですね
安心しました
いろんなところいろんな情報をいっぱい吸収していっぱいスキルを身に付けたいと思います!
宜しくお願いします
(マクロン) 2018/05/17(木) 15:50

 ただし掲示板によってはマルチポストが禁止の場所もあるのでその掲示板の使い方をよく確認すること。
 また、同じ質問に対してどこか一つの掲示板で得た情報やそれを元にした修正などは他の掲示板へも反映させること。
(ねむねむ) 2018/05/17(木) 15:58

了解しました!
(マクロン) 2018/05/17(木) 16:07

シートの構成を以下に記載します
ws2のシート

A列
企業コード

001
007
003

ws1のシート構成は

A列 B列 C列 D列
企業コード 企業名 住所 郵便番号
001 鈴木商事 千葉県 111000
002 田中商事 東京都 1230088
003 佐藤商事 埼玉県 3339999
007 近藤商事 埼玉県 5556666

以下のようになります
どうぞよろしくお願いします

(マクロン) 2018/05/17(木) 16:09


既にねむねむさんがコメントされていますが、気になったので私もちょこっとだけ。

>マルチポストは特に禁止ではないのですね
>安心しました

mougのほうでもコメントしましたが、
【掲示板によっては(マルチポストを)禁止しているところもあります】
ので、ちょっと落ち着いたときにでもそれぞれの掲示板の利用規約に目を通しておきましょう。

ExcelVBAに関して質問する掲示板の有名どころとしては、

・マルチポストを規約で禁止している
Excel Q&Aサロン(VBA)
http://excelfactory.net/excelboard/excelvba/excel.cgi

・規約ではマルチポストについて言及してない(と思う)
moug モーグ
http://www.moug.net/

・規約上でマルチポスト可と明示している
エクセルの学校
http://www.excel.studio-kazu.jp/

こんな感じだと思います。

また、おなじくねむねむさんがコメントされてますが、mougの方でWinArrowさんがおっしゃったのは、”トピック”と言っているから同じ掲示板で2記事を作ってしまったという意味に取られて、片っぽ”閉じればいいいでしょ”と言われています。間違っても他の掲示板の記事を【削除】しなさいではないとおもいます。

さらにいえば、仕組み上、この掲示板ではだれでも記事編集ができますけど、ご自身の発言はともかく、勝手に人のコメントまで編集(削除)するのはマナー違反だとおもいます。

それで、mougの方は閉じた(解決済にした)みたいですが、こちらはどうするんでしょうか?

個人的には、結局やりたいことって、「ws2」に抽出したリストに従って、差し込み印刷したいだけのようにおもうんで、こちらでマナさん、mougではWinArrowさんがおっしゃってるように、ws2のリストをWordに渡してあげて、「Wordの差込印刷機能」を使うのが手っ取り早そうな気がします。

mougの方では件数が多いから、Wordの差込印刷じゃ対応できないと返答していましたが、意味がよくわかりません。
(1)Excelで印刷対象のリスト作る
(2)Wordにリストを渡して処理をお任せする
(3)Wordがリストに従って片っ端から印刷する
(4)Excelにもどって処理終了
という処理でいいとおもうので、件数の多寡ってあんまり関係ないように思うんですが、、、
(面倒だったので、コード読み込んでないため、そういう質問じゃないってことなら、余計なレス失礼しました。)

(もこな2) 2018/05/17(木) 23:55


もなこさま
いろんなことを教えていただき有難うございます
ご指摘通り解決したのでこちらも閉じたいのですが閉じたいのですが…
どのように閉じるのがマナーとしてよろしいのでしょうか
(マクロン) 2018/05/18(金) 09:07

>こちらも閉じたいのですが閉じたいのですが…

マクロンさんからみると、どの掲示板も同じに見えるのかもしれないけどそれぞれ別物です。

mougの方は解決済みするという機能がありますが、こちらではそのような機能は無いように思います。
(少なくとも私は見たこと無いです)

このトピックに限っていえば、既にねむねむさんからどのようにすればいいか助言もらっているわけですから、その助言に従って。マルチポストしたmougでもらった○○というプランで進めることにしました。という報告と、そのプランで上手くいったなら、その結果もフィードバックするといいじゃないかとおもいます。

(mougで閉じる際に残したコメントを拝見する限りでは、話がおわってないような気がするので、本当に閉じるというか、話を終わらせていいのか、正直?ですけど・・・・)

(もこな2) 2018/05/18(金) 23:51


前言撤回。

mougの方ではアドバイスをもらったコードが動いたことと、自分で理解を深めていく旨書かれてますね。
そうなると、作成依頼をしてきた方には納入できるし、自己学習はおいおいやればいいんから話終わってますね。失礼しました。
(もこな2) 2018/05/19(土) 01:40


もなこさま
いろいろありがとうございます
今回はmougで回答をもらったWinArrow 様とsk様の両方を使用させていただくこととしました。

たまたま2件同時に同じようなものを作成しなくてはいけなかったので。

こちらのワードでループ処理に足して ws1の集計結果等をEXCELで複数添付するのですが
EXCELがシートでわかれているものとBOOKで分散されている者等ありますので
勉強がてらいろんなパターンを作成しようと思っています。

EXCELとワード連携は初めてだったので本当にたすかりました

また、皆様のお時間とお知恵をいただけることに感謝してお礼を申し上げます
(マクロン) 2018/05/19(土) 08:38


お望みのコードを貰って、問題が解決・・・これでオーライ
ではないはず。

掲示板は、あなたの仕事をお手伝いするトコロではないと
私は、考えています。
つまり、質問者さんの最も欲しがっているコードを提供することが、
問題解決ではないということです。

問題解決の考え方、
問題の本質の探り方
問題解決の手順などを
アドバイスする
ということに、主眼を置いています。

今回は、ワードとExcelの連携に問題ありと考えているようだけど、
Excel側の処理に原因があるのか?
ワード側の処理に問題があるのか?
を切り分けるために、ステップ実行をお勧めしたんですが、
中途半端・・・結果は回答無し

さんざん、キャッチボールの結果、ようやく、ws1とws2の関連を説明していただいたので、
Excel側に問題があることが推測できたわけです。

ステップ実行すれば、どこに原因があるかわかるはず。

中々、私の意図が伝わらないようでしたので、
コードを作成して、理解してもらえるかな?
と考えていたら、コードを貰ったら、ハイさよなら。・・・かよ?

コードを貰ったら問題解決と考えるのは、大きな間違いです。

「ワードにデータが飛んでこない」は、問題ではありません。
単なる症状です。それには原因があるはず、その原因の探り方を勉強してほしいです。

(WinArrow) 2018/05/19(土) 17:52


WinArrowさま
確かにおっしゃるとおりです
ステップ実行はやってみたものの正直スッテップ実行の
結果から問題をどう解決するのか?????
その原因の探り方、自分で解決する方法をどうやって探していくのか。・・・
解決したら早く閉じろと言われてしまったことがあり
閉じますけど、いただいたコードのこともわからないことを
お聞きしたいと思っていました
ただどこまで引っ張っていいのかもわからない・・・
「その原因の探り方を勉強してほしいです」
とはまさに今本当に思っていたことなのでありがたいお言葉です
ネットで知識を少しずつ増やし、拾ったコードを足し算引き算して
作成しています。がすんなり動くことのほうがまれで
本当に自分で解決できる方法を・・・・ステップ実行の結果自分で
解決できるようになりたいと切実に感じていたところでした

コードが今手元にないので、よろしければステップ実行から
自分でどのように解決にもっていくのか等月曜日から再度
もう少しご教示いただけると本当にうれしく思います。

いただいたコードも正直お聞きしたいことが
沢山あります。

(マクロン) 2018/05/19(土) 22:04


ステップ実行が不発・・・うまくできなかったら、
その時点で、質問すればよいでしょう。

ステップ実行は、[F8]ボタンを押してVBAコードを1ステップづつ実行していきます。
その時、変数名にか―ソウルと当てると、変数の「値」が表示されます。
その「値」が意図するもので無かったら、コードを修正することになります。
また、意図する流れと異なった動きになっている場合も、データが間違っている可能性があります。

ブレークポイントの設定も一緒に使うと効果的です。
セルの値などは、カーソルを当てても見れませんから、イミディトウィンドウで確認するか
Debug.printを付加して確認します。

より効果的な使い方としては、
変数の「値」を強制的に変更(イミディトウィンドウを使います)して、仮定のロジックを検証することもできます。

このステップ実行は、プログラムの完成度を上げるには、とっても効果的なツールです。
意図する結果が得られない場合、
プログラムが間違っているか?
データが間違っているか?
どちらかしかありません。

でも、データが間違っていたとしても、そのデータを許容してわけですから、
どちらにしても、プログラムを修正することになります。

(WinArrow) 2018/05/20(日) 08:53


WinArrowさま
いろいろ有難うございます
本日ステップ実行して、そこからの解決方法をお聞きしたいとおもいましたが
こんなときにかぎってデバックがひとつもでませんでした
またステップ実行が必要になりそこからの解決方法がわからないことがでてきましたら
ご質問させていただきますので宜しくお願い致します
(マクロン) 2018/05/21(月) 17:20

スレッドそのものを削除したいというのはこれだったのですか?
 
そもそもすでに回答がついているものを削除するのは回答者に失礼の旨の発言が、
このスレッド内でも既に複数の方からされていますよね。
 
その必要はまったくないですし、何でもリセットできるわけではないし。
自分の発言には責任を持たないと。
 
コメントで有益な指摘を受けているわけですよね。
それをすべて無しにして欲しい、というのはどういう神経なんでしょうか。
余りに自分勝手ではないですか?
 
PS:
運営者が判断されるから、間違いは無いとは思いますが、
そうしたアクションを質問者さんが起こす必要もないなら、
そうしたことはやめたほうがよいと進言することは問題ないと考えています。
(γ) 2018/06/05(火) 07:10

あれ、不思議ですね。
一覧のトップに表示されていたのを見て、上記発言をしたのですが、
なんら直近の発言の形跡がありませんね。
タイトルだけ修正したものと見える。

しかも、本文中のタイトル部分には[削除]が入っているが、
一覧表には削除の文字は表示されていない。

(γ) 2018/06/05(火) 07:21


遅レスですが、私の環境 (Win10、Android /GoogleChrome)でみても、一覧では[削除]ってなってるのが確認できないですね。

気になるのは
[[20180604093432]] 『こちらの掲示板の削除方法について』(h)
というトピックで回答が付いた後に、このような状態になっているので、hさんとマクロンさんが別人でタイトルに削除ってつけたのがhさんなら、なんで関係ない人の記事を削除しようとしてるのか疑問だし、同一人物なら、さんざん注意されていることに加えて、ハンドルネーム(この掲示板ではニックネーム)をコロコロ変えるのは快く思われないとおもいます。
(もこな2) 2018/06/06(水) 09:36


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.