FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

Excelアドインを作ろう!

はじめまして。
もう入社して1年以上たつのにまだまだフレッシュな原田と申します。

0. ボクについて

前年の5月入社しコンシューマサービス開発しています。
人生ではWindows系の開発が長く、HCK, COM , DirectX 〜 Xamlまで幅広く触ってきました。
最近のマイブームは仕事の自動化です。

PowerShellとかVBAマクロとか。

閑話休題、本題にはいりましょう。

1. Excelアドインとはなにか?

そもそもアドインとは⇒アドイン

お察しの人はわかるように、Excelにも新たな機能を追加できるんです。
次のような、自作でしかできないようなことを実現することができます。

  • データベースからExcelのテーブルにデータを持ってきてほしい
  • ユーザーIDと個数書いたら勝手にInsertクエリをTextに吐き出してほしい。

アドインの追加方法は調べてみてください。
Excel アドイン 追加

2. 実際に作ってみよう!

アドインつくるにもお題がないと個人的にはつまらないので、
今回はあるあるそんなの欲しかったの代表格となるアドインにしようと思います。

2-1. お題

皆さん、上司またはお客様にExcel提出するときに次のようになるように言われた経験はないでしょうか?
  • シートの選択セルはA1セル
  • シートの縮尺率は100%
  • bookを開いた時には1番前のシート
正直言って、ボクはあります。
手でやると非常に面倒くさいですよね。
シートが4,5枚だと特に気にせず手作業でやってしまうのですが、10枚〜20枚ぐらいになるとそこそこ時間とりますよね。

というわけで、この面倒くさい体裁を整える作業を自動化するアドオンを作ってみましょう!

2-2. まず設計(?)

設計といっても、大したことはしません。
ざっくり機能とUIを考えてみます。

2-2-1. 機能

というわけで、ざっくりとした要件
  • シートの選択セルはA1セル
  • シートの縮尺率は100%
  • bookを開いた時には1番前のシート
上記を自動で実行してくれる。
ボタンをクリックすることで実行する。
⇒ いつでも実行できること!

追加で次の要件も追加しておきましょう。

  • ただ単にシートを整えてくれるだけ
  • シートを整えたあとに、保存もしてくれる。

2-2-2. UI

今回は上記の要件からリボンコントロールを使って実装しようと思います。
リボンコントロールにボタンを追加することで、すぐに実行できるような作りにしようと思います。

f:id:s_hayase:20150722145428p:plain

↑こんな感じ

2-3. コードを書こう。

さて、ざっくり自分の作りたいアドオンが決まったところで、実際にコードを書いてみましょう!
Excelでbookを新規作成して、[開発]タブから[VisualBasic]を選択します。
(開発タブがない場合には、[Excelのオプション]>[基本設定]から[開発]タブをリボンに表示する(D)のチェックボクスをONにしましょう。)

今開いているbookのプロジェクト(例:VBAProject(Book1))を右クリックして標準モジュールを追加します。
(今回は、他のbookに対して操作するアドインのため、標準モジュールです。)

VBAマクロのお話ではないので、コードについてはサラッと次のようなコード作りました。
そんなに難しい操作はしていないので、勉強して読んでみてください。

' リボンからの呼び出し口(セットのみ)
Sub OnSetButtonClick(control As IRibbonControl)
    Dim isExistActiveBook As Boolean
    isExistActiveBook = CheckActivebook
    If isExistActiveBook = True Then
        Call SheetSet
    End If
End Sub

' リボンからの呼び出し口(セット&保存
Sub OnSetAndSaveButtonClick(control As IRibbonControl)
    Dim isExistActiveBook As Boolean
    isExistActiveBook = CheckActivebook
    If isExistActiveBook = True Then
        Call SheetSet
        ActiveWorkbook.Save
    End If
End Sub

' セット本体処理
Sub SheetSet()
    Dim WorkBook1 As Workbook
    Set WorkBook1 = ActiveWorkbook

    For Each ws In WorkBook1.Worksheets
        ws.Activate
        ActiveWindow.View = xlNormalView
        ActiveWindow.Zoom = 100
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
        Range("A1").Select
    Next
    WorkBook1.Worksheets(1).Activate
End Sub

' ブックが存在するかチェック
Function CheckActivebook() As Boolean
    If Dir(ActiveWorkbook.Name & ".xls") >> "" Then
        CheckActivebook = False
    Else
        CheckActivebook = True
    End If
End Function


コードも書いたので一度、保存しましょう。
この時注意して欲しいのは、「xlsx」に保存ではなくて、「xlam(Excel アドイン)」で保存してください。

2-4. UIを作ろう!

2-4-0. 余談

UIを作る前に実はの余談です。
実はOffice2007からの形式「xlsx , xlam」とかは実はZipなんです。
実際に、保存した適当な「xlsx , xlam」の拡張子をzipにすると解凍できます。
解凍したExcelの中のxmlをいじくってUIを作ることができます。

2-4-1. UIを作ろう

UIの作成は次のような流れで実施します。

1. Excelファイルの解凍
2. UIの定義をリレーションに追加
3. UI本体の作成
4. 構成ファイルの圧縮

1.Excelファイルの解凍

先ほど(2-3項)で作成したxlamの拡張子をZipにして解凍してみましょう!
下図のようなフォルダ構成になります。

f:id:s_hayase:20150722145339p:plain

2. UIの定義をリレーションに追加

.relsの中のRelationshipsタグの中に以下のコードを追加します。

<Relationship Id="適当なID" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>


3.UI本体の作成

定義したフォルダ(上記の例だと「customUI/customUI.xml」)を作成します。
まず、customUIというフォルダーを作成して、customUI.xmlといったファイルを新規作成します。
customUI.xml文字コードUTF-8にしておいてください。

その後、customUI.xmlに以下コードを貼り付けます。
ざっくりとわかるとは思いますが、リボンコントロールをXMLで記載しています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="AppearanceSet" label="シートセット">
				<group id="Appearance" label="シートセット">
					<button id="Set" label="セット" imageMso="HappyFace" size="large" onAction="OnSetButtonClick" />
					<button id="customButton2" label="セットして保存" imageMso="HappyFace" size="large" onAction="OnSetAndSaveButtonClick" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>


4.構成ファイルの圧縮

上記の手順が終わったら、解凍したファイルを再度Zipに圧縮しましょう。
圧縮して、拡張子をzip => xlamに変更すればこれで完了です。

UIのカスタマイズを更に知りたい場合には、ここを調べてみてください。
Customizing the 2007 Office Fluent Ribbon for Developers

3.まとめ

いかがだったでしょうか?
リボンコントロールを使用したアドインが作れるようになりましたでしょうか?

基本的には、次の3つのプロセスで簡単にアドインが作れます。

1. 自動化する仕事を決める。
2. 標準モジュールを作る。
3. 標準モジュールをリボンコントロールに登録する。

今回は、Developer向けにZip解凍して自分でリレーションを貼って作成する方法をご紹介いたしました。
Custom UI Editor Toolなど、簡単にUIを作れるフリーソフトがありますので、興味があれば調べてみてください。