三流君 ken3のmemo置き場

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

挨拶・自己紹介:「こんな感じ」や「あの、あの」と活舌の悪い、
三流プログラマーのオッサンです

当ブログではGoogle AdSenseおよび各種アフィリエイトプログラムを利用して広告を配信しています。

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 以外を考えないといけないので、難しいかも・・・


質問・感想・クレームなど、
気軽にコメント欄に書いてもらえるとうれしいです。

当ブログではGoogle AdSenseおよび各種アフィリエイトプログラムを利用して広告を配信しています。


フッター:最後にKen3Videoの動画一覧を紹介します

YouTubeにアップした動画です。他の動画を一瞬でも見てもらえるとさらに嬉しいです。
再生リスト:[三流君Ken3の最新動画]←リストの一覧形式で表示する


また、ブログを見に来てくださいね。ではまたぁ~