none
sheet.get_Range を使用するために必要な前提事項について RRS feed

  • 質問

  • こんにちわ!
    お世話になります。

    アプリケーションから Excelファイルにデータを書き出しています。

    以前に書いたソースを参考に、うろ覚えのまま次のような記述をしました。

    sheet.get_Range(sheet.Cells[18, 1], sheet.Cells[50, 1]).RowHeight = 17.25;

    しかし、実行時に下記のメッセージが表示されてしまいます。

    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException はハンドルされませんでした。
      Message='object' に 'get_Range' の定義がありません


    何か、必要な手続きを忘れているのではないかと思い、前回のソースと
    見比べながら見直しているのですが、その違いが分からなくなってしまいました。

    非常に曖昧な質問で恐縮ですが、何かヒントを頂ければ嬉しいです。

    どうぞ、宜しくお願い致します。

    2011年6月3日 7:05

回答

  • ちょっと試してみたのですが Range プロパティだと問題なく動作しました。

    ws.Range[ws.Cells[1, 1], ws.Cells[1, 2]].RowHeight = 20;

     

    Excel VBA でも第一引数に Range オブジェクトを受け付けますね。

    なんだかよくわからないです。すみません。

     

    2011年6月3日 15:56
  • http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.worksheet.get_range.aspx

    上記のヘルプを見ると、引数に渡す値は「アプリケーションの言語で、A1 スタイルで表記した範囲の名前です。」と書かれているので井上さんが書かれた文字列形式で指定するのが正しいのではないかと思います。型が object なので分かりにくいですね・・・。(でも第2引数は Range も許容範囲な記載が見受けられたり)

    ※あと get_Range は推奨されていないみたいなので Range プロパティの使用をお勧めします。(最新版で確認したところでは Range プロパティは get_Range メソッドの名前違いで代用実装されていますが、今後はわかりませんので Range プロパティ使ったほうがいいですね)


    おのでら (http://sorceryforce.com/)
    2011年6月3日 15:15
  • Excel を操作するために何を使用しているかが重要ですね。参照設定に何を加えたとか。

    コードだけみれば、WorkSheet の Cells コレクションに対して、get_Cells() ではなくて Cells[] でアクセスできているなら、Range コレクションも get_Range ではなく Range[] でアクセスするものでしょう。どちらかのコレクションだけメソッドになっているのは不自然です。

     

    2011年6月3日 23:41

すべての返信

  • sheet 変数に Worksheet でない、何か別のオブジェクトが入ってるのでしょう。

    2011年6月3日 7:45
  • galaco さん、早速有り難うございます。

    ご指摘の件ですが、

    sheet.get_Range(sheet.Cells[18, 1], sheet.Cells[50, 1]).RowHeight = 17.25;

                                ↑:ここにマウスカーソルを当てると、(ローカル変数)Worksheet sheet と
                                   表示されるので、OKかと思うのですが・・・
                                   (意味を取り違えてますでしょうか?)
                        
                        
    ちなみに、その前方は次のようになっています。

    var excel = new Microsoft.Office.Interop.Excel.Application { DisplayAlerts = false };
    var books = excel.Workbooks;
    var book = books.Add(XlWBATemplate.xlWBATWorksheet);
    var sheets = book.Worksheets;

    var sheet = (Worksheet)sheets[1];

    sheet.get_Range(sheet.Cells[18, 1], sheet.Cells[50, 1]).RowHeight = 17.25;

    何か、良く理解していないため、根本的な所で間違っているのかも知れませんが・・・

    宜しくお願いします。

    2011年6月3日 8:24
  • おおつの井上さんこんばんは、おのでらです。

    原因はまだわからないですが、発生している例外が「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」とのことですのでおそらく dynamic 関連の例外かもしれません。
    ためしにコードを下のように変更して実行するとどうでしょうか。

    var sheet = (Worksheet)sheets[1];

    Worksheet sheet = (Worksheet)sheets[1];

    ※この内容は解決案ではなく原因の把握のための確認です


    おのでら (http://sorceryforce.com/)
    2011年6月3日 12:19
  • おのでら さん、有難うございます。

    var を Worksheet に変更して試してみましたが、状況に変化はありませんでした。

    同じ環境で試してみて、以前書いたソースでは問題有りませんので、何か基本的な
    所で、大事な記述(宣言など)が足りないのではないかと思いますので、念のため、
    Excelファイルへの出力のために追加した参照設定などを記します。

    1.参照の追加で【Microsoft.Office.Interop.Excel】を追加
    2.ソースに【using Microsoft.Office.Interop.Excel;】を記述

    以上ですが、他に何か必要なものはありませんでしょうか?

    よろしくお願い致します。


    p.s.


    その後、あちこち見ながら次のような記述方法が目にとまったので試してみました。

     sheet.get_Range("A18", "A50").RowHeight = 17.25;

    すると、動作的には思った通りの動きをしました。
    何か、他に問題が生じるのかどうかは分かりませんが・・・・

    この記述方法の、「あり」と考えて宜しいのでしょうか?

    2011年6月3日 14:09
  • http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.worksheet.get_range.aspx

    上記のヘルプを見ると、引数に渡す値は「アプリケーションの言語で、A1 スタイルで表記した範囲の名前です。」と書かれているので井上さんが書かれた文字列形式で指定するのが正しいのではないかと思います。型が object なので分かりにくいですね・・・。(でも第2引数は Range も許容範囲な記載が見受けられたり)

    ※あと get_Range は推奨されていないみたいなので Range プロパティの使用をお勧めします。(最新版で確認したところでは Range プロパティは get_Range メソッドの名前違いで代用実装されていますが、今後はわかりませんので Range プロパティ使ったほうがいいですね)


    おのでら (http://sorceryforce.com/)
    2011年6月3日 15:15
  • ※あと get_Range は推奨されていないみたいなので Range プロパティの使用をお勧めします。(最新版で確認したところでは Range プロパティは get_Range メソッドの名前違いで代用実装されていますが、今後はわかりませんので Range プロパティ使ったほうがいいですね)

    引数付きプロパティの呼び出しは C#4.0 から可能になったはずなので、それ以前であれば get_Range を使わなければなりませんね。
    2011年6月3日 15:32
  • ちょっと試してみたのですが Range プロパティだと問題なく動作しました。

    ws.Range[ws.Cells[1, 1], ws.Cells[1, 2]].RowHeight = 20;

     

    Excel VBA でも第一引数に Range オブジェクトを受け付けますね。

    なんだかよくわからないです。すみません。

     

    2011年6月3日 15:56
  • Excel を操作するために何を使用しているかが重要ですね。参照設定に何を加えたとか。

    コードだけみれば、WorkSheet の Cells コレクションに対して、get_Cells() ではなくて Cells[] でアクセスできているなら、Range コレクションも get_Range ではなく Range[] でアクセスするものでしょう。どちらかのコレクションだけメソッドになっているのは不自然です。

     

    2011年6月3日 23:41
  • おのでら さん、お世話になっています。

    色々と、ありがとうございました。
    結論として、Range プロパティ使ってまとめるのが良いようですね。
    思った通り、旨く動作するのが確認されました。

    もっとも以前に書いたソースが、無理矢理っぽい不自然な書き方でも
    エラーにならず動いていたのが不可解ですが、この際そちらの方も
    修正しておく事にします。

     

    galaco さん、ありがとうございました。

    動作を確かめて頂き、有難うございました。
    記述方法も参考になり、助かりました。

     

    K. Takaoka さん、アドバイスありがとうございました。

    あちこちサンプルを見ながら猿まねで書いていたら、こんな形になって
    しまいました。

    今回、皆様とやり取りさせていただいたお陰で、仰っている意味が大分
    理解できるようになってきました。


    このスレッドは、これを持ってクローズさせて頂きます。
    みなさん、今後ともどうぞよろしくお願い致します。

    2011年6月4日 6:50