none
DataGridのデータをExcelへ出力して表示するとき RRS feed

  • 質問

  • 太字のところでエラーになります。

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;
    using System.Reflection;
    
    Excel.Application exApp = new Excel.Application();
    Excel.Workbooks wkBooks;
    Excel._Workbook wkBook;
    Excel.Sheets wkSheets;
    Excel._Worksheet wkSheet;
    Excel.Range range;
    wkBooks = exApp.Workbooks;
    wkBook = wkBooks.Add(Missing.Value);
    wkSheets = wkBook.Worksheets;
    wkSheet = (Excel._Worksheet)wkSheets.get_Item(1)

    デバッグ実行前に,下のような表示が出ております。

    上の表示に構わずに実行すると下のようなエラーになります。

    ここでVS2019を閉じると,「白紙のExcelシート」が表示されており,その上に下のメッセージも表示されております。

    はじめてのことで,訳も分からず「同意しない」をクリックすると上の表示は消え,下のメッセージが表示されました。

    対応の方法が全く分からず途方の暮れている次第です。どうぞご教授いただけますようよろしくお願いいたします。

    <参照>Microsoft Excel 12.0 Object library
    <私のPC>Excel 2003,2007,2013 VS2019

    • 編集済み goodwave 2019年8月6日 6:29 追記
    2019年8月6日 6:20

回答

  • .Add を引数無しで呼び出してみたらどうなりますか?

    引数付きで呼び出す場合には、
    System.Reflection.Missing.Value ではなく
    System.Type.Missing を利用してみてください。

    それと、Excel のライセンス認証が完了しているかも確認を。

    • 回答としてマーク goodwave 2019年8月6日 20:48
    2019年8月6日 8:48

