見出し画像

段落→マークダウン変換:仕事にChatGPTを活用した備忘録


今日の困った


使っているツールによって、文章を階層化するとき、

  • 階層1

    • 階層2

のようなリストの機能を使うことが多いのですが、ツールから別のツールに移す際にうまく貼り付かなかったり、階層が消えてしまったりで、せっかく作ったのにとなることがあります。

ふと思い立ったので、Wordのリスト機能で作った文章を、マークダウンの形に変換してみることにしました。


ChatGTPにコードを書いてもらっても始めはうまくいかない

<プロンプト>
wordの階層構造をテキストに張り付けると崩れてしまいます。
マークダウン形式に書き換えるマクロを書きたい。


Word文書にある階層構造をテキスト形式で貼り付けるときに、形式が崩れてしまう問題を解決するために、Word文書の階層構造をマークダウン形式に変換するマクロを作成することが有効な解決策です。以下に、Word文書の見出しやリストをマークダウン形式に変換する基本的なマクロの概要を示します。

  1. 文書の見出しを検出: Word文書の見出しは、通常特定のスタイル(例えば「見出し 1」、「見出し 2」など)を持っています。マクロはこれらのスタイルを検出して、適切なマークダウン形式(例えば # 見出し 1## 見出し 2)に変換します。

  2. 箇条書きリストの変換: 箇条書きリストは、マークダウンのリスト形式(-* を使用)に変換されます。

  3. 番号付きリストの変換: 番号付きリストも、マークダウンの対応する形式(例えば 1.2. など)に変換されます。

  4. テキストのその他の要素の処理: テキストの太字、イタリック、下線などの書式は、マークダウンの対応する書式(例えば **太字***イタリック*)に変換します。

  5. 結果の出力: 変換されたマークダウン形式のテキストは、新しい文書に出力するか、クリップボードにコピーするか選択できます。

VBA (Visual Basic for Applications) を使用してこのようなマクロを作成することが可能です。ただし、VBAのコードを作成するには、Wordオブジェクトモデルに関する基本的な理解が必要です。また、実装の複雑さは、文書の内容と構造によって異なります。




違うんだ、解説はいいからコードが欲しいということで再度ChatGTPにお願いをしてみました。

<プロンプト>
箇条書きリストの変換: 箇条書きリストは、マークダウンのリスト形式(- や * を使用)に変換されます。 番号付きリストの変換: 番号付きリストも、マークダウンの対応する形式(例えば 1.、2. など)に変換されます。
この2つを実現するコードを書いて


了解しました。箇条書きリストと番号付きリストをマークダウン形式に変換するVBAマクロのコードを以下に示します。このコードは、Word文書内の箇条書きリストと番号付きリストを検出し、それぞれ適切なマークダウン形式に変換します。

Sub ConvertListsToMarkdown()
    Dim para As Paragraph
    Dim mdText As String
    Dim listLevel As Integer
    Dim bulletChar As String

    For Each para In ActiveDocument.Paragraphs
        With para.Range
            listLevel = .ListFormat.ListLevelNumber

            If .ListFormat.ListType = WdListType.wdListBullet Then
                ' 箇条書きリストの場合
                bulletChar = "- " ' ここで使用するマークダウンの記号を指定(例:"- ")
                mdText = mdText & String(listLevel, " ") & bulletChar & Trim(.Text) & vbCrLf
            ElseIf .ListFormat.ListType = WdListType.wdListNumber Then
                ' 番号付きリストの場合
                mdText = mdText & String(listLevel - 1, " ") & listLevel & ". " & Trim(.Text) & vbCrLf
            Else
                ' リストでない場合、通常のテキストとして追加
                mdText = mdText & .Text & vbCrLf
            End If
        End With
    Next para

    ' 結果を新しい文書に出力
    Dim newDoc As Document
    Set newDoc = Documents.Add
    newDoc.Content.Text = mdText
End Sub



お、すごい。出来てる! と思ったのはぬか喜び。動きません。
私が自力でデバッグできるわけがないので、ChatGTPと一緒にデバッグしてみることにしました。

ChatGTPと一緒にデバッグする

<プロンプト>
.wdListNumber について、メソッドまたはメンバないと出ます。



WdListType.wdListNumber
がエラーを引き起こしている場合、Wordのバージョンや設定によっては、このプロパティが認識されない可能性があります。通常、WdListType 列挙には wdListNumber が含まれているはずですが、特定の環境では問題が発生することがあります。
この問題を解決するためには、番号付きリストを判定するための別のアプローチを試みる必要があります。一つの方法は、番号付きリストかどうかを判定する際に ListFormat.ListType の値を直接比較することです。以下のコードは、このアプローチを使用しています。

Sub ConvertListsToMarkdown()
    Dim para As Paragraph
    Dim mdText As String
    Dim listLevel As Integer
    Dim bulletChar As String

    For Each para In ActiveDocument.Paragraphs
        With para.Range
            listLevel = .ListFormat.ListLevelNumber

            If Not .ListFormat Is Nothing Then
                If .ListFormat.ListType = 7 Then ' 7 は番号付きリストを意味します
                    mdText = mdText & String(listLevel - 1, " ") & listLevel & ". " & Trim(.Text) & vbCrLf
                ElseIf .ListFormat.ListType = 0 Then ' 0 は箇条書きリストを意味します
                    bulletChar = "- " ' 箇条書きリストの記号
                    mdText = mdText & String(listLevel, " ") & bulletChar & Trim(.Text) & vbCrLf
                Else
                    mdText = mdText & .Text & vbCrLf
                End If
            Else
                mdText = mdText & .Text & vbCrLf
            End If
        End With
    Next para

    ' 結果を新しい文書に出力
    Dim newDoc As Document
    Set newDoc = Documents.Add
    newDoc.Content.Text = mdText
End Sub

このコードでは、番号付きリストは ListType = 7、箇条書きリストは ListType = 0 として扱われます。これらの値は、一般的にWordのリストタイプに割り当てられている数値ですが、異なる環境での動作は保証されませんので、実際のWord環境で確認が必要です。




きちんと代替案を出して行動を書いてくれた後に、変数について解説までつけてくれました。これなら何とかなるかもしれない。
と思いきや、うまくマークダウンが生成されません。
どうも、

番号付きリストは ListType = 7、箇条書きリストは ListType = 0 として扱われます。

の部分が違うようです。
実際にマクロをStep by Stepで動かして番号を見てみると 4になっていました。
幸いなことに、その程度の修正であれば自分でもできてしまいます。
自力でコードは書けませんが、今回は目の前にヒントをチラつかされてのバグだったのでなんとかなってしまいました。というお話でした。

いただいたサポートはChatGPT有料版の費用に使わせていただきます!