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