ExcelマクロでOffice製品を動かしてみた
目次
マクロとは、WordやExcelで行った一連の操作を記録し、任意のタイミングで自動で実行できる機能のことを指します。
Office製品全体と親和性が高いので、実際に簡単な処理を実装したことがある方もいらっしゃるかと思います。任意のタイミングで自動化した処理を実行できる点が強みです。
ただ、マクロといえばExcel!みたいなイメージがあるかと思いますが、Excelマクロは他のOffice製品と連携させることで、Excel以外のツールによる作業も自動化させることが可能です。今回は、一例としてOutlook、PowerPointとの連携について、実際に開発した画面も交えて紹介します!
ご存知の方も多いとは思いますが、マクロは設定しないと使えないので、まずはマクロを使えるように設定します。マクロを有効化するにはいくつか方法がありますが、中でも今回はリボンに開発タブを表示させる方法で設定します。
Excelのデフォルトの状態では開発タブは表示されません。なので、リボンに開発タブを表示させましょう。
クイックアクセスツールバー、リボンタブ、リボンのどこかでマウスの右ボタンをクリックすると、メニューが表示されます。「リボンのユーザー設定」をクリックし、右側のリストにある「開発」にチェックを入れて「OK」ボタンを押下します。
次は実際にマクロを実行するボタンを作成しましょう。
【ボタン作成方法】
①マクロが保存されている(もしくは作成しようとしている)Excelファイルを開き、リボンの「開発」タブから「挿入」をクリックします。するといくつかアイコンが表示されるので、その中から「フォームコントロール」内のボタンを選択します。
③左クリックで「マクロの登録」というダイアログが表示されます。作成したボタンをクリックしたときに実行したいプロシージャを選択できます。
ちなみにプロシージャとはマクロコード内の「Sub~End Sub」までの一連の命令のまとまりのことです。プロシージャは一つのマクロファイルにいくつも記載することができ、別のプロシージャから別のプロシージャを呼び出して使ったりすることもできます。
ちなみに「コントロールの書式設定」から文字色なども変えられます。
今回は以下のようにボタンを作成してみました。
参照設定
ExcelVBAでOffice製品を操作する前に、VBEでMicrosoft Office Object Libraryの参照設定をします。
VBEの画面のメニューから「ツール」→「参照設定」を選択します。
参照設定の画面が開いたら、「Microsoft Office XX.X Object Library」にチェックします。
そのまま「OK」ボタンを押下します。
この章では、マクロでOutlookを操作して、メールを作成・送信する方法を紹介します。
※事前にOutlookはインストールしておいてください。
Sub Outlookでメールを送信()
'変数宣言
Dim FilePath As String
Dim Paramsheet As Worksheet
Dim OutlookApp As Object
Dim OutlookMail As Object
Dim MailTo As String
Dim MailCC As String
Dim MailSubject As String
Dim MailBody As String
Dim MailToValue As String
Dim MailbodyValue As String
'パラメータファイルを開く
Set Paramsheet = ThisWorkbook.Sheets("Parameter")
'パラメータファイルから以下の値を取得
'ここに値を直接貼ってもOKですが、メンテナンスを考えるとパラメータファイル等で管理するのが良いです。
MailTo = Paramsheet.Range("B2") '宛先
MailCC = Paramsheet.Range("B3") '㏄
MailSubject = Paramsheet.Range("B4") '件名
MailBody = Paramsheet.Range("B5") '本文
' Outlookアプリケーションのインスタンスを作成
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
' メールのプロパティを設定
With OutlookMail
.To = MailTo ' 受信者のメールアドレス
'.CC = MailCC ' CCに送信する場合はアドレスを追加
.Subject = MailSubject ' 件名
.Body = MailBody ' 本文
'.Attachments.Add "C:\path\to\file" ' 添付ファイルを追加する場合
' メールを送信
.Send
End With
' オブジェクトの解放
Set OutlookMail = Nothing
Set OutlookApp = Nothing
MsgBox "メール送信完了"
End Sub
使用したパラメータファイルは以下です。
VBAにはWorkbook型の変数やWorkSheet型の変数が存在するのでこのシートごと変数に代入することができます。
下記のようにMailToという変数に、ParamSheetというWorkSheet型変数のRange(範囲)に”B2”を指定することでB2セルの値を代入しています。これにより、もしMailToの値が変わったというようなことがあっても、コードの中身を書き換える必要はなく、このシートを書き換えるだけで済むという仕組みです。
MailTo = Paramsheet.Range("B2")
また、メソッドは以下を利用します。
Sub PowerPointでスライドを作成する()
'変数宣言
Dim Paramsheet As Worksheet
Dim PowerPointApp As Object
Dim PowerPointPres As Object
Dim slide As Object
Dim SaveFileName As String
Dim SaveFilePath As String
Dim SaveFullPath As String
'パラメータファイルを利用する準備
Set Paramsheet = ThisWorkbook.Sheets("Parameter")
SaveFileName = Paramsheet.Range("B10")
SaveFilePath = Paramsheet.Range("B11")
SaveFullPath = SaveFilePath & SaveFileName
'PowerPointのオブジェクトを生成
Set PowerPointApp = CreateObject("PowerPoint.Application")
Set PowerPointPres = PowerPointApp.Presentations.Add
PowerPointApp.Visible = True
Set slide = PowerPointPres.Slides.Add(1, 1) ' タイトルスライド
'(1, 1)の箇所については、
'1つ目の引数・・・スライドの挿入位置を指定(上記であれば1枚目に挿入)
'2つ目の引数・・・スライドのレイアウトを指定
slide.Shapes(1).TextFrame.TextRange.Text = "Excelからパワポ作成"
slide.Shapes(2).TextFrame.TextRange.Text = "このスライドはマクロで作成されました"
'PowerPointファイルの保存
'ファイル名とフルパスを指定して保存
PowerPointPres.SaveAs SaveFullPath, 1 ' 1はpptx形式を指定している
'PowerPointの終了、オブジェクトの開放
PowerPointPres.Close
PowerPointApp.Quit
Set PowerPointApp = Nothing
Set PowerPointPres = Nothing
MsgBox "正常終了"
End Sub
FullPathというString型の変数に、ファイルパスとファイル名を代入しています。
Set PowerPointPres = PowerPointApp.Presentations.Open(FullPath)
Sub PowerPointのスライドを複製する()
Dim Paramsheet As Worksheet
Dim JapanParam As Worksheet
Dim PowerPointApp As Object
Dim PowerPointPres As Object
Dim countSld As Long
Dim SlideName As String
Dim SlidePath As String
Dim FullPath As String
' パラメータファイルを利用する準備
Set Paramsheet = ThisWorkbook.Sheets("Parameter")
Set JapanParam = ThisWorkbook.Sheets("都道府県名")
SlideName = Paramsheet.Range("B14").Value ' ファイル名
SlidePath = Paramsheet.Range("B15").Value ' フォルダパス
FullPath = SlidePath & SlideName
Set PowerPointApp = CreateObject("PowerPoint.Application")
' PowerPointプレゼンテーションを開く
Set PowerPointPres = PowerPointApp.Presentations.Open(FullPath)
' PowerPointウィンドウを可視化
PowerPointApp.Visible = True
'A列の2行目からのデータを参照
'行ごとにループ処理
Dim i As Long
i = 2
'A列にデータがあるまで繰り返し
Do While JapanParam.Cells(i, 1).Value <> ""
countSld = PowerPointPres.Slides.Count '現在のスライド数をカウント
PowerPointPres.Slides(countSld).Duplicate '最終ページを複製
'以下の"Shape(8)"の部分ではパワポ内部にあるシェイプ(要素)の番号を取得する必要があるので別途コードを記載して実行して取得しています。
PowerPointPres.Slides(countSld + 1).Shapes(8).TextFrame.TextRange.Text = JapanParam.Cells(i, 2).Value '最終ページのスライドタイトルに都道府県名
i = i + 1
Loop
' 上書き保存
PowerPointPres.Save
' PowerPointの終了、オブジェクトの開放
PowerPointPres.Close
PowerPointApp.Quit
Set PowerPointApp = Nothing
Set PowerPointPres = Nothing
MsgBox "正常終了"
End Sub
VBEはもちろんPowerPoint内にも実装されています。
Sub ListShapesWithText()
Dim slide As PowerPoint.slide
Dim shape As PowerPoint.shape
Dim i As Long
' 通常の編集モードでアクティブなスライドを取得
Set slide = ActiveWindow.View.slide
' シェイプの数を取得
Dim shapeCount As Long
shapeCount = slide.Shapes.Count
' シェイプが存在する場合のみループを実行
If shapeCount > 0 Then
' シェイプをループして、番号、名前、テキストを表示
For i = 1 To shapeCount
Set shape = slide.Shapes(i)
' シェイプにテキストが含まれているか確認
If shape.HasTextFrame Then
Debug.Print "Shape " & i & ": " & shape.Name & " - Text: " & shape.TextFrame.TextRange.Text
Else
Debug.Print "Shape " & i & ": " & shape.Name & " - No text"
End If
Next i
Else
Debug.Print "No shapes found on the active slide."
End If
End Sub
終わりに
今回は、Excelマクロを使って、Office製品を動かすための様々な処理を書いてみました。今回紹介したもの以外にも、WordやTeamsといったツールとも連携でき、処理を自動化することができます。
特に単調な作業を繰り返し行うような作業が毎日のタスクに入っている方にはおすすめです!マクロ初心者だよ、という方もここ最近はAIに聞けばすぐにコードを教えてくれますので、是非試してみてくださいね。
Office製品を用いた定型的な作業を自動化してみたい方は、ぜひこの記事を参考にしてみてください。
最新情報をお届けします!
RPAに関する最新コラムやイベント情報をメールで配信中です。
RPA領域でお仕事されている方に役立つナレッジになりますので、ぜび登録してください!
- November 2024 (2)
- October 2024 (3)
- September 2024 (2)
- August 2024 (4)
- July 2024 (1)
- June 2024 (2)
- May 2024 (3)
- April 2024 (1)
- March 2024 (1)
- February 2024 (1)
- January 2024 (1)
- December 2023 (1)