C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.7066 の関連記事表示

<< 0 >>
■7066  Re[4]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/02(Mon) 16:02:28)

    分類:[C#] 

    皆さん貴重なご意見ありがとうございます。

    >渋木宏明(ひどり)さん

    >Excel.Application.Version を参照するのが無難です。
    >.dll や .exe が存在していても、それが本当アプリケーション実行に使用されているものかを検査するのは困難です。
    >プロパティ値の取得くらいなら、C# でレイトバインドでオートメーションしても大した手間にはなりません。


    遅延バインドについて以下を参照していて思ったことがあります。
    http://support.microsoft.com/default.aspx?scid=kb;JA;302902

    "遅延バインディングを使用するオートメーション クライアントの作成"

    の項で以下のようにしてインスタンスを取得しています。
    object objApp_Late;
    Type objClassType;
    objClassType = Type.GetTypeFromProgID("Excel.Application");
    objApp_Late = Activator.CreateInstance(objClassType);

    確かにこのソースを見る限りバージョンに依存したコードが消えているように思えます。
    しかし、Versionプロパティを参照するためにはオブジェクト型のobjApp_Lateを
    Excel.Applicationインスタンスにキャストしなければいけないと思います。
    そして、その際どちらの(2000or2003)Excel.Applicationクラスを使うか考えることになるかと思います。
    これを考えた時点でExcelのバージョンに依存してしまう気がしますがどうなんでしょうか。
    例えば、それを2003のExcel.Applicationクラスを使って組んでおいて、2000しかインストールされていない環境で実行すると2003のCOMライブラリがありませんというエラーは出ないでしょうか?
    (事前バインディングの場合はでました。当然ですが)
    というより参照設定せずにそのクラスが使えるのかが不思議でならないのですが、あいにくまだコード上で試せていません。


    >名前空間は IDE が「参照設定」を行う際に勝手につけたものです。
    >手動で tlbimp すれば自分で好きなように付け替えられます。

    参考になります。ただ以下に関して上記のこともあって、はたして全てを遅延バインディングで解決できるのか疑問に思っているため共通化部分が見えてきません。

    >メソッド名やプロパティ名に関しては「追加」や「拡張」はあると思いますが、「共通化できる部分が何一つ無い」ような状況ではないように見えます。

    Excelのバージョンによってインターフェースが異なる名前空間に個別に定義されています。Excelのアプリケーション変数を共通化することもできません。私はインストールされているExcelを判別した後は、それぞれのバージョンにあわせた独自のコードを書くしか道はないのではと思っていました。
    まだちょっと先が見えていません。

    >> 4.2000と2003が共存している環境で、バージョン指定でExcelを開く方法
    >> 共存環境を作成し、例えば、2000のCOMライブラリを用いてExcelを起動しようとしたにもかかわらず、
    >> 起動するExcelは2003の方です。予想では2000が起動するのかと思っていたので疑問に思っています。
    >> ちなみにインストールは最初に2000、次に2003の順に行いました。
    >> 何か方法があれば教えてください。

    >どうしたいんですか?
    >上位バージョンが起動する分には問題ないように思えますが。

    前提としてプログラム内で勝手にExcelファイルのバージョンを書き換えたくないという思いがあります(いいわすれていましたが今回考えているのはExcelファイルのリードオンリーです)。
    2000のみインストールしているユーザーと2003のみインストールしている間で一つのExcelファイルのバージョンが、このソフトを使うたびにころころ変わることになります。上書きした際にどの程度のデータが欠落するか定かでない(勉強不足)のため、できる限り書き換えたくないのです。

    しかも現状では、例えば、2000で作られたExcelファイルを2003で開き閉じようとすると、何も変更を加えていないにも関わらず、バージョンの不一致から変更を保存するか聞いてくるダイアログがExcel側で自動でたちが上がります。これが出るとプログラム側でアプリケーションを閉じることがでません(プロセスをKillすればいける?)。

    事前にExcelファイルのバージョンを調べる手段もわかっていないため、Excel.Application.Save()で無理やり上書きするしかありません。従って「このソフトでExcelファイルを使うとデータが欠落する可能性がありまっせ」という極めて迷惑なソフトに仕上がっています。


    >まどかさん

    >インストールバージョンについては、
    >HEKY_CLASSES_ROOTを見るとExcel.Application.バージョン番号となっているようですので
    >それを取得する方法があります。

    なるほど、確かにありますね。2000と2003を共存させている環境で見ると、以下のようなキーがありました。
    Excel.Application (←不明)
    Excel.Application.11 (Excel2003)
    Excel.Application.9 (Excel2000)

    参考にさせてもらいます。

    >そこのCLSIDからたどっていけばインストールパスがわかりますので

    わかりました。

    >GetObject(VB関数)で指定したバージョンのインスタンスを作れそうです。

    ちょっとまだ調べきれていません。


    >中博俊さん

    >XP の PIAと、2003のPIAでは名前空間から違うのでそれの事を言っているのだと思われます。

    XPと2003のPIAに相違があることは初耳でした。
    http://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.aspx
    上記の下の方に個別に対応するように書いてありました。
    ただ、ソースは不明ですが、ネット上から得た情報では以下の位置付けになっていました。
    Excelバージョン : Microsoft Excel Object Libraryのバージョン
    97以下 : 8
    2000 : 9
    2002 :10
    2003,XP :11

    2003とXPは同じCOMライブラリでいけるようでした。名前空間が違うという情報は見つけられませんでした。


    何分、素人のため情報に乏しく返答に時間がかかってしまい申し訳ありません。
    もう少し考えて結論が出せましたらレスして解決とさせていただきます。
記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7066  Re[6]: VBについて
□投稿者/ まる -(2007/08/29(Wed) 17:00:35)
    No7065 (PATIO さん) に返信

    ご指摘ありがとうございます。
    これは個人的にどういうふうに作るのかを知りたくて質問しました。
    課題ではないので、今の夏休みの間に具体的なプログラムをみて勉強したいと思ってます。
記事No.7026 のレス /過去ログ18より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -