LoginSignup
2
0

約十年ぶりにVBAマクロの改修をやってみた

Last updated at Posted at 2023-12-20

 今年(2023/01-09)の間に携わっていた運用業務で、久々にExcel VBAマクロの改修を行いました。
 技術経歴書を見返したところ、仕事としてマクロをいじったのが社会人一年目の2014年以来でした(世代がばれる)。
 その運用業務は既に終息済でマクロをもう利用しなくなったかつ内部資料作成目的のマクロであり直接運用業務部分に関わらない内容の為、備忘録として今年のアドベントカレンダーネタにさせて頂きます。

改修箇所

  1. 図形削除基準変更
  2. Copyメソッド行エラー解消
  3. 2の改修に伴う新規事象発生の防止

記事作成にあたり、適宜不必要な行の省略やファイル名の変更を行っております。
予めご了承ください。

1. 図形削除基準変更

<改修前>

    'スライド内の図形を検索し、Hogehogeグラフという名前の図形があれば削除
    For Each ShName In pptSld.Shapes
        If ShName.Name = "Hogehogeグラフ" Then
	    ShName.Delete
        End If
    Next ShName

<改修後>

    'スライド内の図形を検索し、グラフが含まれていれば削除
    For Each ShName In pptSld.Shapes
        If ShName.Type = msoChart Then
	    ShName.Delete
        End If
    Next ShName

<改修ポイント>
 改修前は「PowerPointスライド内の図形を検索し、特定の名前の図形(グラフ)があれば削除する処理」。
 エラーは出ていませんでしたが、週に一回資料を更新する際前のグラフが消えずに重複する事象が度々発生。
 該当のスライドにはグラフが一枚しか貼られてないのをいいことに、グラフの有無で判定する処理に変更しました。
 改修後の判定に使った「msoChat」は、VBAで図形の種類や範囲を指定する為に使用するShape.Typeプロパティ定数のひとつで、「グラフ」を表しています。画像や吹き出し等、他の定数はMicrosoft公式ドキュメントをご覧ください。

2. Copyメソッド行エラー解消

<改修前>

    '表修正
    'カウントした値をインデックス番号として修正対象の表を指定
	'表に記載されている直近8日間の値を週始めのセルから順に転記
    With pptSld.Shapes(Table).Table
    For j = 1 To 7
        For CopyCol = 10 To 17
            .Cell(j, CopyCol).Shape.TextFrame.TextRange.Copy
        PasteCol = CopyCol - 7
            .Cell(j, PasteCol).Shape.TextFrame.TextRange.Paste
        Next CopyCol
    Next j
    End With

<改修後>

    '表修正
    'カウントした値をインデックス番号として修正対象の表を指定
	'表に記載されている直近8日間の値を週始めのセルから順に転記
    With pptSld.Shapes(Table).Table
    For j = 1 To 7
        For CopyCol = 10 To 17
            .Cell(j, CopyCol).Shape.TextFrame.TextRange.Copy
        PasteCol = CopyCol - 7
            .Cell(j, PasteCol).Shape.TextFrame.TextRange.Text = .Cell(j, CopyCol).Shape.TextFrame.TextRange.Text)
        Next CopyCol
    Next j
    End With

<改修ポイント>
 改修前はクリップボードが他のアプリケーションによって使用されている為か、Copyメソッドの行でほぼ毎回失敗。
 一旦DataObjectによりクリップボードを操作してCopyメソッド行を通したものの、以降のクリップボード操作で引っかかり修正が難航。
 最終的に「クリップボードを使用せず、直接貼り付け先のテキスト内容をコピー元に値を転記させる処理」に変更する事で無事エラー解消。

3. 2の改修に伴う新規事象発生の防止

<追加内容>

    '内部資料作成に使用したExcelファイルを保存せずに閉じる
    Application.DisplayAlerts = False
    (中略)
    End Sub

<追加ポイント>
 改修前はWorkbook.Closeメソッドを引数なしで使用。
 既存の処理では「○○.xlsxを保存しますか?」と尋ねられる事はありませんでした。
 Copyメソッド行の処理内容を変更した事で、マクロ終了直前に保存するかどうかのポップアップが出る様になってしまいました。ここは重要な処理ではない為、ポップアップ表示させない処理を最後に追加して改修完了!

マクロ改修裏話

 ふたつ目の改修途中、下記の内容を記載しました。

一旦DataObjectによりクリップボードを操作してCopyメソッド行を通したものの、以降のクリップボード操作で引っかかり修正が難航。

 ボツになってしまったDataObjectの記述を勧めてくれたのは……実はBing AIでした。
IT技術者もそうでない人もChatGPTで遊び倒していた間、私はびびってこの手のAIを使う事を躊躇っていました。
ところが限られた期間でExcel VBAのマクロを修正しなくてはならない状況に陥り、とうとうAIに助けてもらうという選択をしました……そう、現CopilotことBing AIちゃんです。
 この改修をやっていた頃(2023/03-04)と比べて、今は名前も変わり五回までのやり取りならMicrosoftアカウントでログオンする必要さえもなくなりました。あっという間に便利になりましたね。
 まぁ今回に限っては「残念ながら最適な解決方法はご提案してもらえなかった」もとい「先方のご提案は不採用になってしまった」のですが。。。

おわりに

 毎年恒例になってきた(?)ひいきバンドマン(草野マサムネ)と推しウクレリアン(関口和之)の誕生日お祝いシリーズ、三年目にして遂にポエムを脱出!……出来ましたよね???

 そしてマサムネさん&ムクちゃんさん、お誕生日(12/21)おめでとうございます!

(12/22追記)
 Qiita投稿が年一ペースなもので、マクロ本文の可読性に気が回っておりませんでした。
 編集リクエストを送ってくださった方のお陰で、見栄えが向上しました。この場をお借りして感謝申し上げます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0