インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBA 文字を装飾するマクロ

普段,私がパワーポイントで手動でやっていることの第二弾です。

文字を目立たせるために,私は二重縁取りを基本的にします。

文字自身と一度コントラストを確保して,その後もう一度コントラストを確保する。そうすることで,背景に負けずに目立たさせることができると考えています。

やることは単純で, 基本的に私はプレゼンで写真とかに載せる字は黄色を使うんですが,一度黒の6ptで縁取って,さらに12ptの白で縁取る。

普通にはそういうことはできませんので,3つの図形を重ねる感じです。最後に上下左右に中央ぞろえする。ずれないようにグループ化までします。

あえて少しずらすとかも気分でやります。

これってけっこう面倒なので,マクロのネタにしよう!と思いやってみました。

Shapeindexを取る関数に頼りっきりになるので,今日は頼らずにインデックスを取ってみています。。

さて,コードは次のようになりました。

標準モジュール

Option Explicit
Sub 薄い色とか()
    Call DecoText
End Sub
Sub 濃い色とか()
    Call DecoText(, , vbWhite, vbBlack)
End Sub
Sub カスタム()
    Dim args(0 To 3) As Long
    Dim ret As String
    ret = InputBox(",区切りで引数を入力してください。 太さ1,太さ2,色1,色2", , "6,12,vbblack,vbwhite")
    args(0) = CLng(Split(ret, ",")(0))
    args(1) = CLng(Split(ret, ",")(1))
    Dim tmp As Long, i As Long
    For i = 2 To 3
        tmp = 0
        Select Case Split(ret, ",")(i)
            Case "vbBlack", "vbblack"
                tmp = vbBlack
            Case "vbRed", "vbred"
                tmp = vbRed
            Case "vbGreen", "vbgreen"
                tmp = vbGreen
            Case "vbYellow", "vbyellow"
                tmp = vbYellow
            Case "vbBlue", "vbblue"
                tmp = vbBlue
            Case "vbMagenta", "vbmagenta"
                tmp = vbMagenta
            Case "vbCyan", "vbcyan"
                tmp = vbCyan
            Case "vbWhite", "vbwhite"
                tmp = vbWhite
        End Select
        args(i) = tmp
    Next
    
    Call DecoText(args(0), args(1), args(2), args(3))
End Sub

Sub DecoText(Optional 太さ1 As Long = 6, Optional 太さ2 As Long = 12, _
    Optional1 As Long = vbBlack, Optional2 As Long = vbWhite)
Dim TargetShape(1 To 3) As Shape
Set TargetShape(1) = ActiveWindow.Selection.ShapeRange(1)
Dim TargetSlide As Slide
Set TargetSlide = ActivePresentation.Slides(TargetShape(1).Parent.SlideIndex)
TargetShape(1).Duplicate
Set TargetShape(2) = TargetSlide.Shapes(TargetSlide.Shapes.Count)
With TargetShape(2)
    .TextFrame2.TextRange.Font.Line.Weight = 太さ1
    .TextFrame2.TextRange.Font.Line.ForeColor.RGB =1
End With
TargetShape(1).Duplicate

Set TargetShape(3) = TargetSlide.Shapes(TargetSlide.Shapes.Count)
With TargetShape(3)
    .TextFrame2.TextRange.Font.Line.Weight = 太さ2
    .TextFrame2.TextRange.Font.Line.ForeColor.RGB =2
    TargetShape(2).ZOrder msoBringToFront
    TargetShape(1).ZOrder msoBringToFront
End With
Dim s As Shape
Dim i As Long, j As Long, Indexes As Variant
ReDim Indexes(1 To 3) As Long
For j = 1 To 3
    i = 1
    For Each s In TargetSlide.Shapes
        If s Is TargetShape(j) Then
            Indexes(j) = i
            Exit For
        End If
        i = i + 1
    Next
Next

With TargetSlide.Shapes.Range(Indexes)
    .Align msoAlignCenters, msoFalse
    .Align msoAlignMiddles, msoFalse
    .Group
End With

End Sub

使い方は,テキストボックスに太めのフォントで字を書きます。
そのテキストボックスを選んでマクロを実行する。
基本は薄い色,濃い色のどちらかを動かすんですが,好みのパターンがあるならカスタムで,という感じ。エラー処理とかはしてませんから,カスタムは察して引数を与えてください・・。

動作はこんな感じ。
f:id:chemiphys:20170227212950p:plain
f:id:chemiphys:20170227212550g:plain

個人的にはいくつかパターンを準備すれば普通に使えるなーという感じです。いつも手動でやってたので,これはタスカルカモシレナイ。