ドタバッタンのブログ

ドタバッタンのブログ

DIY、電子工作系

Wordマクロで、PDFをKindleで読みやすいA6サイズに変換する。2026年版。

◆使用目的・開発理由
・ネットから無料ダウンロードできるPDF形式の小説は、
 PC画面で読むのには適したサイズですが、Kindleでは
 字が小さすぎて読めないため、用紙サイズをA6に加工します。
・2022年から使用してきたマクロが、2026年3月から

 (たぶんOfficeの変更で)動作不良になりました。

(文書の先頭を削除、というマクロが動作しない。)
 直そうとすると別の不具合も次々と出てきたため、

 大幅な変更をしました。
 


◆使い方
1.加工の進捗状況を見たい場合は、マクロ実行前に
 Altキーを押しながらF11キー。
 Crtlキーを押しながらGキー。これでイミディエイトウィンドウが現れます。
 イミディエイトウィンドウの位置、サイズを

 見やすいよう調整してください。
2.マクロ「PDFを読み込んでDOCXで保存」を実行すると、
 どのPDFを開くか、と聞いてきます。
 ファイルを選択すると、PDFをWordで開いて、

 拡張子.docx で保存します。
3.マクロ「分割とPDF保存」を実行すると、
 どのWord文書を開くか、と聞いてきます。
 ファイルを選択すると、4万文字ごとに分割して

 PDFで保存します。
 元のDocxファイルは変更せずに閉じます。
4.マクロ「カクヨムTXTをDOCXにする」を実行すると、
 どのtxtファイルを加工するか聞いてきます。ファイルを選択
 すると、"[#改ページ]" などを消して、

 別名のtxtで保存します。
 (ルビの加工機能はありません。)
 


Wordマクロファイル 初回だけの準備手順。

■Wordファイルにマクロを入れる方法
スタートボタン。Win11の場合、アプリの一覧を開く。
Word をクリック。
「白紙の文書」をクリック。真っ白な新規文書の画面になる。
Alt+F11キー(キーボードのAltを押しながらF11)。
Visual Basicのウインドウが開く。
メニューの「挿入」。「標準モジュール」をクリック。
Module1 というウインドウが開く。
このウインドウの中に、下記のプログラムをコピペする。
 

