ワークシートの有効行数を得るには

解決


komin  2007-05-29 09:14:11  No: 26313  IP: 192.*.*.*

引き続きWxcelがらみの質問です。
Serbverコンポーネントを使って、ワークシートを開き,任意のシートを選択するところまではできました。選んだシートの最大有効行数は得られるでしょうか?  もちろんまだ入力されていないセルにはヌルが書き込まれています。こういうプロパティはないのでしょうか。やはりぎりぎりループを回して調べるしかないのでしょうか?

編集 削除
Ru  2007-05-29 11:00:12  No: 26314  IP: 192.*.*.*

ExcelWorkSheet1.UsedRange.Rows.Count

Serverコンポーネント
  ExcelApplication
  ExcelWorkBook
  ExcelWorkSheet

上記の3つはExcelでの
  Applicationオブジェクト
  WorkBookオブジェクト
  WorkSheetオブジェクト
とほぼ同等のプロパティやメソッドを持っていますので参考にしてください。

またやりたい作業をマクロ登録を行い,そのソースを解読するという手段もなかなか使えると思います。
(私はほぼこの方法)

編集 削除
komin  2007-05-29 11:16:24  No: 26315  IP: 192.*.*.*

> またやりたい作業をマクロ登録を行い,そのソースを解読するという手段もなかなか使えると思います。

  これもトライしてみようと思っています。

> ExcelWorkSheet1.UsedRange.Rows.Count

  コンパイルエラーになってしまいました。「'['が必要な場所に'.'があります。キャレットはRowsの前にあります。

編集 削除
Ru  2007-05-29 12:53:55  No: 26316  IP: 192.*.*.*

ExcelApplication1.Connect;

    LCID := GetUserDefaultLCID;
//又はこっち?          LCID := LOCALE_USER_DEFAULT;

    ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Open(
                             ファイル名,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             EmptyParam,
                             LCID) as _Workbook);

    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.activesheet as _Worksheet);

    ShowMessage(IntToStr( ExcelWorksheet1.UsedRange[lcid].Rows.Count));

これでどうでしょうか?
※接続方法が私と違ったのでエラーでてました。すいません。

編集 削除
komin  2007-05-29 13:18:30  No: 26317  IP: 192.*.*.*

>    ExcelApplication1.Connect;
>    LCID := GetUserDefaultLCID;

  LCIDの後ろにキャレットが出て、「'('が必要な場所に':='があります。」となってコンパイルが通りませんでした。

編集 削除
Ru  2007-05-29 13:42:08  No: 26318  IP: 192.*.*.*

っと変数宣言部に以下をたしてください。

var
  lcid: Windows.LCID;

編集 削除
komin  2007-05-29 14:16:35  No: 26319  IP: 192.*.*.*

何度も済みません。紹介いただいたやり方は、この後やってみます。
で,今苦し紛れにこんなコードを書いてみました。

          i := 1;
          c := 'A' + IntToStr(i);
          while ExcelWorkSheet1.Range[c,c].Value <> '' do begin
            inc(i);
            c := 'A' + IntToStr(i);
          end;

  これを実行すると1回目のループは問題ないのですが。2回目でC='A2'となった時点で「罵詈アントの型変換が正しくありません」となってしまいます。Range['A2','A2']となるはずですから、エラーになる理由がわかりません。これが動作しないとこの後の作業ができないので、困っています。

編集 削除
komin  2007-05-29 14:39:45  No: 26320  IP: 192.*.*.*

たびたび済みません。LCIDを使った方法はうまく行きましたが、値がまだ書き込まれていない行にもあらかじめ計算式が入っており、そのためにUsedRangeでは正しく未入力の行が見つけられない事がわかりました。ですので,セルAn,Anが空の行を見つけるしかないようです。先の苦し紛れのコードですが、Value <> nullとしたらループは回るようになりましたが、さいごでやはり「バリアントに対する演算が正しくありません」というエラーになってしまいました。

編集 削除
Why?  2007-05-29 15:07:10  No: 26321  IP: 192.*.*.*

by COLOR

 …わかりたくて もがくほど ココロやせて とがってく♪…

「ヘルプ」観たこと無いの? ⇒バリアントサポートルーチン

編集 削除
komin  2007-05-29 15:42:14  No: 26322  IP: 192.*.*.*

解りました!  nullとEmptyは別物なんですね。ありがとうございました。

編集 削除
komin  2007-05-29 15:51:26  No: 26323  IP: 192.*.*.*

一応解決したコードを書いておきます。

          i := 1;
          while not VarIsEmpty(ExcelWorkSheet1.Range['A'+IntToStr(i),'A'+IntToStr(i)].Value) do begin
            inc(i);
            Form1.Update;
            StatusBar1.SimpleText := '解析中…' + IntToSTr(i);
          end;
          dec(i);

  これでExcelのワークシートの記入済みの行数が数えられました。みなさんいろいろありがとうございました。

編集 削除