記事内に広告が含まれています

【ワレコの講座】EXCEL VSTOアドインを他のPCに配布する(3/10)

この記事は約11分で読めます。
スポンサーリンク

写真 VSTOプログラミングをバリバリに出来る美人OLの人、でもパソコンの電源がOFF!

さて、ワテのブログ記事の中で最大の人気を誇る

【ワレコの講座】EXCEL VSTOアドイン シリーズ全10回予定

であるが、昨日、熱烈な読者の方からこんなコメントを頂いた。

YOKOYS より:
2018年3月15日 8:40 AM (編集)
自作したEXCEL VSTOアドインをリボンも含めて配布して他の端末でも使用したいときのベストな方法が知りたいです。

なるほど。

確かに、EXCEL VSTOアドインを作成したら、次にやりたいのは他のパソコンへの配布だ。

自称、EXCELアドインの達人のワテとしては、それくらいの質問なら答えられる自信はある。

と言う事で、当記事では、EXCEL VSTOアドインの配布方法を紹介したい。

では、本題に入ろう。

スポンサーリンク
スポンサーリンク

まずはEXCEL VSTOアドインを作成する

まあ、EXCEL VSTOアドインの作成方法は、前回までの講座で解説しているので、その記事を参考に作って頂きたい。

ここでは、即席でこんなサンプルを作成した。

プロジェクト名は、YOKOYSさんに敬意を表して、

YokoysExcelAddIn1

にさせて頂いた。

ボタンをクリックするとメッセージボックスが開くだけの簡単なサンプルだ。

図 MessageBoxを開くEXCEL VSTOアドインコード

MessageBoxを開くEXCEL VSTOアドインのC#全ソースコード

そのC#ソースコードの全貌を紹介しよう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Tools.Ribbon;
 
namespace YokoysExcelAddIn1
{
	public partial class Ribbon1
	{
		private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
		{
 
		}
 
		private void button1_Click(object sender, RibbonControlEventArgs e)
		{
			var messageBoxText = "なんでやねん!";
			var caption = "アヘアヘ";
			var button = MessageBoxButtons.OK;
			var icon = MessageBoxIcon.Information;
 
			// Display message box
                        DialogResult result = MessageBox.Show(
				text: messageBoxText,
				caption: caption,
				buttons: button,
				icon: icon);
 
			switch (result)
			{
				case DialogResult.OK:
					break;
				case DialogResult.Yes:
					break;
				case DialogResult.No:
					break;
				case DialogResult.Cancel:
					break;
			}
		}
	}
}

コード MessageBoxを開くEXCEL VSTOアドインのC#全ソース

 

このアドインプロジェクトをVisual Studioの環境で実行すると、エクセルが起動してアドインタブにそのアドインが読み込まれる。

図 EXCEL2013に読み込まれた「なんでやねん!」アドイン

 

「ボタンをクリック!」をクリックしてアドインを実行すると下図が出る。

図 MessageBoxで「なんでやねん!」が正しく表示された。

 

COMアドインの一覧を確認する

今作っているのはEXCEL VSTOアドインなのだが、EXCELには下図に示すようにCOMアドインと言う用語も使われる。

ワテの理解では、VSTOアドインはCOMアドインの一種である。

つまり、

COMアドイン ⊃ VSTOアドイン

と言う事だ。

今の場合は、VSTO(=Visual Studio Tools for Office) を使って作成したCOMアドインと言う事になる。

さて、そのVSTOアドインがEXCELに読み込まれている状況を確認してみる。

上図の「COMアドイン」をクリックすると下図が出る。

上図のように今作成した

「YokoysExcelAddIn1」

が有るはずだ。

さて、前回までの講座をお読み頂いた皆さんならここまでは自力で出来るはずだ。

プログラミングスクール

他のパソコンにEXECL VSTOアドインを配布する

いよいよ、本題の、他のパソコンに今作ったEXCEL VSTOアドインを配布してみよう。

「発行」を実行する

下図に示すように、左のソリューションエクスプローラー画面で、プロジェクト名

「YokoysExcelAddIn1」

の上で右クリックしてプロパティウインドウを表示する。

その中で「発行」を選択したのが下図だ。

図 Visual StudioのEXCEL VSTOプロジェクトのプロパティで発行を実行する

上図において、全部デフォルトのまま

「今すぐ発行」

を実行する。

 

なお、初めて実行する人の場合には、「発行するバージョン」の数字は以下の通り。

メジャー マイナー ビルド リビジョン
1 0 0 0

この数字は、「今すぐ発行」を実行する度に、自動で数字が増えて行く。

その理由は、

 ☑ リリースごとにリビジョンを自動的に追加する

のようにチェックしているからだ。

さて、「今すぐ発行」を実行すると、「公開」フォルダーが作成されてその中に数個のファイルが保存される。

公開フォルダを他のパソコンにコピペする

ワテの場合、VMwareと言う、仮想環境を実現出来るソフトを使っている。

その中にインストールしているWindows10に、今作成した「公開」フォルダ一式をコピペしたのが下図だ。

デスクトップに置いた。

図 VMware上のWindows10に「公開」フォルダをコピペした状態

 

プログラミングスクール

公開フォルダの中身を見る

まあ、今見なくても、皆さんは上で作成した時点で気になって見ていると思うが、「公開」フォルダの中身は以下の通り。

 

 

  • Application Files フォルダ
  • setup.exe
  • YokoysExcelAddIn1.vsto

の三つがある。

Application Files フォルダの中身は以下の通り。

  • YokoysExcelAddIn1_1_0_0_0 フォルダ
  • YokoysExcelAddIn1_1_0_0_1 フォルダ

ワテの場合、「今すぐ発行」を二回実行したので二種類のバージョンが入っていた。

なので、「発行」フォルダをコピペする時に、古いバージョン

  • YokoysExcelAddIn1_1_0_0_0 フォルダ

は事前に削除しておいても良いだろう。

で、必要な

  • YokoysExcelAddIn1_1_0_0_1 フォルダ

の中身は以下の通り。

図 YokoysExcelAddIn1_1_0_0_1 フォルダの中身

 

Setupを実行してVSTOアドインをインストールする

さて、setup.exeをダブルクリックで実行するとVSTOアドインのインストールが開始する。

インストーラーが起動すると下図が開く。

この図を見ると、

インストール元 file:///C:Users/wate/Desktop/公開/YokoysExcelAddin1.vsto

と表示されている。

今の場合は、デスクトップの公開と言う名前のフォルダーの中から必要なファイルが取得されて、インストールが開始する。

VSTOアドインをサーバー上に置いて大勢の人に配布する

もし、世間の大勢の人にVSTOアドインを配布したい場合には、ネット上のサーバーにこの「公開」フォルダを置けば良い。

その場合には、先ほど見た「発行」タブ画面(下図)の「発行フォルダーの場所」でFTPサーバーの場所をIPアドレスやホスト名で指定すれば良い。

図 FTPサーバーに発行する例   

FTPサーバーのユーザー名やパスワード情報は上図右端の アイコンをクリックして開く画面で入力する。

なお、上の画面を使ってVSTOアドインをローカルディスクに公開する場合でも、FTPサーバーに公開する場合でも、公開先のフォルダには複数のファイルが書き込まれる。

もし、複数のファイルを一つのZIPにまとめて公開したい場合には、それら複数ファイルを手作業でZIPファイルにして、公開先フォルダに置けば良いだろう。

ただし、そのような作業で作られたZIPファイルを利用者がダウンロードして解凍してパソコンにインストールしようとすると、Windows10が持つセキュリティブロックの機能が働いてインストール出来ない問題がある。

その辺りの対策は以下の記事で紹介している。

【ワレコの講座】エクセル罫線自動修復VSTOアドイン紹介【EXCEL COMアドイン】
写真 エクセルの罫線が消えてしまって焦っている人 さて四連休にもかかわらずコロナウイルス騒動の第二波がやって来ているので不要不急の外出は控えているワテである。 と言う事で、超久しぶりにプログラミング関連の記事を書いてみた。 まあ、元々ワテの...

ただし、この辺りの作業はワテも初めての経験だったので、もし上手く行かない場合がありましたら、コメント欄からお知らせ下さい。

自称、EXCELの達人のワテでも弱点は多いのだ。

あかんがな。

インストールしたばかりのEXCEL VSTOアドインを実行する

さて、本題に戻って、今インストールしたばかりのEXCEL VSTOアドインを実行してみる。

ここは、普通にVMware上のEXCEL 2013を起動する。

「アドイン」タブを開いて、group1グループに「ボタンをクリック!」が表示されているはずだ。

