DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.NETで動かすエクセルとのバージョン関係について

環境/言語:[Windows2000,XP]
分類:[.NET]

 こんばんは。
今、あるSQLのテーブから.VBの画面の出力指示より、エクセルで雛形を作った資料物を印字します。
 そこで、印字するソリューションで、プロジェクト→参照設定でMicrosoft Excel 10.0を選択し、 ObjectLibrary にチェックしていましたが、ユーザーのパソコンでアプリ起動させるとコケました。どうやら、この方法では、まずいということを聞きました。
 エクセルのバージョンを意識することなく、コーディングにするには、どのように記述すれば良いのでしょうか?

 また、スレ違いの質問で申し訳ありませんが、ユーザー環境ではListviewのラベルの幅が変わる?ためか、長い題名は...となりました。これは、OSの違いのせいでは?と思ったのですが・・・。

ユーザー  WindowsXP エクセル2003
開発環境 Windows2000 エクセル2002  

よろしくお願い致します。
おはようございます、Shinoさん。

■No5233に返信(Shinoさんの記事)
> こんばんは。
> 今、あるSQLのテーブから.VBの画面の出力指示より、エクセルで雛形を作った資料物を印字します。
>  そこで、印字するソリューションで、プロジェクト→参照設定でMicrosoft Excel > 10.0を選択し、 ObjectLibrary にチェックしていましたが、ユーザーのパソコンでアプリ起動させるとコケました。どうやら、この方法では、まずいということを聞きました。
>  エクセルのバージョンを意識することなく、コーディングにするには、どのように記述すれば良いのでしょうか?

私も以前同じ現象が起きてしまいました。
SEに懇願して、別の方法にしてしまったので解決方法はわかりません。
お役に立てなくてすいません。

>  また、スレ違いの質問で申し訳ありませんが、ユーザー環境ではListviewのラベルの幅が変わる?ためか、長い題名は...となりました。これは、OSの違いのせいでは?と思ったのですが・・・。

OSのせいです。OSの違いで等幅フォントの全角文字の幅が変わります。
XPの方は、「半角2桁」==「全角1桁」なのですが、
2000では、「半角2桁」!=「全角1桁」のようです。
これは、TextBoxでも起こります。ただしLabelコントロールでは起きません。
色々考えて以下を試しました。

・XPStyleファイルを自作してごまかしてみる。
・XP視覚スタイルを無効にしてかつ、クラシック表示にする。

結果はやはりダメでした。XP視覚スタイルのせいだと思ったのですが、
これは完全にOS側が、等幅フォントの全角文字の幅を変えているせいかと。
なので、私はOSのバージョンを見て、勝手に微調整をかます関数を実装してます。

何か別の方法があれば、私も教えて欲しいです・・・。
java.lang.Nullpoさん、レスありがとうございます

>> エクセルのバージョンを意識することなく、コーディングにするには、どのように記述すれば良いのでしょうか?
>
> 私も以前同じ現象が起きてしまいました。
> SEに懇願して、別の方法にしてしまったので解決方法はわかりません。

うーん、何か書き方ありそうですけどねぇ。どなたかご存知の方は是非、お願いします!

>ユーザー環境ではListviewのラベルの幅が変わる?ためか、長い題名は...となりました。これは、OSの違いのせいでは?と思ったのですが・・・。
>
> OSのせいです。OSの違いで等幅フォントの全角文字の幅が変わります。
> XPの方は、「半角2桁」==「全角1桁」なのですが、
> 2000では、「半角2桁」!=「全角1桁」のようです。
> これは、TextBoxでも起こります。ただしLabelコントロールでは起きません。
> 色々考えて以下を試しました。
>
> ・XPStyleファイルを自作してごまかしてみる。
> ・XP視覚スタイルを無効にしてかつ、クラシック表示にする。
>
> 結果はやはりダメでした。XP視覚スタイルのせいだと思ったのですが、
> これは完全にOS側が、等幅フォントの全角文字の幅を変えているせいかと。
> なので、私はOSのバージョンを見て、勝手に微調整をかます関数を実装してます。

ちなみにユーザーは2000とXPで、たまたまXPでデモしたので、上記の現象に気づきました。デモ時は、「あれれ?」と内心あせっていました・・・。

で、OSを判断してサイズを変えなくちゃならなそうですね。ショック・・・。
どこかで、OSを判断するコードは見たことあります。
サイズ変更をするコードは、Listview1.columns.〜?
Listview1.HeaderStyle.〜?
実際、タイプしてみても、これ以降に続くのがなさそうで・・・。
申し訳ありません、ここのコード教えて頂けませんか?
よろしくお願い致します。
こんにちは。

ここのサイトで探してみたら、ListviewのHeader指定ありました。そこの、ぺがらぼさんの回答を引用させて頂きます。
私は、columnsプロパティでやっていたので・・・。

with ListView1
 'カラムの追加
 .Columns.Clear() '一応、クリアしておく
 .Columns.Add("会社コード", 200, HorizontalAlignment.Left)
 .Columns.Add("会社名", 400, HorizontalAlignment.Left)
 .Columns.Add("住所", COL_WIDTH6, HorizontalAlignment.Left)
