Excel (VBA)

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

 
(Windows 10 Home : Excel 2010)
マクロでWord差込印刷、日付スイッチが無効?
投稿日時: 17/12/23 21:52:47
投稿者: のりぴっぴ

Excel2010、Word2010、Windows10環境ですが
66列のDB内に日付が5フィールドあります。
 改良を加えているうちに気が付くとWordへ差し込まれた日付がいつの間にか5桁シリアル番号になってしまっている!それも起案年月日は「290528」と正しく表示され、その他は「42883」となっている。今まで正常だったのに、また同じ式なのになぜ!
{ MergeField 起案年月日 ¥@eeMMdd }(¥記号などはもちろん半角です。)
{ MergeField 納入予定日 ¥@eeMMdd }(¥以下は半角です。)
{ MergeField 納品年月日 ¥@eeMMdd }
 {MergeField 請求年月日 ¥@eeMMdd }
 Wordのファイルが壊れているかもと白紙に差し込みフィールドセットして試すなど1週間近く、日付スイッチをいろいろ書き替えましたが力尽きました。どなたか同じことで悩まれた方いらっしゃいましたらアドバイスをよろしくお願いします。
なお、
○Excel側のフィールドは日付書式、入力値は「2017/5/28」、ExcelからWordへマクロ・OLEDB接続でデータを送り込み、Word側では日付スイッチで日付表示を任意の形にしていました。sheet名[基本データ]、Wordファイル名[物品購入伝票_原本.docx]
○検証のため、物品購入伝票_原本.docxを開き手動でExcelsheet[基本データ]を指定した場合、きちんと[290528]とすべてのフィールドが表示されました。Excel側からマクロで差し込むと上記現象が発生することがわかりました。
 

投稿日時: 17/12/23 22:06:56
投稿者: のりぴっぴ

下記コードで前期の現象が発生しています。よろしくお願いします。
変数は、別の先行するモジュールで定義しています。
'---------------------------------------------------------------------------
'Excel(MyxlsのMySht)データをWord(WdDoc)に差し込む。
'MyXls,MySht,FldrMyDoc,MyDocは、ここに入る前にpublic変数の宣言をしておくこと
'---------------------------------------------------------------------------
  
   
 '-----------------
Sub Word差込()
 '-----------------
Dim objword As Object
 Dim wddoc As Object
 Dim strSQL As String
   
 '-----------------
     '↓★★フォームから登録した伝票番号だけ抽出しワードに差し込む。
    '↓strSQLは順に足し込んでいかないと無効なのである。
    strSQL = "SELECT * FROM [" & MySht & "$]" '←sheet名
    strSQL = strSQL & "WHERE [伝票番号] =" '←エクセルの項目列名
    strSQL = strSQL & "'" & MyRng1.Offset(0, 4).Value & "'" '←=に続くフィルタする値
  
  Set objword = CreateObject("Word.Application") '←Wordオブジェクトを作成
     With objword
          .Visible = True
         '↓Wordドキュメントオブジェクトを作成→指定ワード文書が読み込まれた。
        Set wddoc = .Documents.Open(Filename:=ThisWorkbook.Path & FldrMyDoc)
     End With
       
     '----------------------------------
    With wddoc.MailMerge '↓フルパスでよろしくね!
        .MainDocumentType = wdFormLetters
         .OpenDataSource Name:=FullMyXls, SQLSTATEMENT:=strSQL
         .viewmailmergefieldcodes = False '←☆☆☆結果のプレビュー☆☆☆
               
      .Destination = wdSendToNewDocument
         .Execute
                          '↓伝票様式WORDfileを閉じる。今回は閉じない。
                        wddoc.Close savechanges:=False
                         '-----------------------
                    Dim buf As String
                     On Error GoTo myError
                         objword.activedocument.SaveAs ThisWorkbook.Path & "\実行結果\" & WdTitle
                         Exit Sub
                
      End With
         Set objword = Nothing
         Set wddoc = Nothing
       
 End Sub

回答
投稿日時: 17/12/24 10:51:17
投稿者: simple

こうした場合は閲覧側で再現できるような形でコードを提示したほうがよいと思います。
つまり、未宣言の変数などというものはやめてください。(勿論、値は架空のもので結構ですが)
 
手元で再現してみたけれど、特におかしいところは無かったです。
内容的にはWord側の話のようなので、Wordのセクションで尋ねたほうがよいかもしれませんね。
# Officeの更新の影響かなにかなんでしょうか。

投稿日時: 17/12/24 20:57:59
投稿者: のりぴっぴ

閲覧側で再現できないcodeでの質問となりましたこと、失礼致しました。
今後気を付けたいと思います。
ウーム、Word側の問題?そちらかもアプローチしてみたいと思います。
 
ありがとうございました。

回答
投稿日時: 17/12/24 21:23:02
投稿者: simple

> 改良を加えているうちに
どんな改良でしょうか。
Excel,Word のそれぞれに改良をしているのですか?
大事なポイントですよね。
あなたにとっては当たり前のことではあるんですが、
 
