C#からExcelを操作する(VSTO)

Excelレガシーという言葉を以前取り上げましたが、私がそれに苦しめられたのは特定のライブラリへの強い依存のためでした。シリアル通信が目的なだけなのにライブラリを使うためにExcel VBAで構築し、挙句管理されていないコードがあちこちに生まれていました。

じゃあExcelの各セルのデータをシリアル送受信したい場合、どうするか?私ならVSTOを使います。そこで今日は簡単にVSTOをご紹介。今もまだExcel VBAにしがみついている人はそれがベストなのか再度自問して頂くきっかけになればと思います。

VSTOはVisualStudioPro以上(確か。ExpressEditionにはありません)で使える機能です。

vsto_project

【Excelアドイン】 と 【Excelブック】 の2種がありますが、これは適用スコープの違いです。

ExcelアドインはExcel全体に適用されます、Excelシートをpdfとして印刷する機能や、今回紹介するExcel上のデータをシリアル送受信する機能などはアドインとして作るのが望ましいでしょう。対して Excelブックは1ブックにのみ適用されます。従来のExcelVBAはこちらに分類されると考えればイイかと思います。今回はExcelアドインを作成します。

あとちなみにVisualStudioのバージョン次第で対象とできるExcelは変わってきます。私の環境にあるExcel2007(古っ!)に対応しているのはVisualStudio2010だけですので今回はこれでいきます。古いExcelを対象にしたアドインであっても基本的に後方(上位)互換性はあるので、新しいExcelでも使えます。新しいExcel固有の機能だけは新しいExcelを対象にできるVisualStudioでないと操作できないみたいです。

 

1.リボンの構成

新しくプロジェクトを作成してリボンを追加します。WindowsForms同様このリボン上にコントロールを配置すれば良いのですが配置できるものはOfficeリボンコントロールに限定されています。

ribbon_control

serial_ribbon

2.機能の実装

リボンにコントロールを配置したらC#でイベントハンドラを作っていくだけです。

namespace ExcelAddInTest
{
    using System;
    using Microsoft.Office.Tools.Ribbon;
    using System.IO.Ports;
    public partial class TestRibbon
    {
        private void TestRibbon_Load(object sender, RibbonUIEventArgs e)
        {
            // ポート名
            var availablePorts = SerialPort.GetPortNames();
            foreach(var port in availablePorts){
                var item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
                item.Label = port;
                portDropDown.Items.Add(item);
            }
            // ボーレート
            var availableBaudRates = new string[]{
                "9600",
                "19200",
                "115200",
            };
            foreach (var baud in availableBaudRates)
            {
                var item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
                item.Label = baud;
                baudDropDown.Items.Add(item);
            }
            // パリティ
            var parityOptions = new string[]{
                "Even",
                "Odd",
                "None",
            };
            foreach (var parity in parityOptions)
            {
                var item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
                item.Label = parity;
                parityDropDown.Items.Add(item);
            }
        }

        private void startCommButton_Click(object sender, RibbonControlEventArgs e)
        {
            var serialPort = new SerialPort(portDropDown.SelectedItem.Label,
                Int32.Parse(baudDropDown.SelectedItem.Label));
            serialPort.Open();

            // T.B.D. serialPortを使ってRead/Write

            serialPort.Close();
        }
    }
}

簡単ですね。1つ注意点として、上で出てきたRibbonDropDownItemはじめVSTOで利用可能な多くはインターフェースになっています。そのためこれを実装したクラスを作る…とも思いがちですが、そこはファクトリーがありますのでそちらを利用します。

これをビルドすると、

VSTO_SerialComm

アドインとして新しいタブが追加され機能が操作できるようになります。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中