AIにマクロの設計書を作らせてみた
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 imageFolderDim ttsDim pptxNameSub 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 SubSub insertAllImage()'speak ("WORDにpowerpointのエクスポートされた画像を挿入します")Dim objFso As ObjectSet objFso = CreateObject("Scripting.FileSystemObject")Dim strPath As String'ドキュイメントのパスstrPath = ThisDocument.Path'画像ファイル数を見つけるn = 0Dim obj As ObjectFor Each obj In objFso.getfolder(strPath & "\" & imageFolder).Files If InStr(obj.Name, ".png") <> 0 Then n = n + 1Next objSet objFso = Nothingspeak ("画像が" & n & "個見つかりました。挿入します")'挿入For k = 1 To n cname = strPath & "\" & imageFolder & "\" & Trim(k) & ".png" Selection.InlineShapes.AddPicture FileName:=cname, LinkToFile:=False, SaveWithDocument:=TrueNextEnd Sub'参照設定:Microsoft Excel 16.0 Object LibrarySub 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 IfEnd SubFunction 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 = NothingEnd FunctionSub 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 WithEnd SubSub 図に枠線をつける() 'このマクロは「行内」画像にしか作用しません。 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.CollapseEnd Sub