改良が今回の日付表示の変化をもたらしたのであれば、説明があったほうがよいでしょう。
 
# Wordに詳しい方が、こちらのセクションも見ているとは限りませんよ。
# Wordへ引っ越しして、改良内容も含めた説明をされたほうがよいかも。

回答
投稿日時: 17/12/25 08:31:09
投稿者: WinArrow
投稿者のウェブサイトに移動

私のPCの環境とは異なるので、当たっていないかもしれませんが、
私にWORDの差込印刷の日付で悩んだことがあります。
 
解決策としてExcel側で編集してWordに渡すことにしました、
今回の例では
> strSQL = "SELECT * FROM [" & MySht & "$]" '←sheet名
俺を
例えば
    strSQL = "SELECT *,FORMAT(起案年月日,'eemmdd') AS 起案年月日 FROM [" & MySht & "$]" '←sheet名
こんな風にアレンジしてみてはいかがでしょう?
勿論、WORD側の設定はスイッチを外します。
 

回答
投稿日時: 17/12/25 09:02:36
投稿者: WinArrow
投稿者のウェブサイトに移動

WORD差込印刷 日付スイッチをネット検索していたら
和暦の場合だけ「"」で囲む説明がありました。
理由はわかりませんが、試してみるとよいでしょう
 

 
>{ MergeField 起案年月日 ¥@eeMMdd }

{ MergeField 起案年月日 ¥@"eeMMdd" }
 

投稿日時: 17/12/25 13:50:16
投稿者: のりぴっぴ

WinArrow さん、具体的なアドバイスありがとうございます。
やってみます!まったく思いつかなったアプローチで結果が楽しみです。
また、日付に悩まれた方に遭遇できてほっとしました。
少々お時間を頂戴したいと思います。
 
simple さん、気にかけていただいてありがとうございます。
 
今回の不具合発生の原因となった改良の概要は次のとおりです。長くなって申し訳ありません。また、大幅すぎて関連性把握していただけるか不安に思ってもおります。
 
Excelの大改造を行い、その最終段階でWordもかなりの改造を行いました。
改良の概要は次のとおりです。
Excel側では
レコードの一単位を品名単位から伝票単位(2品印刷できます。)へ
それによって、基本データのフィールド数が2倍近くに増加、フィールドは三分の一位名前を変更、フォームのラベルやコントロールボックスについても大幅追加と変更を施しました。
 
ワード差し込み印刷関係部分としては、データを渡すやり方を変更しています。従来、sheet[印刷用データ]に差し込み用レコードを作成、Wordに送り込み、伝票作成ごとにクリアした上、また書き込むといった処理でした。今回は、sheet[印刷用データ]は廃止しsheet[基本データ]に一元化、印刷データはアクティブなレコードを取得しワードに渡す形「WHERE[伝票番号]のあたり」に変更しました。
 
Word様式においては、フィールド名の変更が多数、行ずれ防止のためテキストボックスを数分用意し差し込むように変更しました。
テキストボックスの数は同じものの重複配置を含めると70個前後にもなります。一方伝票の様式は手処理時代の印刷屋さんの印刷様式をイメージで取り込み、ヘッダーに挿入し、本文と様式が重なるように配置しています。(3100KBの容量となっています。容量が大きすぎるのか、テキストボックスが多すぎるのか?)

投稿日時: 17/12/30 20:25:00
投稿者: のりぴっぴ

WinArrowさん、できました!
 
日付フィールド5カ所のうち3カ所が日付シリアル値となっていたため、ご助言に従いstrSQLのコードに
Excel側で表示形式をセットし、Wordへ送り込んだところ大成功です。
 
旧)
    strSQL = "SELECT * FROM [" & MySht & "$]" '←sheet名
    strSQL = strSQL & "WHERE [伝票番号] =" '←エクセルの項目列名
    strSQL = strSQL & "'" & MyRng1.Offset(0, 4).Value & "'" '←=に続くフィルタする値
 
新)
strSQL = "SELECT *,FORMAT(納入予定日,'eemmdd') AS 納入予定日,FORMAT(納品年月日2,'eemmdd') AS 納品年月日2,FORMAT(請求年月日2,'eemmdd') AS 請求年月日2 FROM [" & MySht & "$]" '←sheet名
    strSQL = strSQL & "WHERE [伝票番号] =" '←エクセルの項目列名
    strSQL = strSQL & "'" & MyRng1.Offset(0, 4).Value & "'" '←=に続くフィルタする値
 
数カ月の作業がとん挫とあきらめかけていただけに本当にうれしいです。気持ちよく新春を迎えることができます。ありがとうございました。
なお、Word側の日付スイッチそのままでも直りました。
元号暦の""についても特に入れずとも有効でした。
返事遅れて申し訳ありませんでした。年末のバタバタと体力回復などなかなか作業に入れませんでしたので。
 
良いお年を!