ここで、「ボタンをクリック!」をクリックしてみる。

 

その結果、「なんでやねん!」が表示されれば成功だ。

COMアドインパネルを開いてみる

念のためにCOMアドインパネルを開いてみる。

上図のように、今インストールした

「YokoysExcelAddin1」

がリストに表示されているはずだ。

インストールしたVSTOアドインはどこに保存されたのか?

えっと、それはワテも気になる。

少し調べてみたのだが、良く分からんかった。

まあ、もう少し粘って探せば見つかるとは思うが、今日はこれくらいしか時間が無いので、その調査は別の機会にしよう。

逆に、インストールしたVSTOの削除は、

コントロールパネル → 「プログラムと機能」

を開いて、「プログラムのアンインストール」を実行すれば良い。

まとめ

当記事は、

YOKOYS より:
2018年3月15日 8:40 AM (編集)
自作したEXCEL VSTOアドインをリボンも含めて配布して他の端末でも使用したいときのベストな方法が知りたいです。

と言うお問い合わせに対する回答と言う形で作成してみた。

ワテの場合、Visual Studio 2003の頃からEXCEL COMアドインを作成していたのだが、その当時は、ここで説明した「公開」フォルダに必要ファイル一式がまとめられるやり方では無かった。

Visual Studio 2003の時には、たしか、VSTOアドイン作成のテンプレートを読み込んでプロジェクトを作成すると、一緒にSetup用のプロジェクトも追加された。

そして、そのSetupプロジェクトは、VSTOのビルド結果のファイル一式をzipファイルか msiファイルか何かに一つにまとめてくれたと思う。

それで生成された Setup.exe を実行するとインストーラーが起動してインストール出来る部分は今回説明したのと同じ感じだったと思う。

と言う事で、この記事が、YOKOYSさんのご質問の回答になっているのかどうか、それが心配だ。

質問募集中

当ページにお越し頂いた皆さんも、もしEXCEL VBA、EXCEL VSTOアドイン、EXCEL XLLアドインに関して何か質問などありましたら、下にあるコメント欄からお気軽にお問い合わせください。

ワテが出来る範囲でお答えします。

この記事のシリーズ

【ワレコの講座】VS2017でEXCEL VSTOアドイン作成 – リボン編(1/10)
EXCELアドインには三種類ある。 アドインの種類 開発言語 説明など xlamアドイン VBA 歴史は古いが、開発環境が古臭い。 COMアドイン C#、VB.NET VSTOアドインとも言う XLLアドイン Visual Studioの ...
【ワレコの講座】EXCEL VSTOアドインで選択セル情報取得(2/10)
写真 ワレコのサイトを見ながらVSTOプログラミングを勉強中の人(カフェで) 全国のワレコEXCEL VSTOアドイン講座ファンの皆さんの為に、第二回目の講座を執筆した。 今回は、当ブログのコメント欄からお寄せ頂いた近藤さんのお問い合わせに...

関連記事

【ワレコのEXCEL】VBAでリボンを作成して使う方法【ワテ流】
EXCELのアドインには三種類ある。 EXCEL VSTOアドイン(EXCEL COMアドインとも呼ばれる) EXCEL XLLアドイン EXCEL VBAで作成するxlamアドイン だ。 マイクロソフト社の統合開発環境Visual Stu...
スポンサーリンク
コメントを読む

この記事には読者の方からコメントが 21件あります。
興味ある人はこのページ下部にあるコメントを参照下さい。

C#ExcelVSTO
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク

