microsoft365のアプリには当初からVBA(マクロ)が使えます
アプリの機能,windowsの機能などを使うことができ、本格的な操作ができます
しかし下記の状況で

  • 悪意のあるウイルスを混入できることから、デフォルトでは実行が無効になっています。SHIFTキーを押しながらアプリを起動するとマクロを起動させないことができます。開発でマクロのソースを見ることは可能ですが、プログラマでないと、どのような操作をするのかわかりません
  • 言語仕様が過去のもので、最新の言語と比べ見劣り
  • 作成者が素人なのでメンテナンスができない


このためマクロは止めようという方向に進んでいます。

でもまだまだマクロはとてもいい機能なので捨てがたいです。
なんとかならないものでしょうか

実際のプログラム開発では、様々なドキュメントが作成されます。このドキュメントにより第3者がアプリのメンテナンスができます。
マクロは簡単に作れるため、このようなドキュメントを作成するのは稀なようです。
このドキュメント作成にかかわる工数も結構なものになります

AIに聞いてみましょう

例として最近作ったマクロで試してみます

綺麗に解析してくれました

 

概要設計としては申し分ないです

これって使えるんじゃないですか!

既存のマクロの設計書をAIで作りましょう

 

逆に、このような設計ドキュメントをAIに入れれば、マクロを作ってくれるのではないでしょうか

そうすれば何を作りたいか具体的に記述すればAIがプログラムを作ってくれるはずです。

これからのプログラマの仕事のやり方が大きく変わります

マクロのソースをcopilotに貼り付け
このマクロのドキュメントを作ってください」と入れます

このマクロは、PowerPointのスライドを画像としてエクスポートし、Wordに挿入するという機能を持っています。
以下に、このマクロの設計書を作成するための手順を示します。


マクロの目的と概要を記述する

  • マクロの目的は、PowerPointのスライドをWordに挿入することで、報告書や資料の作成を効率化することです。
  • マクロの概要は、以下のようになります。
  • マクロは、Wordと同じフォルダにあるPowerPointファイルを探し、見つかった場合はそのファイル名を変数に格納します。
  • マクロは、PowerPointファイルを開き、各スライドを画像としてエクスポートします。画像は、Wordと同じフォルダに「images」というサブフォルダを作成し、そこに保存します。
  • マクロは、エクスポートした画像の数をカウントし、Wordに挿入します。画像は、行内形式で挿入され、枠線が付きます。
  • マクロは、音声合成の機能を使って、作業の進捗や完了をユーザーに伝えます。


マクロの入力と出力を記述する

  • マクロの入力は、Wordと同じフォルダにあるPowerPointファイルです。ファイル名は任意ですが、拡張子は「.pptx」である必要があります。
  • マクロの出力は、Wordに挿入された画像です。画像は、PowerPointのスライドと同じサイズで、行内形式で挿入されます。また、画像には枠線が付きます。
  • マクロの処理の流れを記述する


マクロの処理の流れは、以下のようになります。

  • マクロは、Sub PPTXスライドをwordに挿入します()というメインのプロシージャから始まります。
  • マクロは、Function getPPTX()という関数を呼び出して、Wordと同じフォルダにあるPowerPointファイルの名前を取得します。ファイルが見つからない場合は、エラーメッセージを表示して終了します。
  • マクロは、Call pptx2Imageというサブプロシージャを呼び出して、PowerPointファイルを開き、各スライドを画像としてエクスポートします。画像は、「images」というサブフォルダに保存されます。
  • マクロは、Call insertAllImageというサブプロシージャを呼び出して、エクスポートした画像をWordに挿入します。画像は、行内形式で挿入されます。
  • マクロは、Call 図に枠線をつけるというサブプロシージャを呼び出して、挿入した画像に枠線を付けます。枠線の色や太さは、定数で指定されます。
  • マクロは、Sub speakというサブプロシージャを呼び出して、作業の進捗や完了を音声で伝えます。音声合成の機能は、Excelのオブジェクトを利用します。


マクロのコードを記述する
マクロのコードは、以下のようになります。
Dim imageFolder
Dim tts
Dim pptxName


Sub PPTXスライドをwordに挿入します()
' 画像挿入マクロMain パワーポイントでエクスポートされたスライド画像を取り込むマクロです
'pptxとこのWORDを同じところに置いてください
'このマクロをWORDで実行してください

'音声合成のため 参照設定:Microsoft Excel 16.0 Object Library
'
    tts = True
    imageFolder = "images"
    pptxName = getPPTX()                  'pptxを探す
    StatusBar = "PPTXエクスポート"
    Call pptx2Image                 'PPTXエクスポート
    StatusBar = "画像挿入"
    Call insertAllImage             '挿入
    StatusBar = "画像すべてに枠線を付ける"
    Call 図に枠線をつける           '画像すべてに枠線を付ける
    StatusBar = ""
    speak ("完了しました")

End Sub
Sub insertAllImage()
'
speak ("WORDにpowerpointのエクスポートされた画像を挿入します")

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Dim strPath As String
'ドキュイメントのパス
strPath = ThisDocument.Path

'画像ファイル数を見つける
n = 0
Dim obj As Object
For Each obj In objFso.getfolder(strPath & "\" & imageFolder).Files
    If InStr(obj.Name, ".png") <> 0 Then n = n + 1
Next obj
Set objFso = Nothing

speak ("画像が" & n & "個見つかりました。挿入します")

'挿入
For k = 1 To n
    cname = strPath & "\" & imageFolder & "\" & Trim(k) & ".png"
    Selection.InlineShapes.AddPicture FileName:=cname, LinkToFile:=False, SaveWithDocument:=True
Next


End Sub


'参照設定:Microsoft Excel 16.0 Object Library
Sub speak(line)
    If tts = True Then
        Dim ExObj As Object
        Set ExObj = CreateObject("Excel.Application")
        ExObj.Speech.speak line
        ExObj.Quit
    Else
        MsgBox line
    End If
End Sub
Function getPPTX()
'wordと同じ場所にあるPPTXを探す
    Dim objFso As Object
    Set objFso = CreateObject("Scripting.FileSystemObject")

    Dim strPath As String
    strPath = ThisDocument.Path
    getPPTX = ""

    Dim obj As Object
    For Each obj In objFso.getfolder(strPath).Files
        If InStr(obj.Name, ".pptx") <> 0 Then
            getPPTX = obj.Name

            Exit For
        End If
    Next obj
    Set objFso = Nothing
End Function
Sub pptx2Image()
'、画像にエクスポートします


   speak (pptxName & " powerpointを画像にエクスポートします")
    
    Dim strPath As String
    strPath = ThisDocument.Path

    Dim p, f, s
    With CreateObject("PowerPoint.Application")
        Set p = .Presentations.Open(strPath & "\" & pptxName, -1, 0, 0)
        With CreateObject("Scripting.FileSystemObject")
            f = .BuildPath(strPath, imageFolder)
            If Not .FolderExists(f) Then .CreateFolder f
            For Each s In p.Slides
                 s.Export .BuildPath(f, s.SlideNumber & ".png"), "png"
            Next
        End With
        .Quit
    End With
End Sub

Sub 図に枠線をつける()
    'このマクロは「行内」画像にしか作用しません。
    
    Const THEME_COLOR As Integer = wdThemeColorBackground2
    Const TINT_AND_SHADE As Long = 0
    Const BRIGHTNESS As Double = -0.25
    Const WEIGHT As Double = 0.5
    
    Dim shp As InlineShape
    Dim shapes As Variant
     
    Selection.WholeStory
    Set shapes = Selection.InlineShapes
     
    For Each shp In shapes
        If shp.Type = msoChart Then
            shp.line.Visible = msoTrue
            If DEBUG_MODE Then
                shp.line.ForeColor = RGB(255, 0, 0)
            Else
                shp.line.ForeColor.ObjectThemeColor = THEME_COLOR
            End If
            shp.line.ForeColor.TintAndShade = TINT_AND_SHADE
            shp.line.ForeColor.BRIGHTNESS = BRIGHTNESS
            shp.line.WEIGHT = WEIGHT
        End If
    Next shp
  
    Selection.Collapse
End Sub