三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Word VBA ワード文章をページ単位でテキストファイルに書き出す マクロをデバッグ

ワード文章をページ単位でテキストファイルに書き出す
そんな動作を行うマクロをデバッグしてみました。

下記、いつもの デバッグ動画です
youtu.be
https://youtu.be/FXNjGsLen18
目次
00:00 あいさつ、やりたいこと
00:50 1.ページ選択のテスト
03:15 2.ページをコピー新規word文章に貼り付けテキスト保存
07:55 3.最終ページ番号の取得
08:52 4.単体のコードを結合してテスト
11:17 元のソースコードをテストしてみた

#WordVBA #マクロ #デバッグ #ページ単位 #テキストファイル #MSWord #ActiveDocument #Bookmarks #Page #Select

0.あいさつ、やりたいこと
知恵袋の質問
detail.chiebukuro.yahoo.co.jp
デバッグしてみた

単体テストから入る

1.ページ選択のテスト
00:50 1.ページ選択のテスト

Sub 単体1_ページを選択する()

    Dim p As Integer
    
    p = InputBox("テストページ", "ページ数入力", "1")

    'ページ移動 カーソル移動
    'wdGoToAbsolute  1   絶対位置
    Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=p
    
    'ページ選択 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14267908039 の
    ' anna*******さん回答
    ' txt = ActiveDocument.Bookmarks("\page").Range
    'より ActiveDocument.Bookmarks("\page") 引用
    
    'カーソルがあるページ全体が選択された状態になる。
    ActiveDocument.Bookmarks("\Page").Select

End Sub

2.ページをコピー新規word文章に貼り付けテキスト保存

03:15 2.ページをコピー新規word文章に貼り付けテキスト保存

Sub 単体2_選択範囲をコピーして新規word文章に貼り付けテキスト保存()

    '選択状態 .Select で選択範囲をコピーして
    Selection.Copy
    
    '新規word文章に貼り付け
    'テキスト保存
    ' https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12267387607
    
    Documents.Add     '新規Document文書追加
    Selection.Paste   '単純に貼り付け
    Selection.TypeBackspace  '一文字Backspace?消しているが?なぜだろう・・・
    
    ChangeFileOpenDirectory "D:\2022"  '保存ディレクトリ?に変更

    'DocNum = DocNum + 1  'ファイル名、今回は使用しないのでコメント
    
    'ファイル名だけ指定して、FileFormat:=wdFormatText テキストフォーマットで保存
    ActiveDocument.SaveAs FileName:="単テキスト保存テスト.txt", FileFormat:=wdFormatText
    
    ActiveDocument.Close  '↑で保存したので、閉じる

End Sub


3.最終ページ番号の取得

ループで回した時、最後が知りたいので、
最終ページ番号の取得をテスト

07:55 3.最終ページ番号の取得

Sub 単体3_最終ページ番号の取得()

    Dim p As Integer
    
    p = ActiveDocument.Range.Information(wdNumberOfPagesInDocument)

    MsgBox "総ページ数(最終ページは) " & p & " です"

End Sub

4.単体のコードを結合してテスト

08:52 4.単体のコードを結合してテスト

Sub 結合テスト()  '1ページから最終ページまでループさせテキストファイルを作成

    Dim 最終ページ As Integer
    
    最終ページ = ActiveDocument.Range.Information(wdNumberOfPagesInDocument)
    
    Dim p As Integer
    
    For p = 1 To 最終ページ
    
        'ページ移動 カーソル移動
        'wdGoToAbsolute  1   絶対位置
        Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=p
        
        'ページ選択 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14267908039 の
        ' anna*******さん回答
        ' txt = ActiveDocument.Bookmarks("\page").Range
        'より ActiveDocument.Bookmarks("\page") 引用
        
        'カーソルがあるページ全体が選択された状態になる。
        ActiveDocument.Bookmarks("\Page").Select
    
        '選択状態 .Select で選択範囲をコピーして
        Selection.Copy
        
        '新規word文章に貼り付け
        'テキスト保存
        ' https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12267387607
        
        Documents.Add     '新規Document文書追加
        Selection.Paste   '単純に貼り付け
        Selection.TypeBackspace  '一文字Backspace?消しているが?なぜだろう・・・
        
        ChangeFileOpenDirectory "D:\2022"  '保存ディレクトリ?に変更
    
        'p.txt ファイル名だけ指定して、FileFormat:=wdFormatText テキストフォーマットで保存
        ActiveDocument.SaveAs FileName:=p & ".txt", FileFormat:=wdFormatText
        
        ActiveDocument.Close  '↑で保存したので、閉じる
    
    Next p

    MsgBox "処理終了"

End Sub

元のソースコードで動く?ので

>2ページに跨いで表が作成されているところの変換がおかしくなっていることが判明しました

↑この表が、何かやっているのかなぁ?
単純な
ActiveDocument.Bookmarks("\page").Range.Copy
だと、ページをまたぐのか?
現物のまたいだ表、データが無いと、なんとも言えないのかなぁ・・・と逃げてみたり(ぉぃぉぃ・・・)

2022/09/12 追記



原因わかりました
ActiveDocument.Bookmarks("\Page").Select
だと、
セル内で改行して次のページに[またいでいる]と
選択範囲が広がっていて、
それを.Copyしているので、テキストに落とした時に、目的の動作をしないみたいです。
※ページマタギの表を確認してみてください、

同じように、
表のセルの中で改行
ページをまたいでいると思います。

これが、原因かなぁ・・・
youtu.be
https://youtu.be/IMXD_oJXr7Q
↑追加の動画解説を見て、デバッグの抜け、不具合のパターンを確認してみてください。
※おじさんのデバッグが甘かったです・・・

で、対策は。
わかりません。※ぉぃぉぃ

原因だけ、お知らせします。
※※単純な ActiveDocument.Bookmarks("\Page").Select 以外を考えないといけないので、難しいかも・・・

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)