Sub PDFを読み込んでDOCXで保存()
'ボタンで呼び出される。
'Private Sub CommandButton1_Click()
'    Call PDFを読み込んでDOCXで保存
'End Sub
    Dim dir0 As String, file0 As String, dir1 As String, file1 As String, file2 As String
    Dim p_ALL As Long
    
    Debug.Print Now & " : ■ Start ■"
    
    Application.WindowState = wdWindowStateNormal  'ウィンドウを最大化しない

    dir0 = ActiveDocument.Path '開くダイアログで最初に表示されるフォルダ
    file0 = ActiveDocument.Name    'マクロファイル名
    
    '------------------------------------
    If ファイルをダイアログで開く(dir0, "PDFファイル", "*.pdf") = False Then
        Exit Sub       '開くのをキャンセルしたら先に進まないよう停止
    End If
    
    '開いてからの、PDFファイルの場所と名前を取得
    dir1 = ActiveDocument.Path
    file1 = ActiveDocument.Name
    
    If Right(file1, 3) <> "pdf" And Right(file1, 3) <> "PDF" Then
        MsgBox "PDFではありません。"
        Exit Sub
    End If
    
    Debug.Print " PDFを読み込んでDOCXで保存 開始。"
    
    '保存予定の名前を作成
    file2 = Replace(Replace(file1, ".pdf", ""), ".PDF", "") & ".docx"
    
    If Dir(dir1 & "\" & file2) <> "" Then     'ファイルが既存の場合
        'MsgBox file2 & "は既にあります。別の名前にします。"
        file2 = Replace(file2, ".docx", "_" & Format(Time, "hhmm") & ".docx") '時刻つきに。
    End If
    
    'MsgBox "名前をつけて保存します " & vbLf & dir1 & vbLf & file2
    
    ActiveDocument.SaveAs fileName:=dir1 & "\" & file2 '名前を付けて保存

    p_ALL = Selection.Information(wdNumberOfPagesInDocument)    '総ページ数
    
    'MsgBox "ファイルを閉じます。" & vbLf & "(次の段階に進む前に、閉じる必要があります。) "
    
    Documents(file2).Close          '文書を閉じる
    
    Debug.Print Now & ":名前をつけて保存 "
    Debug.Print file2 & "、ページ数 " & p_ALL
    MsgBox "名前をつけて保存しました。" & vbLf & file2

End Sub


Function ファイルをダイアログで開く(ByVal dir1 As String, ByVal memo As String, ByVal kaku As String) As Boolean
    Dim file1 As String, file2 As String
    Dim myFD As FileDialog
    Dim myFolderPath As String

    ファイルをダイアログで開く = False
    
    file1 = ActiveDocument.Name
    
    myFolderPath = dir1   'フォルダパスを設定
    
    'ファイルの選択ダイアログ
    Set myFD = Application.FileDialog(msoFileDialogFilePicker)
    
    With myFD
       .Title = "ファイルを選択してください"
     
       .AllowMultiSelect = False       '複数ファイルの選択をオフ
    
        With .Filters        '表示するファイルの種類の設定
         .Clear
         .Add memo, kaku
        End With
        
        .InitialFileName = myFolderPath   '最初に表示するフォルダを設定
        
        'ファイルを選択して「OK」ボタンをクリックした場合の処理
        If .Show = -1 Then
            Documents.Open fileName:=.SelectedItems(1)
        End If
    
        .Filters.Clear    '表示するファイルの種類の設定を解除
  
    End With

    Set myFD = Nothing
   
    If ActiveDocument.Name = file1 Then  '開いてない
        Exit Function
    End If

    ファイルをダイアログで開く = True

End Function


Sub 分割とPDF保存()
'ボタンで呼び出される。
'Private Sub CommandButton2_Click()
'    Call 分割とPDF保存
'End Sub
    
    Dim dir1 As String, file1 As String, file2 As String
    Dim p_ALL As Long, p1 As Long, p2 As Long, p_sep As Long
    Dim i As Long
    Dim txt1 As String
    Dim targetDoc As Document
    Dim totalChars As Long
    Dim splitSize As Long
    Dim startPos As Long, endPos As Long
    Dim pdfCount As Integer ' 連番用のカウンター
    Dim rSearch As Range
    Dim searchLimit As Long
    
    Dim myFontSize As Long: myFontSize = 13     'フォントサイズ
    splitSize = 400000      '何文字分を切り出してPDFにするか
    
    Debug.Print Now & " : ■■■■■"

    Debug.Print " " & "ファイルを開く。"
    If ファイルをダイアログで開く(ActiveDocument.Path, "Word、txtファイル", "*.doc; *.docx; *.txt") = False Then
        Exit Sub
    End If
    
    Set targetDoc = ActiveDocument
    dir1 = targetDoc.Path
    file1 = targetDoc.Name
    Debug.Print " " & file1
    
    Call ウィンドウを左半分に寄せる(targetDoc)

    ActiveWindow.View.Type = wdNormalView    ' 下書き表示にして計算負荷を抑える
    
    totalChars = targetDoc.Content.End
    
    startPos = 0
    pdfCount = 1 ' 1からスタート
    
    Do While startPos < totalChars - 1
        endPos = startPos + splitSize   ' いったんの終了目安を決める
        
        If endPos >= totalChars - 1 Then  ' 文末チェック
            '本の末尾の1文字(セクション情報)を避ける。最終巻は1を引かないとA6横になってしまう。
            endPos = totalChars - 1
            Debug.Print "本の末尾1文字を避けて範囲確定。"

        Else
            ' 句読点「。」で区切るロジック
            searchLimit = endPos + 1000 '1000文字先まで調べる
            If searchLimit > totalChars - 1 Then searchLimit = totalChars - 1
            
            Set rSearch = targetDoc.Range(endPos, searchLimit)

            With rSearch.Find
                .Text = "。"
                .Forward = True
                .Wrap = wdFindStop
                If .Execute Then endPos = rSearch.End   ' 「。」の直後を終了位置にする
            End With
            
        End If
        
        Debug.Print " 取り出し範囲Pos " & startPos & "~" & endPos & "文字め。"
 
        Call 抽出してA6PDF保存_Pos版(targetDoc, startPos, endPos, myFontSize, pdfCount)
        
        startPos = endPos
        pdfCount = pdfCount + 1 ' 次のファイルのために1増やす
        
        If startPos >= totalChars Then Exit Do
        
    Loop

    targetDoc.Close SaveChanges:=False        ' 元の文書を閉じる
    
    MsgBox "全 " & (pdfCount - 1) & " ファイルの作成が完了しました。"
    
End Sub



Sub 抽出してA6PDF保存_Pos版(ByRef srcDoc As Document, pStart As Long, pEnd As Long, fSize As Long, fileIdx As Integer)
    Dim newDoc As Document
    Dim r As Range
    Dim savePath As String, baseName As String, PfileName As String

    ' 元のファイル名から拡張子を除いた部分を取得
    baseName = Left(srcDoc.Name, InStrRev(srcDoc.Name, ".") - 1)
    baseName = Left(baseName, 15)
    PfileName = baseName & "_" & Format(fileIdx, "00") & ".pdf"     'PDFファイル名
    savePath = srcDoc.Path & "\" & PfileName  ' 保存パスの作成
    
    Set r = srcDoc.Range(pStart, pEnd)   ' 範囲取得
    

    r.Copy                           ' コピー
    
    Set newDoc = Documents.Add(Visible:=True) '新規文書作成
    
    newDoc.Activate '最前面に
    Call ウィンドウを左半分に寄せる(newDoc)
    
    '縦書き&用紙を縦、というのは困難なため、横書き
    newDoc.Range.Orientation = wdTextOrientationHorizontal '横書き

    '用紙サイズなどを設定。大量の文字を貼ってからだとフリーズするので、カラ状態で実行。
    With newDoc.PageSetup
        .HeaderDistance = 0
        .FooterDistance = 0
        .TopMargin = MillimetersToPoints(1)     '余白
        .BottomMargin = MillimetersToPoints(9)
        .LeftMargin = MillimetersToPoints(2)
        .RightMargin = MillimetersToPoints(5)
        
        .PageWidth = MillimetersToPoints(100)   '用紙の幅
        .PageHeight = MillimetersToPoints(141)
        .Orientation = wdOrientPortrait     '用紙「縦向き」
    End With
    Debug.Print " ページ設定した。"
    
    newDoc.Content.Paste ' 文字を大量に貼り付け
    Debug.Print " カラのWord文書に文字を貼り付けした。"

    ' --- 貼り付け直後に実行:孤立した数字(1~4桁)を消去する ---
    With newDoc.Content.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "^13[0-9]{1,4}^13"
        .Replacement.Text = "^p"
        .MatchWildcards = True  ' ← ここはONにする
        .Execute Replace:=wdReplaceAll
    End With
    Debug.Print " 元のページ番号を消した。"

    ' 文書内の「セクション区切り」をすべて「改ページ」に置換
    ' これにより、コピー元の「縦書き・横向き」設定が復活するのを防ぎます
    With newDoc.Content.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "^b"             ' セクション区切りの記号
        .Replacement.Text = "^m"  ' 通常の改ページの記号
        .Execute Replace:=wdReplaceAll
    End With
    Debug.Print " セクション区切りを削除した。"
    
    '全体のフォントサイズと「行間」の調整
    With newDoc.Content
        .Font.Size = fSize
     
        With .ParagraphFormat   ' 行間が広すぎるのを防ぐ設定
            .LineSpacingRule = wdLineSpaceExactly ' 行間を固定値に指定
            .LineSpacing = fSize * 1.4    'フォントサイズの*倍に固定。1.2だとルビと文字が接触する。
            .SpaceBefore = 0            ' 段落前の余白ゼロ
            .SpaceAfter = 0             ' 段落後の余白ゼロ
        End With
    End With
    Debug.Print " フォントサイズ" & fSize & "にした。"

    Dim sec As Section
    For Each sec In newDoc.Sections
        sec.Footers(wdHeaderFooterPrimary).Range.Font.Size = 8 ' フッターのフォントサイズ固定
        sec.Footers(wdHeaderFooterPrimary).Range.ParagraphFormat.Alignment = wdAlignParagraphRight    ' 右寄せ
    Next sec
    Debug.Print " フッターのフォントを小さくした。PDF保存開始。"
    
    ' PDF出力
    newDoc.ExportAsFixedFormat OutputFileName:=savePath, ExportFormat:=wdExportFormatPDF
    newDoc.Close SaveChanges:=False
    Debug.Print Now & " " & "PDF保存 "
    Debug.Print "" & PfileName

End Sub



Sub ウィンドウを左半分に寄せる(targetDoc As Document)
    Dim halfWidth As Double

    targetDoc.ActiveWindow.WindowState = wdWindowStateNormal    'まず「標準サイズ」に

    halfWidth = Application.UsableWidth / 2    '使用可能な最大幅の半分を計算
 
    With targetDoc.ActiveWindow   ' 位置とサイズを指定
        .Top = 0                ' 画面の一番上
        .Left = 0               ' 画面の一番左
        .Width = halfWidth      ' 幅は全体の半分
        .Height = Application.UsableHeight ' 高さは最大
    End With
End Sub




Sub カクヨムTXT置換()    '(ChatGPTにて作成)
'ボタンで呼び出される。
'Private Sub CommandButton3_Click()
'    Call カクヨムTXT置換
'End Sub

    Dim dlgOpen As FileDialog
    Dim originalFileName As String
    Dim newFileName As String
    Dim filePath As String
    Dim targetDoc As Document
    
    Debug.Print Now & " : ■■ カクヨム Start ■■"
    ' ファイル選択ダイアログを開く
    Set dlgOpen = Application.FileDialog(msoFileDialogFilePicker)
    With dlgOpen
        .Title = "開くテキストファイルを選択"
        .Filters.Clear
        .Filters.Add "Text Files", "*.txt"
        .AllowMultiSelect = False
        .InitialFileName = ThisDocument.Path & "\" ' ダイアログの初期フォルダを設定
        
        ' ユーザーがファイルを選択した場合
        If .Show = -1 Then
            originalFileName = .SelectedItems(1) ' 選択したファイルのフルパス
            
            Documents.Open originalFileName    ' ファイルを開く
            
            Set targetDoc = ActiveDocument
            dir1 = targetDoc.Path
            file1 = targetDoc.Name
            Debug.Print " " & file1
    
            Call ウィンドウを左半分に寄せる(targetDoc)
            
            ' 置換処理
            Debug.Print " 文字列置換する"
            Call 文字列置換("[#改ページ]", "------------------" & vbCrLf)
            Call 文字列置換("[#中見出し]", "■■ ")
            Call 文字列置換("[#中見出し終わり]", " ■■ " & vbCrLf)
            Call 文字列置換("[#大見出し]", "■■■ ")
            Call 文字列置換("[#大見出し終わり]", " ■■■ " & vbCrLf)
            Call 文字列置換("[#丸傍点]", "")
            Call 文字列置換("[#丸傍点終わり]", "")
            Call 文字列置換("※[#始め二重山括弧、1-1-52]", "〈〈")
            Call 文字列置換("※[#終わり二重山括弧、1-1-53]", "〉〉")
            Call 文字列置換("※[#縦線、1-1-35]", " -- ")
           '
            ' 新しいファイル名を作成。
            newFileName = Replace(originalFileName, ".txt", "_.txt")
            '
            ' 新しいファイル名で保存
            ActiveDocument.SaveAs2 fileName:=newFileName, FileFormat:=wdFormatUnicodeText   'UTF-8 保存
            ActiveDocument.Close   '閉じる

            Debug.Print Now & " 保存した"
            Debug.Print Dir(newFileName)
            
            MsgBox "アンダーバー付きの別名で保存しました " & vbLf & Dir(newFileName), vbInformation
        Else
            MsgBox "ファイルが選択されませんでした。", vbExclamation
        End If
    End With

    '「[#改ページ]」などの文字を消すだけで、ルビの加工機能はない。
    'カクヨムのtxtファイルには、ルビにするための記号があり、
    '理論上は小さいルビ文字に加工できるものの、実際には高負荷でフリーズ
    'してしまうため、断念。
    '2026年4月、変換個数をカウントして試したところ、600箇所を処理した
    'ところで「応答なし」になりフリーズした。
End Sub


Sub 文字列置換(oldtxt As String, newtxt As String)
    Dim doc As Document
    Set doc = ActiveDocument

    With doc.Content.Find
        .Text = oldtxt
        .Replacement.Text = newtxt
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceAll
    End With
End Sub

 


左側、「Module1」の下に「ThisDocument」があるので、

ダブルクリック。
ThisDocument のウインドウが開く。
この中に、下記のプログラムを貼る。

Private Sub CommandButton1_Click()
    Call PDFを読み込んでDOCXで保存
End Sub
Private Sub CommandButton2_Click()
    Call 分割とPDF保存
End Sub
Private Sub CommandButton3_Click()
    Call カクヨムTXT置換
End Sub
Private Sub Document_Open()
    Application.Move Left:=2, Top:=10  ウインドウを左寄せ
    Application.Resize Width:=734, Height:=333
End Sub

 


<文書上にボタンを置く方法>
Word文書のウインドウ(Visual Basicではないほう)。
上のメニューの「校閲」「表示」の右に「開発」がない場合は、
メニュー文字やリボンの上で右クリックして

「リボンのユーザー設定」、
「開発」にチェックを入れ、OKボタン。
「開発」のリボンの中、「コントロール」欄。
小さいボタンが並んでいる中で、黒いカバンのようなボタン
(以前のバージョンのツール)をクリック。
小さいボタン群が現れた中で、白い長方形 (コマンドボタン)

をクリック。
文書上に、CommandButton1 が現れる。
メニュー(開発タブの中)の「デザインモード」をクリックして
「デザインモード」がグレーで押された状態にする。
その直下の「プロパティ」をクリック。
プロパティウインドウが現れる。
プロパティウインドウで、一番上の選択肢からCommandButton1を選ぶ。
設定項目が10個以上ある中で「Caption」が、現在「CommandButton1」になっているのを、
「PDFを読み込んでDOCXで保存」など、自分でわかりやすい言葉に変える。
あと2つ、同様にボタンを作る。
(コマンドボタン。CommandButton2が現れる。
 プロパティで、Captionを「分割とPDF保存」にする。)
(コマンドボタン。CommandButton3が現れる。
 プロパティで、Captionを「カクヨムTXT置換」にする。)
ボタンが配置できたら、「デザインモード」をクリックして、
「デザインモード」が押されていない状態に戻す。

<名前をつけて保存>
メニューの「ファイル」、「名前を付けて保存」。
「このPC」。保存したいフォルダを選ぶ。
(加工対象のPDFを保存するのと同じ場所がよい。)
名前を付ける画面で、初期状態「文書1.docx」の文字を
全部消して、例えば「PDF分割マクロ」と入力する。
その直下、ファイルの種類は、必ず、

「Wordマクロ有効文書」を選ぶ。

「保存」をクリック。

■カスタマイズするには。
1.マクロ「Sub 分割とPDF保存()」の中の
 「Dim myFontSize As Long: myFontSize = 13     フォントサイズ
    splitSize = 400000      何文字分を切り出してPDFにするか」
    を、変更したい場合は変更します。
2.マクロ「抽出してA6PDF保存_Pos版」は、
 用紙をA6サイズぐらい設定するようになっているので、
 変更したい場合は数字を調整します。