もめんの格闘日記

主にPowerPointを中心としたPCのTips的なものを書いていく予定です。

【PowerPointマクロ】プレゼンテーションから開いたExcelファイルでExcel VBAの関数を使う方法

今回は参照設定についてです。

参照設定すればExcelだけじゃなく色々な関数が使えます。Excel以外はよくわかりませんが。。。

PowerPointマクロから開いたExcelでどうしても検索をかけたかったのですが、中々この参照設定に辿り着かなくて苦労しました。

それでは以下手順になります。

 

PowerPointマクロから開いたExcelファイル上でExcelマクロの関数を使う方法

・プレゼンテーションファイルからVisual Basicウィンドウを開く

・画面上のツールタブから参照設定をクリック

f:id:momen40:20170601204312j:plain

・参照設定ウィンドウが開くので、参照可能なライブラリの中からMicrosoft Excel~ を探してチェックを入れる

 

これでPowerPointマクロ上でExcelマクロの関数が使えるようになります。簡単!

参照設定ウィンドウを開くとけっこうな数のライブラリが表示されます。アルファベット順に並んでいるので頑張ってMicrosoft Excel~ を探して下さい。

次にPowerPointマクロで開いたExcelで検索(vlookup)する方法を記します。

 

PowerPointマクロから開いたExcelで検索するマクロ

Sub sample()

Dim ExcelApp As Excel.Application
Dim ExcelBook As Workbook
Dim ExcelSheet As Worksheet

Dim BookName As String
Dim day As String

Set ExcelApp = New Excel.Application
BookName = "C:\Users\(ユーザー名)\Documents\ブログ用\ワークシート1.xlsx"

Set ExcelBook = ExcelApp.Workbooks.Open(FileName:=BookName, ReadOnly:=msoTrue)
Set ExcelSheet = ExcelBook.Worksheets("Sheet1")

'ExcelApp.Visible = True

day = WorksheetFunction.VLookup(2, ExcelSheet.Range("A:B"), 2, False)

MsgBox day

ExcelApp.DisplayAlerts = False
ExcelBook.Close
ExcelApp.DisplayAlerts = True

Set ExcelApp = Nothing
Set ExcelBook = Nothing
Set ExcelSheet = Nothing
End Sub

 

青色がExcelを開く部分、赤がExcel内で検索をかける箇所です。

開くExcelの"ワークシート1.xlsx"には下の様な表が入っています。マクロを動かすとvlookupで"2"を検索したので、2列目の"火"がメッセージボックスに表示されます。

1
2
3
4
5
6
7

 

 'ExcelApp.Visible = True←この行は上のコード内でコメントアウトしていますが、追加すると開いたExcelが表示され、一旦マクロの動作が止まります。閉じるとマクロが再び動きます。

 

Dim ExcelApp As Excel.Application
Dim ExcelBook As Workbook
Dim ExcelSheet As Worksheet

↑この箇所は開くExcel用のオブジェクトを宣言しています。青色の部分で各オブジェクトにワークシートやシートをSetしています。

PowerPointマクロに含まれていないオブジェクトを使用する場合は、こういうのが必要になるようです。

 

ExcelApp.DisplayAlerts = False
ExcelBook.Close
ExcelApp.DisplayAlerts = True

↑この箇所で開いたExcelを閉じているのですが、保存しますか?的なメッセージが出ないように設定してから閉じて、メッセージをONに戻しています。

 

今回は以上です。

これが必要な人がどんなワードで検索するのかわからないでの、タイトルや文章が長くなってしまいました。

この方法を知ってPowerPointマクロの可能性がかなり広がったような気がします。

【PowerPointマクロ】保存されているフォルダのパスを取得する方法

今回はアクティブなプレゼンテーションの保存フォルダ(パス)を調べる方法を紹介します。

PowerPointからファイルを開くとき等は、フルパスを指定する必要があるのでマイドキュメントといえど下記のようになり面倒です。