end with

上記を、OSがXPだったら〜のIF文の下に書いて、数字を変えるんでしょうね?
それとも一律何か数字を乗じる?
どちらにしても、XPでのテストが必要ですね。
ああ、面倒だ・・・。
はじめまして。横から失礼します。私も以前苦しめられた話ですので^^;

Windows XP での全角固定ピッチフォントの仕様変更
http://www.microsoft.com/japan/msdn/windows/windowsxp/FixedPitchFont.asp

おそらく、この現象のせいだと思います。
 一応解決方法は記載されているのですが、これを設定(レジストリを改変)するとそのOS上の全てのアプリケーションが
影響を受けてしまいます。

 私はこれを設定するツールを自作して、ユーザがどちらを使うか選んでもらうようにしてお茶を濁しました(^^ゞ

 よって、もしかしたら別のアプリケーションでは影響が出てしまう可能性があります。しかもXP限定の対応なので、
今後もこの設定が有効という保障はありません。ただ、現時点では影響が出るという話は耳にしていません。

 今後は、等幅ピッチフォントを使用する場合は3の倍数のフォントサイズで設定するか、XPでもフォントの幅が
はみ出ないようにコントロールのサイズを余裕を持って確保するか、プロポーショナルフォントを使うかになると思います。

あ、ちなみにEXCELの件については私もわかりませんm(__)m
(以前(VB6)ではOLEオートメーションで制御していましたが、.NETだと・・・?)
>  エクセルのバージョンを意識することなく、コーディングにするには、どのように記述すれば良いのでしょうか?

遅延バインディングを使うということになると思います。

302902 - [HOWTO] Visual C# .NET で Office オートメーション サーバーをバインドする方法
http://support.microsoft.com/default.aspx?scid=kb;JA;302902
■No5255に返信(Shinoさんの記事)
>>OSのせいです。OSの違いで等幅フォントの全角文字の幅が変わります。
>>XPの方は、「半角2桁」==「全角1桁」なのですが、
>>2000では、「半角2桁」!=「全角1桁」のようです。
>>これは、TextBoxでも起こります。ただしLabelコントロールでは起きません。
>>色々考えて以下を試しました。
>>
>>・XPStyleファイルを自作してごまかしてみる。
>>・XP視覚スタイルを無効にしてかつ、クラシック表示にする。
>>
>>結果はやはりダメでした。XP視覚スタイルのせいだと思ったのですが、
>>これは完全にOS側が、等幅フォントの全角文字の幅を変えているせいかと。
>>なので、私はOSのバージョンを見て、勝手に微調整をかます関数を実装してます。
>
> ちなみにユーザーは2000とXPで、たまたまXPでデモしたので、上記の現象に気づきました。デモ時は、「あれれ?」と内心あせっていました・・・。

私は、Javaの案件の時に・・・「えええ〜っ!?」って思いました。
その時は、動作推奨環境にXPと明記していなかったので助かったのですが、
お客さんは画面にうるさいので、かなり心臓に悪かったです。

> で、OSを判断してサイズを変えなくちゃならなそうですね。ショック・・・。
> どこかで、OSを判断するコードは見たことあります。

わたしはWinNTを除くNT系で、2000ProでなければXP以降として処理してます。
何かもっと確実な方法があれば、誰かご教授ください。

  Dim Os As System.OperatingSystem

Os = System.Environment.OSVersion

  If Os.Platform = PlatformID.Win32NT Then
    If Os.Version.Major = 5
      If Os.Version.Minor <> 0 Then
        〜 処理 〜
      End If
    End If
  End If
■No5233に返信(Shinoさんの記事)

> 長い題名は...となりました。

 未検証ですが、 LVM_SETCOLUMNWIDTH を( LVSCW_AUTOSIZE で) SendMessage することで
表示幅の問題はクリアされないでしょうか?

LVM_SETCOLUMNWIDTH Message
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/scrollbars/scrollbars.asp
こんばんは。
ずいぶん前に投稿したのですが、自社にエクセル2003があるところが少なくて、
あまりテストが実際出来ないので、ユーザーのところでテスト待ちの状態でした。


もう一度書きますと、プロジェクト→参照の追加→COMタグで、
Microsoft Excel 10.0 Object Libraly を選択→OK でBinフォルダに、
Interop.Excel.dll と Interop.Microsoft.Office.Core.dll と
Interop.VBIDE.dll が出来ます。
で、このdllをユーザーのPCに持って行ってありませんでした・・・。ただ、Excell.dll
だけ入れれば印刷出来ました。3つ入れておかないとまずいでしょうか?
質問する以前の問題だったような・・・?でも一応、解決状態ではあります。

また、OSの違いによる、ListviewのHeaderですが、プロポーショナルフォント
で、幅も余裕があるのにした・・・という簡単な解決方法です。

お返事遅れて申し訳ございませんでした。
2件とも、解決とさせて頂きます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板