ExcelマクロでOffice製品を動かしてみた

はじめに:マクロとは

マクロとは、WordやExcelで行った一連の操作を記録し、任意のタイミングで自動で実行できる機能のことを指します。

Office製品全体と親和性が高いので、実際に簡単な処理を実装したことがある方もいらっしゃるかと思います。任意のタイミングで自動化した処理を実行できる点が強みです。

ただ、マクロといえばExcel!みたいなイメージがあるかと思いますが、Excelマクロは他のOffice製品と連携させることで、Excel以外のツールによる作業も自動化させることが可能です。今回は、一例としてOutlook、PowerPointとの連携について、実際に開発した画面も交えて紹介します!

準備

1.マクロを設定する

ご存知の方も多いとは思いますが、マクロは設定しないと使えないので、まずはマクロを使えるように設定します。マクロを有効化するにはいくつか方法がありますが、中でも今回はリボンに開発タブを表示させる方法で設定します。

【リボンに開発タブを表示させる方法】

Excelのデフォルトの状態では開発タブは表示されません。なので、リボンに開発タブを表示させましょう。
クイックアクセスツールバー、リボンタブ、リボンのどこかでマウスの右ボタンをクリックすると、メニューが表示されます。「リボンのユーザー設定」をクリックし、右側のリストにある「開発」にチェックを入れて「OK」ボタンを押下します。

2.マクロを実行するボタンを作る

次は実際にマクロを実行するボタンを作成しましょう。

【ボタン作成方法】

①マクロが保存されている(もしくは作成しようとしている)Excelファイルを開き、リボンの「開発」タブから「挿入」をクリックします。するといくつかアイコンが表示されるので、その中から「フォームコントロール」内のボタンを選択します。

②マウスのカーソルが十字(+)に変わったら、そのまま好きな場所にボタンを作ります。

③左クリックで「マクロの登録」というダイアログが表示されます。作成したボタンをクリックしたときに実行したいプロシージャを選択できます。
ちなみにプロシージャとはマクロコード内の「Sub~End Sub」までの一連の命令のまとまりのことです。プロシージャは一つのマクロファイルにいくつも記載することができ、別のプロシージャから別のプロシージャを呼び出して使ったりすることもできます。

ボタンに登録したいプロシージャ名を選択したら、OKボタンを押下します。

これでマクロ実行ボタンが作成できました!
ちなみに「コントロールの書式設定」から文字色なども変えられます。
ボタンごとに登録するマクロを変えられるので、マクロファイル一つで様々な操作ができるようになります。

今回は以下のようにボタンを作成してみました。

3.参照設定

ExcelVBAでOffice製品を操作する前に、VBEでMicrosoft Office Object Libraryの参照設定をします。
VBEの画面のメニューから「ツール」→「参照設定」を選択します。
参照設定の画面が開いたら、「Microsoft Office XX.X Object Library」にチェックします。
そのまま「OK」ボタンを押下します。

 

Outlookを操作して、メールを送信する

この章では、マクロでOutlookを操作して、メールを作成・送信する方法を紹介します。
※事前にOutlookはインストールしておいてください。

【作成手順】

Outlookアプリケーションオブジェクトの取得

まずは、ExcelVBAからOutlookを操作できるように、Outlookアプリケーションオブジェクトを取得します。
取得するためにはOutlookアプリケーションオブジェクト変数の宣言をします。

Dim オブジェクト名 As Outlook.Application

このように宣言した後で、

Set オブジェクト名B = New Outlook.Application

と記述し、Outlookアプリケーションオブジェクトを取得します。
これで、ExcelVBAでOutlookを操作することができるようになりました。

オブジェクト作成

①MailItemオブジェクトを作成する

Outlookはメールの送受信だけでなく、予定やタスク、連絡先を登録することができます。これらをアイテムと呼ぶのですが、VBAではそのようなアイテムをそれぞれのオブジェクトによって、作成したり、操作することができます。
例えば、MailItemオブジェクトであれば、Outlookのメールを操作できます。

 

↓Outlookオブジェクト一覧
Outlookのアイテム
オブジェクト名
メール
MailItem
予定
AppointmentItem
連絡先
ContactItem
タスク
TaskItem

 

さっそくMailItemオブジェクトを作成してみましょう。
はじめに、MailItemオブジェクト型変数の宣言をします。

Dim オブジェクト名 As Outlook.MailItem

次に、CreateItemメソッドを利用し、MailItemオブジェクトを作成します。

Outlookアプリケーションオブジェクト.CreateItem(作成するオブジェクト名)

②Mailアイテムオブジェクトのプロパティ

上記のCreateItemメソッドにはパラメータを指定する必要があります。パラメータとして指定できるのは、Outlookで作成する各アイテムタイプの種類名か、値になります。

作成するオブジェクト
指定するアイテムの種類名
オブジェクトの役割
MailItem
olMailItem
0
メールを操作するオブジェクト
AppointmentItem
olAppointmentItem
1
予定を操作するオブジェクト
ContactItem
olContactItem
2
連絡先を操作するオブジェクト
TaskItem
olTaskItem
3
タスクを操作するオブジェクト

 