C:\Users\ユーザー名\Documents\ブログ用

 

また、保存フォルダの上の階層に開きたいファイルがあるときも便利です。

では、早速どうぞ。

 

アクティブなプレゼンテーションのパスを取得する

Dim FilePath As String
FilePath = ActivePresentation.Path

 

たったこれだけです、はい。

でも、保存されていない場合は、FliePath="" になってしまします。

 

アクティブなプレゼンテーションの保存フォルダの上の階層のパスを取得する

Dim FilePath As String
Dim a As Long

FilePath = ActivePresentation.Path
a = InStrRev(FilePath, "\") - 1
FilePath = Left(FilePath, a)

上の階層を得るには文字列をちょっと操作する必要があります。

最初のFilePathが下記だとします。

C:\Users\ユーザー名\Documents\ブログ用

 

\ブログ用←これがいらいないので、\ を探してその後ろを消す。という操作をしています。

 

 a = InStrRev(FilePath, "\") - 1

上の式で \ を探します。

式としては後ろから探して一番最初にあった \ の位置(何文字目か)を返します。

この場合の位置は頭から数えた値になります。

-1しているのは、そのままだと次の式で \ が残ってしまうからです。

 

FilePath = Left(FilePath, a)

で文字列を頭からa番目まで取る(aより後ろを消す)ことができます。

LeftはExcelの関数にもあるので分かり易いかと思います。

 

アクティブなプレゼンテーションの保存フォルダ名を取得する

Dim FilePath As String
Dim a As Long

FilePath = ActivePresentation.Path
a = InStrRev(FilePath, "\") + 1

FilePath = Mid(FilePath, a)

 

今回も最初のFilePathが下記だとします。

C:\Users\ユーザー名\Documents\ブログ用

 

ブログ用←これを取り出したいので、\ を探してその後ろを取得する。という操作をしています。

 

a = InStrRev(FilePath, "\") + 1

先ほどと同様、上の式で \ の位置を探し、今度は+1します。

FilePath = Mid(FilePath, a)

Midでa番目から後ろを取ります。Midの引数は3つですが、3つ目がない場合はa番目から最後まで勝手に取得してくれます。

 

 

今回はこんな感じです。

文字列の操作が主でした。

【PowerPointマクロ】スライド上の画像をJPEG画像に変えるマクロ

今回はスライド上の画像をJPEG画像に変えるマクロを紹介します。

プレゼンテーションファイルの中に重い画像が含まれているとファイルの容量が重くなってしまいますので、そんなときに使ってみて下さい。

プレゼンテーションファイル中の画像の容量を調べる方法は、過去記事をご覧ください。

【PowerPoint】プレゼンテーションファイル中の重い画像を探す方法

では以下コードです(PowerPoint2010で動作確認しています)

 

選択画像をJPEGファイル画像に変えるマクロ

Sub sample()

Dim T As Single, L As Single, H As Single, W As Single

With ActiveWindow.Selection.ShapeRange
  T = .Top
  L = .Left
  H = .Height
  W = .Width
  .Cut
End With

With ActiveWindow.Selection.SlideRange.Shapes.PasteSpecial(ppPasteJPG)
  .Top = T
  .Left = L
  .Height = H
  .Width = W
End With

End Sub

動作としては、"選択した画像を切り取り→JPEGファイルとして貼り付け→元画像があった位置に移動"です。

他の画像やオートシェイプとの重なりは考慮していないので、ご注意下さい。

 

次のコードはプレゼンテーションファイル中の全画像をJPEG画像に変えるマクロになります。

1つ1つ変えるのが面倒な場合に一括で変えることができます。

 

全スライドの全画像をJPEG画像に変えるマクロ

Sub sample2()

Dim T As Single, L As Single, H As Single, W As Single
Dim i As Long
Dim sld As Slide
Dim shp As Shape

For Each sld In ActivePresentation.Slides
  For i = sld.Shapes.Count To 1 Step -1
    If sld.Shapes(i).Type = msoPicture Then
      T = sld.Shapes(i).Top
      L = sld.Shapes(i).Left
      H = sld.Shapes(i).Height
      W = sld.Shapes(i).Width
      sld.Shapes(i).Cut
      
      With sld.Shapes.PasteSpecial(ppPastePNG)
        .Top = T
        .Left = L
        .Height = H
        .Width = W
      End With
    End If
  Next i
 
  For i = 1 To sld.Shapes.Count Step 1
    If sld.Shapes(i).Type = msoPicture Then
      sld.Shapes(i).ZOrder msoSendToBack
    End If
  Next i
Next sld

End Sub

 

1目のマクロと同様、画像を切り取り、JPEG画像として貼り付けています。

また、画像同士の重なりは再現されますが、オートシェイプ等との重なりは再現できません。

ファイルが重いなと思ったらやっみて下さい。

 

今回はこれで終わりです。ありがとうございました。

【PowerPoint】プレゼンテーションファイル中の画像のサイズ、ファイル形式を調べる方法

今回は、プレゼンテーションファイル中の重い(容量の大きい)画像を探す方法を紹介します。PowerPoint2007以降ならできると思います。

 

画像を貼る機会が多いプレゼンテーションファイルでは、メールで送る際にファイルの容量が大きいと送れなかったり、共有フォルダを圧迫したりと、いろいろ不都合が起こります。

容量が大きいときは、やたらと重い画像がファイルの中に貼られていたりするのですが、画像のサイズやファイル形式がかわからない。ってことも多々あると思います。

そんな時に使えるであろう方法を紹介します。

(PowerPoint2010、Windows10、Lhaplus入りPC で動作確認しています)

 

プレゼンテーションファイル中の画像のサイズ、ファイル形式を調べる方法

  • プレゼンテーションファイルを右クリックし、解凍する(解凍する場所はどこでもいい)

    f:id:momen40:20170125000415j:plain

  • 開かれたフォルダ内のppt→mediaフォルダを開く
  • プレゼンテーションファイル中に含まれる画像の一覧が表示される
  • 画面上の方の表示タブを開き、"詳細"表示する
  • サイズの項目に各画像の容量が表示されるf:id:momen40:20170125000906j:plain
  • プレビューウィンドウをONにして、画像を選択すると画像の中身も見れるので、見やすいです

    f:id:momen40:20170125001529j:plain

  • サイズの項目を参考に大きい画像を探す
  • 種類の項目でファイル形式も確認できる
  • プレゼンテーションファイルを開きサイズの大きい画像を探して、元画像をいじるなり、JPEGとして貼り直す等、サイズを減らす

 

手順としては以上です。

プレビューウィンドウを開かないと、容量と画像が同時に見れないのがまどろっこしいですが、大量の画像が貼られているプレゼンテーションファイルでは、この方法は有効だと思います。

 

画像サイズを落とす方法としては、上記にも書きましたが、元画像の解像度やサイズを落とす、画像をプレゼンテーションファイル中でコピー→形式を選択して貼り付け→JPEG、図の圧縮等が挙げられます。

画像をコピー→JPEGとして貼り付け、だけでもけっこう効果があると思います。

図の圧縮は画像を選択したときに出てくる"図ツール 書式"タブの中にあります。解像度によっては、逆に重くなってしまうこともあるのでそこは注意です。

ちなみに、プレゼンテーションファイルの容量は、上書き保存したときに更新されるので、保存してからフォルダ上で確認して下さい。

 

今回は以上です。

ありがとうございました。

(2017.2.5更新)

【PowerPointマクロ】選択した図の下にタイトル(テキストボックス)を追加するマクロ

f:id:momen40:20170115212421j:plain

今回は選択した図の下にテキストボックスを追加するマクロを紹介します。

動作としては、リボン上にあるEditBox内に入力したテキストが選択した図や表の下真ん中に、テキストボックスとして追加されます。

リボン上のEditBoxの作り方については、下記のサイトさんを参考にされて頂いています。

SuyamaSoft

では、以下コードになります。(PowerPoint2010で動作を確認しています)

 

リボンのcustom.xml

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="onLoad">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="Tab1" label="マクロタブ">
        <group id="Group1" label="タイトル追加" >
          <editBox id="EditBox1" label="テキスト:" supertip="図の下に追加するテキストを入力してください。" sizeString="MMMMMMMMMM" getText="EditBox_getText" onChange="EditBox_OnChange" />
          <button id="Button1" label=" テキスト追加 " imageMso="MacroPlay" size="normal" supertip="入力したテキストを図の下に追加します。"  onAction="Button_OnClick" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

 

onLoadについて

  • 定義したVBA上の関数でリボン上での初期処理が決まります
  • 定義した関数と同じVBA上での関数を同じ名前にして下さい

editBoxについて

  • labelでリボン上に表示されるボタン名が決まります
  • sizeStringでEditBoxの大きさを決めます
  • getTextで定義したVBA上での関数で初期値が決まります
  • onChangeで定義したVBA上での関数でEditBox内の値を取得します
  • supertipでマウスオンしたときに表示される説明が決まります

buttonについて

  • imageMsoでボタンのアイコンが決まります
  • onActionで定義したVBA上での関数でボタンを押したときの動作が決まります

 

VBAのコード

Option Explicit

Private myRibbon As IRibbonUI
Private Text As String

Sub onLoad(ribbon As IRibbonUI) ' リボンの初期処理
  Text = "図1-1"
  Set myRibbon = ribbon ' リボンの表示を更新できるようにするためにリボンをセットする
  myRibbon.Invalidate ' リボンの表示を更新します。
End Sub

Sub EditBox_getText(control As IRibbonControl, ByRef returnedVal) ' editBoxに代入する
  returnedVal = Text
End Sub

Sub EditBox_OnChange(control As IRibbonControl, EditText As String) ' editBoxから取得する
  Text = EditText
End Sub

Sub Button_OnClick(control As IRibbonControl) ' テキストの追加
  Dim T As Single, L As Single, H As Single, W As Single
 
  With ActiveWindow.Selection
    If .Type = ppSelectionNone Or .Type = ppSelectionSlides Then '何も選択されていない、スライドが選択されている場合
      MsgBox "図または表を選択して下さい。"
    ElseIf .ShapeRange.Type = msoPicture Or .ShapeRange.Type = msoLinkedPicture _
      Or .ShapeRange.Type = msoAutoShape Or .ShapeRange.Type = msoTable Then
      T = .ShapeRange.Top
      L = .ShapeRange.Left
      H = .ShapeRange.Height
      W = .ShapeRange.Width
      
      If Len(Text) > 0 Then
        With .SlideRange.Shapes.AddTextbox(msoTextOrientationHorizontal, 10, T + H, 10, 10)  'ここでのLeftとHeightとWidthは仮の値
          .TextEffect.Text = Text
          .TextEffect.Alignment = msoTextEffectAlignmentCentered 'テキストの中央揃え
          .TextEffect.FontSize = 14
          .TextFrame.TextRange.Font.Name = "Arial"
          .TextFrame.TextRange.Font.NameFarEast = "MS Pゴシック"

          .TextFrame.WordWrap = msoFalse 'テキストボックスの大きさを調整
          .Left = L + (W - .Width) / 2  'テキストボックスの位置を図、表の真ん中に移動
        End With
      End If
    Else
      MsgBox "図または表を選択して下さい。"
    End If
  End With
End Sub

コード長いです。以下補足説明です。

  • このコードでは図、オートシェイプ、表を選択した時にテキストを追加します
  • 選択した図などの位置、大きさを取得し、追加するテキストボックスの位置を調整しています
  • テキストボックスのLeftとHeightとWidthは、一旦仮の値を入れ、後から位置と大きさを決めています

 

リボンのカスタマイズ、custom.xmlの編集については過去記事を参考にして下さい。

マクロを実行するボタンを追加する方法(その1)

VBAのコードはPowerPointを開いてAlt+F11でVBA画面を出し、"挿入→標準モジュール"で標準モジュールを追加し、貼りつけて下さい。

 

今回の記事は図の下に説明や図1とか入れる機会があったので、こんなのがあると便利かなーと思い作りました。

EditBoxの初期テキストや追加されるテキストのフォント等をいじれば、使い勝手がよくると思います。

 

終わりです。ありがとうございました。

 

こんな記事も書いてます。

 

momen40.hatenablog.com

 

 

momen40.hatenablog.com

 

【PowerPointマクロ】プレゼンテーションファイルの操作(開く、閉じる、保存等)

今回はファイル操作について書きたいと思います。

関数の使い方を列挙していますが、引数はよく使うであろうものだけを記載しているので、詳しく知りたい方はMSDNとかで調べて下さい。

今回はシンプルなものばかり載せているので、"ファイル選択ダイアログ"や"名前を付けて保存ダイアログ"を使用するFileDialogについては載せていません。

FileDialogについての過去記事もちょっとありますので、この記事の最後の方にあるリンクを参考にして下さい。

では、どうぞ。

(PowerPoint2010で動作確認しています)

 

プレゼンテーションファイルを開く

 Presentations.Open "ファイル名", msoFalse

ファイル名はC:\~のように全パスが必要になります。

2つ目の引数は読み取り専用かを設定できます。msoTrueで読み取り専用になります。省略可。

 

プレゼンテーションを新規作成

 Presentations.Add

白紙のプレゼンテーションが新規作成されます。

 

プレゼンテーションファイルを保存

 ActivePresentation.Save

選択させているプレゼンテーションを保存します。

既に保存されているファイルは上書き保存。

保存されていないプレゼンテーションは"プレゼンテーション1"等の仮で付けられている名前で保存される。保存場所はマイドキュメントか操作しているファイルの場所辺りになると思います。

 

プレゼンテーションファイルを名前を付けて保存

 ActivePresentation.SaveAs "ファイル名", ppSaveAsDefault

ファイル名とファイル形式を指定して保存できます。

ファイル名はC:\~等のフルパスが必要です。ファイル名のみの場合はマイドキュメント等に保存されます。

2つ目の引数はファイル形式で、省略可。ppSaveAsDefaultまたは省略で実行するとpptx形式で保存されます。

ファイル形式については、また別の機会に詳しく書きたいと思います。

 

プレゼンテーションファイルを閉じる

 ActivePresentation.Close

選択されているプレゼンテーションを保存せずに閉じます。

変更されていても何も聞かずに閉じます。

 

プレゼンテーションファイルの保存場所を取得する

 ActivePresentation.Path

選択されているプレゼンテーションの保存場所(String)を返します。

以下のように使うと変数に保存場所を入れることができます。

 Dim a As String

 a = ActivePresentation.Path

取得した保存場所に"\ファイル名"を足せば同じフォルダ内にファイルを保存できます。

 ActivePresentation.SaveAs  a & "\ファイル名"

 

プレゼンテーションが変更されているかを確認する

 ActivePresentation.Saved

選択されているプレゼンテーションが最後に保存されてから変更されていればmsoTrueを返します。

以下の様にIf文の中で使うといいと思います。

 If ActivePresentation.Saved = msoFalse  Then  ActivePresentation.Save

 

 

紹介するメソッド、プロパティは以上です。

ファイルの保存や開く際のファイル名は、C:\~の様に長いパスを入れる必要になりますので、PathやFileDialogを使ってパスを取得すると楽だと思います。

FileDialogに関する記事もありますので、よかったら参考にして下さい。

【PowerPointマクロ】選択したJPEGファイルをスライドの中心に貼るマクロ

【PowerPointマクロ】名前を付けて保存するダイアログを開く

 

保存する際にマイドキュメントやデスクトップを選択したい場合は下記サイトさんを参照して下さい。

Office TANAKA - Excel VBA Tips[特殊フォルダを取得する]

 

今回はこれで終わりです。

ありがとうございました。

【PowerPointマクロ】選択したJPEGファイルをスライドの中心に貼るマクロ

今回はFileDialogを使って選択したJPEGファイルを貼るマクロについて書きます。

マクロの動作としてはスライドを追加して、そこに画像を張り付けます。複数の画像を選択した場合は、1スライドに付き1枚画像を貼ります。

PowerPointに元々ある機能の"挿入"タブ→"図"と似てますが、図形のサイズ指定ができるので、同じような画像を連続して貼る場合は便利かも。

初期フォルダにマイドキュメントを表示されているのですが、下記サイトさんを参考にさせて頂きました。

Office TANAKA - Excel VBA Tips[特殊フォルダを取得する]

では、コードです(PowerPoint2010で動作確認してます)。

 

VBAコード

Sub sample()

    Dim i As Long, SldIndex As Long
    Dim MasterH As Single, MasterW As Single
    Dim Path As String, WSH As Variant
    
    '表示される初期フォルダをマイドキュメントにする準備
    Set WSH = CreateObject("WScript.Shell")
    Path = WSH.SpecialFolders("MyDocuments") & "\"
    
    'スライドの幅、高さを取得
    With ActivePresentation.SlideMaster
      MasterH = .Height
      MasterW = .Width
    End With
    
    '選択されているスライドのインデックスを取得
    SldIndex = ActiveWindow.Selection.SlideRange.SlideIndex
    
    With Application.FileDialog(msoFileDialogFilePicker)
      .InitialFileName = Path  '初期表示フォルダの設定
      .Filters.Add "JPEG Image", "*.jpg; *.jpeg"  '表示されるファイル形式を指定
      
      If (.Show = True) Then  '開くボタンが押されたら以下を実行
        For i = 1 To .SelectedItems.Count
          'スライドを追加
          With ActivePresentation.Slides.Add(SldIndex + i, ppLayoutBlank)
            .Select
          End With
          
          '選択したファイルを張り付ける
          With ActiveWindow.Selection.SlideRange.Shapes.AddPicture(.SelectedItems(i), msoFalse, msoTrue, 10, 10)
            '.Width =
            '.Height =
            .Left = (MasterW - .Width) / 2  '横位置の中心に設定
            .Top = (MasterH - .Height) / 2  '縦位置の中心に設定
          End With
        Next i
      End If
      .Filters.Clear
    End With
    
    Set WSH = Nothing
End Sub

 

コードの説明

FileDialogを使ってファイル選択ダイアログを表示させて、選択した画像を追加したスライドに貼ります。

複数画像の場合は、スライドの追加→貼り付けを繰り返します。

Pathにマイドキュメントのパスを入れ、.InitialFileNameに設定することで、初期表示フォルダをマイドキュメントにしています。

 

最初の方にスライドの幅と高さを取得し、張り付けた画像の大きさから真ん中の位置を算出します。

一見回りくどいように見えますが、画像を選択せずに中心位置に持ってこれるので、慣れれば便利だと思います。

 

.Filters.Add "JPEG Image", "*.jpg; *.jpeg" はダイアログの中で表示させるファイル形式を設定しており、*.tif;みたいに足すことができます。

 

複数の画像を張り付けれるようにFor文を作り、その中でスライド追加→画像貼り付け

を繰り返します。

 

上記コードではコメントアウトしていますが、.Width =や.Height =で貼り付けた画像の大きさを設定することもできます。

 

 

今回はこんな感じです。

まじめに作ってみたのですが、標準の機能に毛が生えた程度のものになってしまいました。

このままでは使いにくいので、目的に応じてカスタマイズを。。。

 

FileDialogは名前を付けて保存ダイアログからファイルの保存もできるので、興味があればこちらも覗いてみて下さい。

【PowerPointマクロ】名前を付けて保存するダイアログを開く