コメント

  1. YOKOYS より:

    お世話になります。VBAでのシートが変更されたときのイベントは変更後の内容がtargetとして渡されてきますが、実際に行が削除された後の動きになります。VSTOでは変更される前のイベントで処理可能でしょうか?例えば行を削除しようとしたとき、削除が処理される前に処理できないものかと思った次第です。

    • wareko より:

      YOKOYSさん、
      こんにちは。
      >VSTOでは変更される前のイベントで処理可能でしょうか?
      >例えば行を削除しようとしたとき、削除が処理される前に処理できないものかと思った次第です。
      なるほど。
      う~ん、私の理解では、それは出来ないと思います。
      と言うのは、VSTOで扱えるイベントは、基本的にはVBAで扱えるイベントと同じだと思うからです。
      例えば、何かの操作をする直前のイベントには Beforeナンチャラ と言う名前のイベントハンドラがありますが、
      具体的には、こんなやつですよね。
      WorkbookBeforeClose
      WorkbookBeforeSave
      私の知る限り、
      WorksheetBeforeChange
      と言うのは無いと思います。
      AppEvents_Event.cs
      の中身を見ると、以下に示すイベントハンドラがありますが、現状ではこの中にあるイベントハンドラしか使えないと思うのです。

      // Events interface for Microsoft Excel Microsoft.Office.Interop.Excel.Application
      // object events.
      [ComEventInterface(typeof(AppEvents), typeof(AppEvents_EventProvider))]
      public interface AppEvents_Event
      event AppEvents_NewWorkbookEventHandler NewWorkbook;
      event AppEvents_WorkbookBeforeXmlImportEventHandler WorkbookBeforeXmlImport;
      event AppEvents_WorkbookAfterXmlImportEventHandler WorkbookAfterXmlImport;
      event AppEvents_WorkbookBeforeXmlExportEventHandler WorkbookBeforeXmlExport;
      event AppEvents_WorkbookAfterXmlExportEventHandler WorkbookAfterXmlExport;
      event AppEvents_WorkbookRowsetCompleteEventHandler WorkbookRowsetComplete;
      event AppEvents_AfterCalculateEventHandler AfterCalculate;
      event AppEvents_SheetPivotTableAfterValueChangeEventHandler SheetPivotTableAfterValueChange;
      event AppEvents_SheetPivotTableBeforeAllocateChangesEventHandler SheetPivotTableBeforeAllocateChanges;
      event AppEvents_SheetPivotTableBeforeCommitChangesEventHandler SheetPivotTableBeforeCommitChanges;
      event AppEvents_WorkbookSyncEventHandler WorkbookSync;
      event AppEvents_SheetPivotTableBeforeDiscardChangesEventHandler SheetPivotTableBeforeDiscardChanges;
      event AppEvents_ProtectedViewWindowBeforeEditEventHandler ProtectedViewWindowBeforeEdit;
      event AppEvents_ProtectedViewWindowBeforeCloseEventHandler ProtectedViewWindowBeforeClose;
      event AppEvents_ProtectedViewWindowResizeEventHandler ProtectedViewWindowResize;
      event AppEvents_ProtectedViewWindowActivateEventHandler ProtectedViewWindowActivate;
      event AppEvents_ProtectedViewWindowDeactivateEventHandler ProtectedViewWindowDeactivate;
      event AppEvents_WorkbookAfterSaveEventHandler WorkbookAfterSave;
      event AppEvents_WorkbookNewChartEventHandler WorkbookNewChart;
      event AppEvents_SheetLensGalleryRenderCompleteEventHandler SheetLensGalleryRenderComplete;
      event AppEvents_SheetTableUpdateEventHandler SheetTableUpdate;
      event AppEvents_ProtectedViewWindowOpenEventHandler ProtectedViewWindowOpen;
      event AppEvents_WorkbookModelChangeEventHandler WorkbookModelChange;
      event AppEvents_WorkbookPivotTableOpenConnectionEventHandler WorkbookPivotTableOpenConnection;
      event AppEvents_SheetPivotTableUpdateEventHandler SheetPivotTableUpdate;
      event AppEvents_SheetSelectionChangeEventHandler SheetSelectionChange;
      event AppEvents_SheetBeforeDoubleClickEventHandler SheetBeforeDoubleClick;
      event AppEvents_SheetBeforeRightClickEventHandler SheetBeforeRightClick;
      event AppEvents_SheetActivateEventHandler SheetActivate;
      event AppEvents_SheetDeactivateEventHandler SheetDeactivate;
      event AppEvents_SheetCalculateEventHandler SheetCalculate;
      event AppEvents_SheetChangeEventHandler SheetChange;
      event AppEvents_WorkbookOpenEventHandler WorkbookOpen;
      event AppEvents_WorkbookActivateEventHandler WorkbookActivate;
      event AppEvents_WorkbookPivotTableCloseConnectionEventHandler WorkbookPivotTableCloseConnection;
      event AppEvents_WorkbookDeactivateEventHandler WorkbookDeactivate;
      event AppEvents_WorkbookBeforeSaveEventHandler WorkbookBeforeSave;
      event AppEvents_WorkbookBeforePrintEventHandler WorkbookBeforePrint;
      event AppEvents_WorkbookNewSheetEventHandler WorkbookNewSheet;
      event AppEvents_WorkbookAddinInstallEventHandler WorkbookAddinInstall;
      event AppEvents_WorkbookAddinUninstallEventHandler WorkbookAddinUninstall;
      event AppEvents_WindowResizeEventHandler WindowResize;
      event AppEvents_WindowActivateEventHandler WindowActivate;
      event AppEvents_WindowDeactivateEventHandler WindowDeactivate;
      event AppEvents_SheetFollowHyperlinkEventHandler SheetFollowHyperlink;
      event AppEvents_WorkbookBeforeCloseEventHandler WorkbookBeforeClose;
      event AppEvents_SheetBeforeDeleteEventHandler SheetBeforeDelete;

      ただし、上で説明した内容は、あくまで私の理解している内容ですので、
      物凄く上級者の人なら、何か良い解決方法を知っているかも知れません。

      • YOKOYS より:

        ご回答ありがとうございます。
        やはりイベントないですか。私も色々調べてはいるのですがなさそうです。
        処理後(target)とUndoした内容を比較して判定するしかないですかね。
        今後、決定打が見つかったらコメントさせて頂きます。

        • wareko より:

          YOKOYSさん
          >例えば行を削除しようとしたとき、削除が処理される前に処理できないものかと思った次第です。
          そもそも、そのようなイベントを検出したい理由はなんでしょうか?
          差し支えない範囲でお知らせ下さい。
          私も過去にかなりEXCEL関連でプログラミングした経験がありますが、
          そのようなイベントが必要になる状況が思い付きません。
          VSTOで行った操作に対する「UNDO機能」を実装したいと言う事でしょうか?

          • YOKOYS より:

            単純に任意の行の削除を禁止したいということなのですが、シート保護とかは使用しないという前提条件があります。行が削除されないままにエラーにしたいと思いまして・・・お知恵をよろしくお願い致します。

  2. wareko より:

    >単純に任意の行の削除を禁止したいということなのですが、シート保護とかは使用しないという前提条件があります。

    「行の削除禁止」ならシート保護が最適だと思うのですが、なぜシート保護を使用しないという前提条件があるのでしょうか?
    シート保護なら、まさに「行の削除」のみを禁止する事も可能です。
    それと、もし何らかの方法で「任意の行の削除を禁止」が実現出来たとして、
    「行の挿入」、「行の並べ替え」は許可しても良いのでしょうか?
    シート保護なら、「行の挿入」、「行の並べ替え」も禁止に出来ます。

    >行が削除されないままにエラーにしたいと思いまして・・・お知恵をよろしくお願い致します。

    「シート保護」を使わずに行削除を禁止したいなら、少し調べた限りでは、
    例えば、右クリックメニューの「削除」を無効化する方法が使えそうですが。
    「シート保護」を使うと同じく「削除」を無効化できますが、「シート保護」を使わずに「削除」を無効化するわけです。
    ただし、「シート保護」で行削除を無効化した場合には、[削除]キー押下を実行すると
    「変更しようとしているセルやグラフは保護されているシート上にあります。」
    と言うメッセージが表示されますが、「シート保護」を使わずに「削除」を無効化した場合には、[削除]キー押下でその行に記入されているデータはクリアする事は出来てしまいますが。
    少し調べた限りでは、こんなアイディアが浮かんだのですが、何かヒントになるでしょうか?

    • YOKOYS より:

      色々とご教示ありがとうございます。メニューの無効化はやりました。なぜシート保護を使わないのか。そう。まさに私もそこが一番気になるところなのですが、仕様としてそう定義されているので、シート保護なしで実現しようとしています。いまのところは行を削除したときのシートチェンジでTargetを取得し、Undoで元の行と比較して削除を判定し、エラーメッセージ表示させる処理にしています。実は行の挿入も勝手にさせない仕様でこちらもメニュー無効化など、同様な処理にしています。

  3. wareko より:

    さっき、ふと思いついたのですが、以下のような超ヘンテコな手法で実現出来るかもしれません。
    ・XLLを作成する。
    ・XLLの中でDLLインジェクションをやってEXCELの機能を一部置き換える。
    ・[行の削除操作]を検出したら、その処理はやらない。
    ・他の操作はそのまま実行する。
    です。
    SetWindowsHookExなどを使ってやれば原理的には出来ると思います。
    まあ、作ったXLLがノートンセキュリティによってウイルスと判定されるかもしれませんが。

    • YOKOYS より:

      ご教示ありがとうございます。
      なるほど・・・Excel-DNAで出来るかな・・・時間があるときに試してみます。
      色々とお知恵をありがとうございます!

  4. fuzzy より:

    こんにちは!
    こちらのサイトを参考に、ExcelやWordのVSTOアドインの作成方法を勉強しています。

    さて、今回、「発行」の方法でVSTOアドインを配布することができましたが、インストール先に独自のファイルを配布する際、拡張子が.xmlのファイルをインストール先に配置することができませんでした。
    拡張子を別の名前にすればOKでしたし、あくまでもこれは独自ファイルの配布の実験でしかないのですが、拡張子が.xmlのファイルを配置できないのは、何か理由があるのでしょうか?

  5. wareko より:

    fuzzyさん
    こんにちは。
    小生の記事を参考にして頂きましてありがとうございます。
    さて、お問い合わせの
    >拡張子が.xmlのファイルを配置できないのは、何か理由があるのでしょうか?
    の件ですが、申し訳ないですが私もVSTO配布の経験があまり無いので、原因はさっぱりわかりません。
    質問ですが、VSTOアドインを配布する場合に .xmlファイル以外の追加ファイルであればVSTOアドインと一緒に配布出来たのでしょうか?
    もしそうなら、その追加ファイルはどのようにして「公開」フォルダに追加されたのでしょうか?手で追加されたのでしょうか?
    .xmlファイルが配布出来ないと言う事ですが、インストール先のPCでインストーラーを実行すると何かエラーメッセージが出ますか?

    • fuzzy より:

      wareko様、こんにちは!
      レスを頂き、誠にありがとうございます。

      私が使用しているのはVS2013 (Community)なので、バージョン等の違いなのかも知れませんが、とりあえず、私の行った手順を以下に示します。
      (言語はVBを使用しています。)

      1.VSで新規プロジェクトを作成。
       テンプレートよりExcel2013アドインを選択。
       (VS2013では、これがExcel2013用VSTOアドインテンプレートになります。)
       とりあえず、プロジェクト名を「ExcelAddInTest」としました。

      2.プロジェクト「ExcelAddInTest」に対して、「追加」→「既存の項目」メニューより、以下のファイルを追加する。
       ・test.txt
       ・test.xml
       ・test.xxx
       (実は、すべて中身は全く同じUTF-8エンコードのxmlファイルです。)
       また、プロジェクトに含めた上記ファイルのプロパティを以下のように変更。
       「ビルドアクション」=「コンテンツ」
       「出力ディレクトリにコピー」=「常にコピーする」

      3.リボン(ビジュアルなデザイナー)「Ribbon1」を追加し、さらに、リボン上にボタン「Button1」を追加。

      4.ボタン「Button1」をクリックした時に、このアドインの配布先フォルダがエクスプローラで開くように、以下のコードを追加。
      Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click
      Dim strBasePath As String = System.AppDomain.CurrentDomain.BaseDirectory
      System.Diagnostics.Process.Start(strBasePath)
      End Sub

      5.このプロジェクトの「発行」の所で「今すぐ発行」を実行。
       セットアップファイル等が生成されたフォルダ内の「Application Files」のバージョン番号付きフォルダ内には、前記2.で追加したファイルのdeployファイルが以下のように作成されていました。
       ・test.txt.deploy
       ・test.xml.deploy
       ・test.xxx.deploy

      6.上記「発行」で生成されたインストーラ「setup.exe」を実行。
       エラーの発生は特にありませんでした。

      7.Excelを起動し、アドインタブを開き、作成したリボン上のボタン「Button1」をクリック。
       配布先のフォルダが開き、以下のファイルが格納されていましたが、「test.xml」がありませんでした。
       ・ExcelAddInTest.cdf-ms
       ・ExcelAddInTest.dll
       ・ExcelAddInTest.dll.cdf-ms
       ・ExcelAddInTest.dll.manifest
       ・ExcelAddInTest.manifest
       ・Microsoft.Office.Tools.Common.v4.0.Utilities.cdf-ms
       ・Microsoft.Office.Tools.Common.v4.0.Utilities.dll
       ・Microsoft.Office.Tools.Common.v4.0.Utilities.manifest
       ・test.txt
       ・test.xxx

      ちなみに、実際に作成したいのはWordのアドインなのですが、Wordでも同じ現象が出ました。

  6. wareko より:

    fuzzyさん
    詳しい報告ありがとうございました。
    教えて頂いた情報を元に私も再現実験してみました。
    その結果、無事解決しました(たぶん)。
    それらの調査内容を記事にまとめましたので参考にして下さい。
    https://www.wareko.jp/blog/xml-file-not-deployed-problem-in-vsto-solved

    • fuzzy より:

      wareko様、こんにちは!
      色々と調べて頂き、誠にありがとうございます。
      お手数をお掛けしてしまったようで、何だか申し訳ございませんm(__)m
      拡張子 .xml, .mdf, .mdb のファイルはデータと見なされて、アセンブリとは別のデータフォルダに配置されるのですね。
      OfficeのVSTOアドインに関する記事があまりない中(英語の記事はあるのかも知れませんが…)、アドイン開発はハードル高いなーと思っていた所でしたので、非常に勉強になりました。
      心より御礼申し上げます。
      今後ともどうぞよろしくお願い申し上げます。

  7. wareko より:

    fuzzy様
    この度は、小生の記事がお役に立てたようで、安心しました。
    私の経験で言うと、Visual StudioやVSTOの開発で原因不明の問題に直面した場合には、
    英語のサイトのほうが有益な情報が多い気がします(正確な根拠はありませんが)。
    まあ、日本語サイトと英語サイトの数を単純比較しても後者のほうが圧倒的に多いですが、技術系の調べ事をする場合も私は英語サイトを優先して閲覧します。
    ですので検索キーワードも日本語は使わずに英単語のみで検索する場合が多いです。
    もちろん例外もあります。
    日本語サイトなら
    http://www.atmarkit.co.jp/
    などは信憑性の高い内容の記事が多いと思いますので参考にしています。
    では、VSTO開発の成功をお祈りします。

  8. fuzzy より:

    wareko様、こんにちは!
    この度は色々とお世話になりました。

    > 私の経験で言うと、Visual StudioやVSTOの開発で原因不明の問題に直面した場合には、
    > 英語のサイトのほうが有益な情報が多い気がします(正確な根拠はありませんが)。

    実は、このご意見を参考に、先程別の技術検索を行ったときに、英語キーワードでの検索に挑戦してみました。
    すると、日本語キーワードでの検索では欲しい情報が中々引っかからなかったのに、英語キーワードで検索すると、(機械翻訳の結果を斜め読みしただけですが)有効そうな記事がヒットしました。

    やはり世界は広いですね。
    ちょっと変わったようなことをしようとすると、日本国内だけでは中々情報が見つからないですね。

    とは言え、VSTOに関する記事の検索で、wareko様のブログがヒットしたのは、非常に幸運だったと感謝しております。
    これからもブログを拝見しますので、今後ともよろしくお願い申し上げます。m(_ _)m

  9. pripri より:

    こんにちは。ExcelのVSTOアドイン作成を始めたてのものです。
    この前作成したアドインを、このブログで紹介された方法で「発行」し、作成されたセットアップファイルを別PCにインストールしました。

    「発行フォルダーの場所」は、デフォルトの「発行\」にしています。
    また、「インストールフォルダ―」のURLは空欄です。

    今回、そのアドインを修正したものを別PCにインストールしようとしたら、setup.exeの実行時に以下のエラーが表示されました。

    「現在他のバージョンがインストールされており、この場所からアップグレードすることはできないため、このカスタマイズをインストールすることはできません。(以下略)」

    色々と確認したところ、以下のことが判りました。

    ・旧アドインをアンインストールすれば、修正アドインをインストールは可能。
    ・旧アドインをインストールしたフォルダに「発行」フォルダの内容を置いた場合、修正アドインは問題なくインストールされる(置き換わる)。

    おそらくこれは「発行」の仕組み上、バージョンアップ時のインストーラは前バージョンと同じ場所にあることが前提なのだと思いますが、これではアドイン更新の際は非常に不便です。
    何か設定が足りないところがあるのでしょうか?

  10. wareko より:

    pripriさん

    この度は、小生のブログ記事にコメントありがとうございました。

    さて、pripriさんのご質問は、
    旧アドインがインストールされているパソコンに新アドインをインストールしたい場合に、
    自動的に古いアドインをアンインストールしてから新アドインをインストールする事が出来ないのか?
    と言う事でしょうか?

    その辺りの仕組みは、私も詳しくは知りませんので、少し調べてみました。
    たまたま見付けた下記英文ページに関連する質問が見付かりました。
    英語のページなので私には理解出来ていない部分もありますが。

    Excel Add in updates from wrong location

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/37be698d-859f-4879-83ff-93670940a47b/excel-add-in-updates-from-wrong-location?forum=vsto

    その中で、下に引用する部分がpripriさんの質問に関連するのではないでしょうか。

    If you have previously published and installed the same solution to your development computer, Visual Studio Tools for Office runtime detects that the installation path for the published version and the built version are different after the solution is next built, rebuilt, or published. The error message says “the customization cannot be installed because another version is currently installed and cannot be upgraded from this location.” The registry keys are updated whenever a solution is rebuilt. Therefore, you must uninstall the previous version before you publish, debug, or run the new version.

    この英文を読む限りは、古いバージョンを事前にアンインストールしておかないと、カスタマイズはインストール出来ないとの事です。
    ですので、事前に手作業で古いアドインを削除するのが通常のやり方だと思います。
    回答している人はマイクロソフトの人のようですので信憑性は高いと思います。

    ただし、何らかの特殊な設定とか仕組みを使って自動的に古いアドインを削除して、そして新しいアドインをインストールする手法があるのか無いのかは、引き続き調査してみないと分かりません。
    少なくともVisual StudioのExcelアドインの[発行]の設定を見た限りでは、無さそうですね。

    でも、pripriさんと同じような要望を持つ人は多いと思うので、ネット検索すれば何か良い方法が見付かるかもしれませんね。

    とりあえず、私が調査して判明したのはこのあたりまでです。
    では。

  11. wareko より:

    pripriさん

    ああ、今思い出したのですが、Excel VSTOアドインを他のパソコンに配布する手段は、
    pripriさんが試されている手法以外にもあります。
    それは、Windowsインストーラーを作成する手法です。
    私の記憶が確かなら、Visual Studio 2003でExcel2003のアドインを作っていた頃はその手法でインストーラーを配布していました。

    今でもその手法は使えます。

    参考になるサイトを見付けました。

    Windows インストーラーを使用して Office ソリューションを配置します。
    https://docs.microsoft.com/ja-jp/visualstudio/vsto/deploying-an-office-solution-by-using-windows-installer?view=vs-2017

    このWindowsインストーラーの手法を使えば、自動的に古いアドイン(やプログラム)を削除してから、新しいアドイン(やプログラム)をインストールする事が出来ます。

    要するに、インストーラーを起動したら、
    古いアドイン(やプログラム)が見つかりました。
    削除しますか?[Y/N]
    みたいなメッセージを表示して、利用者が[Y]と答えたら、削除を行う。
    そして、新しいアドイン(やプログラム)をインストールすると言う、良く見かけるやつです。
    この方法がお勧めだと思います。

  12. wareko より:

    ただし、私の場合はVS2017でこのWindowsインストーラーを作った事がありません。
    確かVS2013やVS2015では、インストーラープロジェクトは廃止されてInstall Shieldプロジェクトでインストーラーを作成する方式に変わりました。
    そしてVS2017では再びVisual Studio Installerと言う方式に変わったようです。
    確認してみたら、VS2017では、
    新しいプロジェクト
      その他のプロジェクトの種類
         Visual Studio Installer
    と言うのがありました。
    このテンプレートを使えば、Excelアドインだけでなく、一般のプログラムを配布するためのインストーラーを作れるはずですが、実は私はVS2017ではまだその方式でインストーラーを作った事がありません。
    まあネット検索すれば情報は沢山あると思いますのでそれらの情報を参考にお試し下さい。

    • pripri より:

      ワレコ様、ご回答ありがとうございます。
      なるほど、Windowsインストーラーという手がありましたね。
      こちらも試してみようと思います。
      ただ、「発行」も捨てがたい理由は、管理者権限不要で、ユーザーアカウント制御のダイアログも出ないので、都合がよい人もいるんですよね。
      (ただ、VSTOの「発行」は、通常のClickOnceとは設定できる情報がちょっと違うようですね。)