MailItemオブジェクト作成のために指定するのはアイテムの種類名である「olMailItem」か、値である「0」を指定すれば期待通り動いてくれそうです。

 

オブジェクトを作成し、Outlookを操作する

メソッドに従って、それぞれ必要な値を引数として設定して書いてみました。(以下)

Dim OutlookApp As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set TaskItem = OutlookApp.CreateItem(0) ' 0がメールを操作するオブジェクトの値

 

④送信実行

上記が作成できれば、送信実行してみましょう。
Outlookのメールを送信するには、MailItemオブジェクトのSendメソッドを使います。

MailItemオブジェクト.Send

今回書いたコードの全体がこちら👇(メールの宛先・件名・本文は、Excelシートの特定セルに記入された内容をセットするようにしています。)

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")

実用場面

複数の宛先がある、かつ、毎日メールを送信しないといけない
…そんなときにはパラメータファイルに書いておけば、あとはボタンを押すだけで送信完了となります◎

実用場面

各組織(グループ)にそれぞれ違う内容のメールを送る必要がある!

パラメータファイルを複数設定、グループごとにボタンを変えれば手間が削減でき、ミスも減らすことができます◎


PowerPointを操作する

さて今度は趣向を変えてExcelVBAでPowerPointのスライドを作成してみたいと思います。

今回は以下の操作を紹介します。
A.PowerPointのスライドを作成する
B.スライドタイトルを指定しながら複数スライドを生成する

【A.PowerPointのスライドを作成する

まずは、ExcelVBAからPowerPointを操作できるように、PowerPointアプリケーションオブジェクトを取得します。

前述したOutlookのときと同様に、PowerPointアプリケーションオブジェクト変数の宣言をします。

Dim オブジェクト名 As PowerPoint.Application

また、メソッドは以下を利用します。

Set オブジェクト名B = PowerPointApp.Presentations.Add
具体的な処理内容はこちら。
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


これで普通のスライドが作成できました。

【B.スライドタイトルを指定しながら複数スライドを生成する

例えば以下のように都道府県名が記載されているファイルがあったとします。

この都道府県名が各スライドのタイトルになるように複製したいと思います。

PowerPointのスライド数を取得する場合はCountプロパティを使って取得することができます。

PowerPointPres.Count

スライドコレクションは

PowerPointPres.Slides

と指定できます。

 

【サンプルコードの説明】

サンプルコードでは、{countSld}と記述することで、最終ページのスライドを指しています。
さらに、36行目で最終ページのスライドに対して、Duplicateメソッドを使用しています。
ちなみにDuplicateメソッドでは、「複製されたスライドは元のスライドの次に追加される」という決まりがあります。
また、{countSld+1}ですが、これは新しく複製されたページになります。
Countプロパティを使うことで、プレゼンテーションの末尾にスライドを追加することができるだけでなく、生成したスライドに操作をすることができます。
Do WhileループでExcelシートのA列からデータが入力されている部分まで繰り返します。その中で、現在のスライド数を変数に格納しています。

 

最後に、【A.PowerPointのスライドを作成する】では無かった以下のコードですが、これは既存のプレゼンテーションを指定のファイルパスから開いているためです。
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

 

上記のプログラムを実行すると、スライドタイトルのテキストが、都道府県名に変更され、生成されました!◎

 

補足

上記のコードにShape(図形やテキストボックスなどの要素です)の番号を指定する箇所がありましたが、PowerPoint内で追加した要素の番号なんて分からないですよね。基本的には追加した順となるようですが、削除したり追加することで番号が変わっていきます。

なので今回はShape番号をイミディエイトウィンドウに表示するコードをPowerPoint内のVBEに記載してみました。

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
上記を実行するとイミディエイトウィンドウにこのように表示されました。

 

あらかじめタイトルとサブタイトルの箇所に「タイトル」、「サブタイトル」という文言を入れておいたので一目瞭然ですね。タイトルのShapeに操作をしたければ上記の「Shape8」を指定すればよいということになります。

PowerPoint内でもVBAを使えますが、ExcelからPowerPoint開いて、処理を書いて、上書き保存して、アプリを終了できるっておもしろいですよね。Excel VBAの達人となればPowerPointを自分で開く必要はなくなるかもしれません。

終わりに

今回は、Excelマクロを使って、Office製品を動かすための様々な処理を書いてみました。今回紹介したもの以外にも、WordやTeamsといったツールとも連携でき、処理を自動化することができます。

特に単調な作業を繰り返し行うような作業が毎日のタスクに入っている方にはおすすめです!マクロ初心者だよ、という方もここ最近はAIに聞けばすぐにコードを教えてくれますので、是非試してみてくださいね。

Office製品を用いた定型的な作業を自動化してみたい方は、ぜひこの記事を参考にしてみてください。

最新情報をお届けします!

RPAに関する最新コラムやイベント情報をメールで配信中です。
RPA領域でお仕事されている方に役立つナレッジになりますので、ぜび登録してください!

最新情報を受け取る方はこちら

もっと知りたい方はこちら


ページトップ