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

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

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

No.7041 の関連記事表示

<< 0 >>
■7165  Re[15]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 渋木宏明(ひどり) -(2006/10/04(Wed) 04:31:45)
>

    分類:[C#] 

    > なら指定しない場合ようにValueプロパティも残しといてほしk(ry

    出来るんならやってたでしょうね。

    遅延バインドによるオートメーションは IDispatch インターフェースによる機能呼ぶ出しによって実現されているため、同名で引数や戻り値型だけが異なる機能呼び出しを同居させることが出来ないのです。

記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7164  Re[14]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/04(Wed) 01:48:58)

    分類:[C#] 

    せざるえなかったっていう表現はいらぬ誤解を招きそうなので、
    "引数を指定できるアクセサーを提供した"に言い直しておきます。
    なら指定しない場合ようにValueプロパティも残しといてほしk(ry
記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7162  Re[13]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/04(Wed) 01:11:21)

    分類:[C#] 

    >> 2000時にはできなかった型指定が2003でできるようになった。
    >?? それは、どういう意味でしょうか?

    Excelはバージョン2002からXMLへの対応が図られています。
    2000以前にはその機能がなかったため、当時のValueプロパティには引数はなく、
    C#でオートメーションを利用する際にも当然Valueプロパティが使えました。
    しかし、2002以降スプレッドシートからRangeオブジェクトを介してDOMドキュメントを抽出できるようになったため、
    Valueプロパティに引数が設けられました。
    C#はプロパティに引数を与えることができなかったため、アクセサーを公開せざるえませんでした。
    引数にはxlRangeValueDataType列挙型の値を指定するようです。

    ・・・というのが今現在の私の解釈で、
    レスしたときは、MSDNにget_Value(RangeValueDataType)と書いてあったのを、
    単純に戻り値の型を指定できるものと解釈していました。勘違いです。申し訳ありません。
記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7151  Re[12]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 魔界の仮面弁士 -(2006/10/03(Tue) 22:35:28)

    分類:[C#] 

    > (get_Valueは使えない)。
    引数無しバージョンのアクセサを呼ぼうとすると、C#コンパイラは CS0571 エラーを
    吐きますが、リフレクションによって MethodInfo.Invoke する事は可能だと思います。


    > (つか引数使ったことないけど)。
    中には、バージョンによって戻り値の有無が変化するメソッドさえありますね…。


    > 2000時にはできなかった型指定が2003でできるようになった。
    ?? それは、どういう意味でしょうか?


    > インターフェースはValueで定義している・・・というわけですかな。
    ですね。その COM 側の定義に関しては、No7102に記載したようになっています。
記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7140  Re[12]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/03(Tue) 19:45:45)

    分類:[C#] 

    解決がいつのまにか外れてました。
記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7139  Re[11]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/03(Tue) 19:45:10)

    分類:[C#] 

    >それは、言語仕様上の問題です。
    >VB.NET とは異なり、C# は引数つきのプロパティをサポートしていないためです。
    >(ついでに言うと、省略可能引数も C# ではサポートされていません)

    >そのかわりに、COM相互運用アセンブリは、その Value プロパティに対応する
    >『get_Value(引数)メソッド』を用意しますので、C# 側では、それを使って
    >事前結合によるアクセスを行えるようになっています。

    なるほど。でもMicrosoft Excel9.0 Object Library(Excel2000用のやつ)を利用した場合はValueプロパティが使えるのですよね(get_Valueは使えない)。つまり型を指定したデータの取得はできないことになります(つか引数使ったことないけど)。

    うーん、わからなくなってきたので整理すると
    2000時にはできなかった型指定が2003でできるようになった。VBはプロパティに引数を指定できるので対応できたが、C#は対応できないので仕方なくアクセサーを公開した。インターフェースはValueで定義している・・・というわけですかな。

記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7135  Re[10]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 魔界の仮面弁士 -(2006/10/03(Tue) 19:22:51)

    分類:[C#] 

    > ただ、WorkBooksにはあるのはOpenメソッドであってOpensではないように思いますがどうなんでしょうか。
    うわはははははっ(脂汗
    情け無いことに、今度はこちらのスペルミスです。すみません。


    > Valueプロパティに関しては確かにMSDNにも載っているのですが実際に使おうとすると以下のようなエラーが出ます。
    それは、言語仕様上の問題です。
    VB.NET とは異なり、C# は引数つきのプロパティをサポートしていないためです。
    (ついでに言うと、省略可能引数も C# ではサポートされていません)

    そのかわりに、COM相互運用アセンブリは、その Value プロパティに対応する
    『get_Value(引数)メソッド』を用意しますので、C# 側では、それを使って
    事前結合によるアクセスを行えるようになっています。
記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7133  Re[9]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/03(Tue) 19:16:05)

    分類:[C#] 

    >魔界の仮面弁士さん

    私が根本的な勘違いをしているのかもしれません。
    とりあえず一つ目の勘違いとして

    >> WorkBookのOpenメソッドの引数がファイルパスのみだったりと、

    上記のWorkBookはWorkBooksの間違いでした。申し訳ありません。
    ただ、WorkBooksにはあるのはOpenメソッドであってOpensではないように思いますがどうなんでしょうか。
    http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.workbooks.open.aspx


    Valueプロパティに関しては確かにMSDNにも載っているのですが実際に使おうとすると以下のようなエラーが出ます。

    エラー 3 プロパティ、インデクサまたはイベント 'Value' は、この言語でサポートされていません。アクセサ メソッドの 'Microsoft.Office.Interop.Excel.Range.get_Value(object)' または 'Microsoft.Office.Interop.Excel.Range.set_Value(object, object)' を直接呼び出してください。

    VS2005のコードアシスト機能を使いましてもValueプロパティは出てきません。
    なのでMSDNが間違っているのかなぁと思っていました。
記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7102  Re[8]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 魔界の仮面弁士 -(2006/10/03(Tue) 14:18:51)

    分類:[C#] 

    2006/10/03(Tue) 14:50:59 編集(投稿者)

    > ただ一つ気になるのは、2003しか入っていない環境にも関わらずRangeのValueプロパティが使えたり

    2003 であろうとなかろうと、Range オブジェクトは、Value プロパティを持っているのでは。
    以下、Excel 8(Excel 97) と Excel 11(Excel 2003) のタイプライブラリの比較。


     [uuid(00020846-0000-0000-C000-000000000046)]
     dispinterface Range
     {
      (…略…)
      #if EXCEL8
       [id(0x00000006), propget]
       VARIANT Value();

       [id(0x00000006), propput]
       void Value([in] VARIANT rhs);
      #elseif EXCEL11
       [id(0x00000006), propget]
       VARIANT Value([in, optional] VARIANT RangeValueDataType);

       [id(0x00000006), propput]
       void Value([in, optional] VARIANT RangeValueDataType, [in] VARIANT rhs);
      #endif
      (…略…)
     };


     [uuid(00020846-0001-0000-C000-000000000046)]
     interface IRange : IDispatch
     {
      (…略…)
      #if EXCEL8
       [propget]
       HRESULT _stdcall Value([in, lcid] long lcid, [out, retval] VARIANT* RHS);

       [propput]
       HRESULT _stdcall Value([in, lcid] long lcid, [in] VARIANT RHS);
      #elseif EXCEL11
       [propget]
       HRESULT _stdcall Value([in, optional] VARIANT RangeValueDataType,
                  [in, lcid] long lcid, [out, retval] VARIANT* RHS);
       [propput]
       HRESULT _stdcall Value([in, optional] VARIANT RangeValueDataType,
                  [in, lcid] long lcid, [in] VARIANT RHS);
      #endif
      (…略…)
     };


    > WorkBookのOpenメソッドの引数がファイルパスのみだったりと、
    Workbook.Open というメソッドは、定義されていないと思います。(Open イベントの事では無いですよね?)

    Workbooks.Opens というメソッドならば定義されていますけれども、それにしても
    「引数がファイルパスのみ」という定義では無く、『[in, optional] VARIANT ReadOnly』などの
    省略可能な引数が十数個ほど用意されているはずです。

    ------------

    <Excel97>
     [id(0x000002aa)]
     HRESULT Open([in] BSTR Filename, /* 12個のoptional引数 */, [in, lcid] long lcid, [out, retval] Workbook** RHS);
    </Excel97>

    <Excel2003>
     [id(0x000002aa)]
     HRESULT _Open([in] BSTR Filename, /* 12個のoptional引数 */, [in, lcid] long lcid, [out, retval] Workbook** RHS);

     [id(0x00000783)]
     HRESULT Open([in] BSTR Filename, /* 14個のoptional引数 */, [in, lcid] long lcid, [out, retval] Workbook** RHS);
    </Excel2003>
記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7097  Re[7]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/03(Tue) 13:13:11)

    分類:[C#] 

    遅延バインディング+オートメーションを使って、Excelのバージョンに依存するコード無しで実装することができました。
    今回はExcelファイルのリードオンリーな上、比較的簡単なシートフォーマットだったため、遅延バインディングにわずらわしさを感じることなく実装できました。

    また保存せずに終了することも、終了する前にApplicationオブジェクトのDisplayAlertsプロパティをfalseしておくことでできました。(Excelファイルのバージョンを調べること、及び起動するExcelのバージョンを指定する必要なくなりました)

    ただ一つ気になるのは、2003しか入っていない環境にも関わらずRangeのValueプロパティが使えたり(2003用COMライブラリのRangeクラスにValueプロパティはないはず)、WorkBookのOpenメソッドの引数がファイルパスのみだったりと、まるでVBライクなことです。この辺はCOMインターフェースを実装しているおかげなのかなぁと思ったりしますが、ならインターフェースの定義はどこでにあるのと疑問に思います。

    まぁ今回は各環境でうまく動作してくれたので良しとします。
    皆様どうもありがとうございました。

記事No.7041 のレス / END /過去ログ6より / 関連記事表示
削除チェック/

■7076  Re[6]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/02(Mon) 17:11:05)

    分類:[C#] 

    >Object型に対してInvokeMemberすればよいのでは?
    >というかすべてObject型で扱うのが遅延バインディングのような。。。

    あぁ、なるほど。理解しきれていませんでした。申し訳ありません。
    確かにこれならばバージョンに依存せずにVersionプロパティを参照できそうですね。
    ふむふむ。

記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7067  Re[5]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ まどか -(2006/10/02(Mon) 16:21:29)

    分類:[C#] 

    > しかし、Versionプロパティを参照するためにはオブジェクト型のobjApp_Lateを
    > Excel.Applicationインスタンスにキャストしなければいけないと思います。

    Object型に対してInvokeMemberすればよいのでは?
    というかすべてObject型で扱うのが遅延バインディングのような。。。
    #コンパイル時(コーディング時)に型がわからないということ
記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■7054  Re[3]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 中博俊 -(2006/10/02(Mon) 12:26:19)
>

    分類:[C#] 

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

    XP の PIAと、2003のPIAでは名前空間から違うのでそれの事を言っているのだと思われます。
記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7050  Re[2]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ まどか -(2006/10/02(Mon) 12:15:41)

    分類:[C#] 

    #同じくあまりお勧めしないわけですが

    こんなスレがありました。
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6833&forum=7&7

    インストールバージョンについては、
    HEKY_CLASSES_ROOTを見るとExcel.Application.バージョン番号となっているようですので
    それを取得する方法があります。
    そこのCLSIDからたどっていけばインストールパスがわかりますので
    GetObject(VB関数)で指定したバージョンのインスタンスを作れそうです。

記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7047  Re[1]: Excelのバージョンの違いをカプセル化する方法について
□投稿者/ 渋木宏明(ひどり) -(2006/10/02(Mon) 11:41:48)
>

    分類:[C#] 

    > 1.インストールされているExcelのバージョン判別方法

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

    > 2.Excelファイルのバージョン判別方法

    調べたことが無いので分かりませんが、エクスプローラから Office ファイルの「プロパティ」を表示した時に「概要」タブに表示される情報の一部として記録されているかもしれないですね。
    ↑の情報の取得については、何度か掲示板等で見かけたことがあります。
    (興味が無かったので具体的な手順は覚えてません)

    > 3.二つのExcel用COMライブラリを一つのプロジェクトで参照するには

    出来ないという前提で進めるしかありません。

    > バージョンによってインターフェース(メソッド名、引数、名前空間)が異なるため、共通化できる部分が何一つとしてなく困っています。

    そんなに違いますか?

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

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

    引数が「追加」されたメソッドはいくつかありますが、それらに対しては前述のようにレイトバインドでオートメーションで対応する他無いでしょう。
    ただし、C# ではこーどの記述量が増大してしまうのが難点です。

    > それはさておき、参照設定に追加した際、ソリューションエクスプローラの一覧に表示される名前が同じ(Excelというなめ)になるのです。そのため、一つのプロジェクトで二つのExcel用COMライブラリを参照することができず、プロジェクトを分けなければなりません。分ければいいというのはごもっともな意見だと思いますが、今後のために参照設定に追加する際の名前を指定する方法があれば教えてください(あらかじめプロジェクトのどこか設定するのでしょうか)。

    IDE の挙動を制御する方法は知りません。
    手動で tlbimp して、結果を IDE に取り込んでください。

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

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

記事No.7041 のレス /0過去ログ6より / 関連記事表示
削除チェック/

■7041  Excelのバージョンの違いをカプセル化する方法について
□投稿者/ NZ-000 -(2006/10/02(Mon) 09:32:52)

    分類:[C#] 


    分類:[C#] 

    環境:
    WindowsXP SP2
    VS2005 C# Windowsアプリケーション
    Excel2000,2003共存


    Excelはバージョンによって使うCOMライブラリが異なりますし、ライブラリによってインターフェースも異なるので非常に困惑しています。
    現在主流のExcelは2003だと思いますが、2000もまだまだ現役のようです。
    そこで2003または2000がインストールされているPCで、2003のファイルでも2000のファイルでも読み込める仕様を検討中です。

    仕様は以下のようにしようと思っています。

    1.インストールされているExcelのバージョンをチェックする。

    2.開こうとするExcelのバージョンをチェックする。

    3.バージョンが異なれば、アナウンス(ご使用のExcelでファイルを保存しなおしてください。とか)

    4.バージョンが合えば、そのバージョンのExcelで開く。

    そのような中疑問に思っていることを質問したいと思います。
    (いくつかあります。スレッドを分けた方がよろしければ分けます。)


    1.インストールされているExcelのバージョン判別方法
    Excel.ApplicationクラスのVersionプロパティによってインストールされているExcelのバージョンを調べることができますが、使うCOMライブラリ自体を切り分けたいのでこのクラスを使用する前に判別する必要があります。
    レジストリとかdllのバージョンで判別するのかなぁなどと考えていますが、答えにたどりつけませんでした。
    何か方法があれば教えてください。


    2.Excelファイルのバージョン判別方法
    世間には、開く前にOfficeファイルのバージョンをチェックするソフトがいくつか転がっていますが、
    私にはどのようにしてその機能を実現しているのかわかりませんでした。
    バイナリファイルを無理やり開いて何か手がかりはないものかとも思いましたが、エンコードが混ざっていてバージョンらしき記述の部分が文字化けしてしまいます(なんかファイルの最後の方にファイル情報が記述されているようです)。
    何か方法があれば教えてください。


    3.二つのExcel用COMライブラリを一つのプロジェクトで参照するには
    バージョンによってインターフェース(メソッド名、引数、名前空間)が異なるため、共通化できる部分が何一つとしてなく困っています。
    (2000用のはInterop.Excel、2003用のはMicrosoft.Office.Interop.Excel)
    それはさておき、参照設定に追加した際、ソリューションエクスプローラの一覧に表示される名前が同じ(Excelというなめ)になるのです。そのため、一つのプロジェクトで二つのExcel用COMライブラリを参照することができず、プロジェクトを分けなければなりません。分ければいいというのはごもっともな意見だと思いますが、今後のために参照設定に追加する際の名前を指定する方法があれば教えてください(あらかじめプロジェクトのどこか設定するのでしょうか)。

    4.2000と2003が共存している環境で、バージョン指定でExcelを開く方法
    共存環境を作成し、例えば、2000のCOMライブラリを用いてExcelを起動しようとしたにもかかわらず、
    起動するExcelは2003の方です。予想では2000が起動するのかと思っていたので疑問に思っています。
    ちなみにインストールは最初に2000、次に2003の順に行いました。
    何か方法があれば教えてください。
親記事 /0過去ログ6より / 関連記事表示
削除チェック/

■7041  Re[12]: Long型の乱数を生成する自作クラスをつくりたい
□投稿者/ ぼのぼの -(2007/08/29(Wed) 12:09:38)
    No7022 (れい さん) に返信
    > 前者は奥が深いです。作って実際に役に立てられる人はレアですが。
    そこなんですよね。経営的視点で見ると、そこに時間を割いても会社の利益に直接結びつかない。
    となると技術者としての自己満足の世界になってくるわけで、個人的に楽しめるかが重要になる。
    自分の場合は、最近はこういう数学的に深いとこよりもユーザビリティとかの方に興味があるので、
    ここにエネルギーをかける気力は今のところあまりないんですよね(^^;
    
    > 後者はプログラムの勉強ですね。
    > アルゴリズムの本などにも載ってますので、ほとんどの答えも手に入ります。
    > 欲しい分布の乱数をライブラリが用意してくれてないときなど、
    > その場で作らなきゃいけなくなるので、一度やっておくのはお勧めです。
    ユーザビリティというのは何も画面の操作性に限ったことではなくて、
    広義では比較的技術レベルの低い人でも読み易く理解し易いソースコードってのも含まれると思うのです。
    #開発者が既存ソースを保守拡張することを「使う」と表現していいのであれば
    そういう意味では魔界の仮面弁士さんが示してくださった乱数生成のコードは秀逸だと思っていて。
    精度的にも今回はこれで十分という認識なので、そのまま使わせて頂いています。
    
    > 自分でいろいろ考えるのが楽しいですよ。
    > 
    > ダメだしは得意なので、
    > ダメが欲しければぜひ呼んで下さい。
    
    UInt64で計算するバージョンを作ってみました。
    もし穴が空いていたら遠慮なく突っ込んでください。
    
    Public Class LongRandom
    
        Private _Random As New Random
    
        Public Function [Next](ByVal min As Long, ByVal max As Long) As Long
            '最小値の方が大きかったら例外を投げる
            If min > max Then Throw New ArgumentOutOfRangeException()
            '最小値と最大値が同じならその数を返す
            If min = max Then Return min
            'UInt64型の乱数を生成
            Dim b() As Byte = BitConverter.GetBytes(0UL)
            _Random.NextBytes(b)
            Dim ul As UInt64 = BitConverter.ToUInt64(b, 0)
            '乱数を範囲内に変換
            Dim umin As UInt64 = LongToUInt64(min)
            Dim umax As UInt64 = LongToUInt64(max)
            If umin <> UInt64.MinValue OrElse umax <> UInt64.MaxValue Then
                ul = umin + ul Mod (umax - umin + 1UL)
            End If
            'Long型に変換
            Return UInt64ToLong(ul)
        End Function
    
        Private Function LongToUInt64(ByVal longVal As Long) As UInt64
            Dim retval As UInt64
            If longVal >= 0 Then
                retval = Convert.ToUInt64(longVal)
                retval += Convert.ToUInt64(Long.MaxValue)
                retval += 1UL
            Else
                longVal += Long.MaxValue
                longVal += 1
                retval = Convert.ToUInt64(longVal)
            End If
            Return retval
        End Function
    
        Private Function UInt64ToLong(ByVal uint64Val As UInt64) As Long
            Dim retval As Long
            If uint64Val > Convert.ToUInt64(Long.MaxValue) Then
                uint64Val -= Convert.ToUInt64(Long.MaxValue)
                uint64Val -= 1UL
                retval = Convert.ToInt64(uint64Val)
            Else
                retval = Convert.ToInt64(uint64Val)
                retval -= Long.MaxValue
                retval -= 1
            End If
            Return retval
        End Function
    
    End Class
記事No.6994 のレス /過去ログ18より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -