Excelのアドインを作ってみる ~後編:アドイン作成~

前回はVSTOアドインとWebアドインの違いについて触れました。
今回は実際にアドインを作成していきます。

開発環境

言語:C#
IDE:VisualStudio2022
プロジェクトテンプレート:Excel VSTO アドイン
フレームワーク:.NET Framework4.8
Office:Office2021(Windowsデスクトップ版)

0.事前準備

VisualStudio2022を以下のリンクからダウンロードし、インストールします。
https://visualstudio.microsoft.com/ja/free-developer-offers

VisualStudioInstaller を起動し、「Office/SharePoint 開発」にチェックを入れインストールします。

1.プロジェクト作成

VisualStudio2022を起動し、[新しいプロジェクトの作成] → [Excel VSTO アドイン]を選択します。

任意のプロジェクト名や保存場所を入力し、プロジェクトを作成します。

2.画面要素の追加

プロジェクトが作成できたら、リボンを追加していきます。
プロジェクトを右クリックし、[追加]→[新しい項目]をクリックします。

[リボン(ビジュアルなデザイナー)]を選択し、任意の名前を入力して[追加]をクリックします。

リボン用の.csファイルが追加され、画面にリボンのエディタが表示されます。
既定でタブとグループが追加されていますね。
リボンの編集やコントロールの追加などはこの画面で行っていきます。

左のツールボックスから Button をドラッグアンドドロップし、グループの中に配置します。

Label プロパティを変更し、タブ・グループ・ボタンの表示を変更します。
(プロパティは右下に表示されます。)

ここまでで一度実行してみます。
[開始] をクリックすると、ビルドが実行されビルド後にExcelが起動します。

Excel上に作成したタブやボタンが表示されていますね。これで画面作成は終了です。

3.処理の実装

画面の作成ができたので、ここからは処理の記述をしていきます。
WindowsFormsのデザイナと同じように、ボタンをダブルクリックすると自動でイベントハンドラを実装してくれます。CustomRibbon.cs に button1_Click イベントハンドラが自動で実装されましたね。
ここにグループ化ボタンが押された時の処理を記述していきます。

以下のコードを記述します。

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    // Excelのアプリケーションオブジェクトを取得
    Application excelApp = Globals.ThisAddIn.Application;

    // 現在選択されているセル範囲を取得
    Range selectedRange = excelApp.Selection;

    // 選択範囲に含まれる図形の名前リストを作成
    List<string> shapeNames = new List<string>();
    Worksheet activeSheet = excelApp.ActiveSheet;
    foreach (Shape shape in activeSheet.Shapes)
    {
        if (shape.TopLeftCell.Row >= selectedRange.Row
         && shape.BottomRightCell.Row <= selectedRange.Row + selectedRange.Rows.Count - 1
         && shape.TopLeftCell.Column >= selectedRange.Column
         && shape.BottomRightCell.Column <= selectedRange.Column + selectedRange.Columns.Count - 1)
        {
            shapeNames.Add(shape.Name);
        }
    }

    // 複数選択されていればグループ化して一つの図形にする
    if (shapeNames.Count >= 2)
    {
        Shape groupedShape = activeSheet.Shapes.Range[shapeNames.ToArray()].Group();
        groupedShape.Select(true);
    }
}

処理が一通り書けたので [開始] を押して実行します。
図形を適当に何個か作成し、そのうち何個かをセルの選択範囲に含めて [グループ化]ボタンをクリックします。

選択範囲に含まれていた図形がグループ化されて1つの図形になりました。

終わりに

今回のような単純な処理であればサクッとアドインは作れるようです。
マクロとの使い分けですが、
・マクロ:ファイルの内容に依存する処理
・アドイン:ファイルの内容に依存しない処理
という風に使い分けるのがいいのかなと思います。

コメント

タイトルとURLをコピーしました