すべての返信

  • .Add を引数無しで呼び出してみたらどうなりますか?

    引数付きで呼び出す場合には、
    System.Reflection.Missing.Value ではなく
    System.Type.Missing を利用してみてください。

    それと、Excel のライセンス認証が完了しているかも確認を。

    • 回答としてマーク goodwave 2019年8月6日 20:48
    2019年8月6日 8:48
  • Excel2003を開こうとするたびに,上のイメージにある「Microsoft Office 使用許諾契約書」が表示され,「同意する」を押さない限りExcelを使用できないことを確認しました。(この2003を使っていた当時には,いちいち「同意する」ボタンを押す必要はなかったはずです)。ちなみに,このExcel2003は Microsoft office Personal Edition 2003 です。

    そこで,Excel2003をアンインストールしてはじめからプロジェクトを作り直してみることにしました。

    2019年8月6日 8:50
  • すみませんでした。魔界の仮面弁士さんのご返信を見過ごして下の投稿をしていました。いつも的確なご助言をいただきありがとうございます。

    >Excel のライセンス認証が完了しているかも確認を。
    1時間ほど前に完了したところです。それで今度は大丈夫ではないかと思い Excel2003 を起動してはみたのですが,起動の度に「Microsoft Office 使用許諾契約書」が表示されてしまいます。

    >.Add を引数無しで呼び出してみたらどうなりますか?
    この後にためしてみますね。ありがとうございました。


    • 編集済み goodwave 2019年8月6日 9:07 訂正
    2019年8月6日 9:05
  • アプリケーションの実行アカウントが異なる場合、認証情報も異なってくるかと思います。

    このプログラムは、デスクトップ上から実行されているのでしょうか?
    また、それは管理者モードでの実行でしょうか。それとも通常起動でしょうか。

    あるいはデスクトップにログオンしているユーザーではなく、タスクスケジューラなどといった、何らかのサービスから起動されているのでしょうか?

    -- 追記 --

    質問のタイトルが「DataGridのデータ」となっていますね。どのプロジェクト形式で開発されているのでしょうか?

    【Windows フォーム アプリケーション】のプロジェクトの、
    DataGridView クラスではなさそうですね。
    WinForm プロジェクトにも DataGrid クラス はありますが、VS2019 で使われることは稀ですし。

    とすると、【WPF アプリ】の DataGrid クラス なのでしょうか?

    それとも、【ASP.NET Web アプリケーション】の DataGrid クラスでしょうか?

    もしも ASP .NET だとしたら、サーバーサイド(あるいは無人実行されるサービスアカウント)での Office 利用は基本的に NG となりますので、処理そのものを見直す必要があります。対話型デスクトップ環境(WPF や WinForm 等)でのクライアントサイド処理に置き換える必要があるでしょう。

    あるいはサービス上で実行させるために、Office オートメーション以外の方法(NPOI、ClosedXML、EPPlus 等)を使うという選択肢もあります。

    2019年8月6日 9:59
  • 魔界の仮面弁士さん,ありがとうございます。私のタイトルの書き間違いでいらぬ手間をおかけして申し訳ありません。

    >質問のタイトルが「DataGridのデータ」となっていますね。どのプロジェクト形式で開発されているのでしょうか?
    DataGridViewの間違いでした。大変申し訳ございません。

    >.Add を引数無しで呼び出してみたらどうなりますか?
    私にとっては不思議なことが起きています。エラーになりますが,そのエラーは,
    画面の右肩にできた紫色の新たなタブ<[読み取り専用]のプレビュー>が表示されており,
    それは修正前のコード(因数あり)でして,ここでエラーになっています。

    >このプログラムは、デスクトップ上から実行されているのでしょうか?
    そうです。

    >また、それは管理者モードでの実行でしょうか。それとも通常起動でしょうか。
    これについては特に意識しておりませんでしたが,通常起動だと思います。(管理者モードでの実行方法を知りませんので)

    -----------------------------------------
    「C#からExcelの呼び出し」の前に整理すべき問題があるようですので,この質問は一旦保留させていただきたいと思います。

    これから整理すること
    「Microsoft Office 使用許諾契約書」の表示なしにExcel 2003を起動することができるか?
    ----------------------------
    Turbo C→QuickCVS C# と Cの勉強を続けていますが,未だ初心者の域を脱することのできない未熟者です。
    Turbo CやQuickC の頃は本屋さんだけが「学校」でしたが,今では魔界の仮面弁士さんはじめ多くのみなさんのご助言・ご教示のお陰で老後の楽しみとして続けることができています。これからもどうぞよろしくお願いします。

    2019年8月6日 20:48
  • DataGridView のことだったんですね。そこは一安心。

    管理者モードについては、スタートメニューの Visual Studio アイコンあるいは作成した exe を右クリックして「管理者として実行」して呼び出すものです。

    訳も分からず「同意しない」をクリックすると上の表示は消え,下のメッセージが表示されました。

    「同意しない」を選択した際に、"team foundation add-in" のエラー通知が表示されていたのですよね。

    Excel 2013 を起動して、メニューから[ファイル]-[オプション]を開き、[アドイン]の中にある "Team Foundation Add-in" という COM アドインがアクティブになっていないかを確認してみてください。もしもアクティブになっているようなら、解除しておいてみてはどうでしょうか。社内で Team Foundation Server を立てて管理しているとかではなければ、このアドインを使うことはそうそうないはず。

    (自分は Excel 2003 時代に、TFS Client の問題で悩まされたことがあったので、Team Foundation 系の Office アドインはあまり信用していない…)

    それと、その時のエラーメッセージで『[ヘルプ] メニューから [バージョン情報] をクリック』という表現があったことも気になります。このエラーメッセージを表示させているのは、どのバージョンの Excel なのでしょうか。

    [ヘルプ]-[バージョン情報]のメニューは Excel 2003 までにあったものですが、Excel 2007 以降ではリボン化したことにより、現在は失われていると記憶しています。

    現在の環境に「Excel 2003,2007,2013」とあった点も気がかりです。そもそも Microsoft Office は、複数のバージョンを同時にインストールすることが推奨されていません(特に 2003 以下)。理由としてはレジストリ登録の事情(COM オートメーションや関連付けなど)や、アドバタイズ インストールの誤動作や DLL Hell 問題の危険性などが挙げられます。

    問題点を切り分けるためにも、本当に必要としているバージョンの Office のみがインストールされている環境で検証されることをお奨めします。他の実行環境が用意できない場合は、現在の Office をいったんすべてアンインストールし、最新バージョン(できれば msi 版)のみをインストールされることをお奨めします。

    一応公式には、共存インストールも可能とされていますが、それはあくまでも限定的であるとされていますし、さらには『これらの推奨事項に従っている場合でも、同じ PC で 2 つのバージョンの Office を使うときに問題が発生することがあります。』と明記されています。共存させないほうが無難でしょう。


    それは修正前のコード(因数あり)でして,ここでエラーになっています。

    「因数(いんすう)」ではなく「引数(ひきすう)」ですね。
    引数を"いんすう"と読むのは間違いでは無いですが、引数を"因数"と書いてしまうと意味が変わってきます。

    • 因数(いんすう) … [factor] 数学用語。掛け算で表される式における、それぞれの項(かけている値・かけられている値)を指す。
    • 引数(ひきすう) … [parameter] プログラム用語/数学用語。関数(function)や手続き(procedure)において、その外部と値をやり取りするための物。関数等に渡す呼び出し元の引数は実引数、関数側で受け取る側の引数は仮引数と呼ばれる。
    2019年8月7日 1:18
  • 魔界の仮面弁士さん,数度にわたるご親切なご返信ありがとうございます。

    VS2008でDataGridViewのデータをExcelに出力することは,そんなに難しくなっかったものですからVS2019でのエラーも簡単に解消できるのではないかと思っていたのですが,実はまったく甘い考えだったと気づくことができました。

    元号「令和」を自動取得することにこだわってVS2019での再編集をはじめたのですが,「Excelへのデータ出力」については,Excelを経由しなくても決算報告書や予算案などをを印刷できるのですが,自部好みのレイアウトで印刷したいという人のために用意したものなのでした。

    それで今回作成するバージョンでは「Excelへのデータ出力」はしないこととし,次のバージョンでは魔界の仮面弁士さんに教えていただいたことをしっかりと勉強(76歳の爺さんのボケ防止のためにも)して,「Excelへのデータ出力」をできるようにしたいと思っています。

    2019年8月7日 23:01
  • 魔界の仮面弁士さん,Excelに出力することができました。ご親切なご教示にもかかわらずCOMのほうにこだわってしまっていたのが不具合の原因でした。申し訳ありませんでした。

    2019年8月17日 20:42