引き続きWxcelがらみの質問です。
Serbverコンポーネントを使って、ワークシートを開き,任意のシートを選択するところまではできました。選んだシートの最大有効行数は得られるでしょうか? もちろんまだ入力されていないセルにはヌルが書き込まれています。こういうプロパティはないのでしょうか。やはりぎりぎりループを回して調べるしかないのでしょうか?
ExcelWorkSheet1.UsedRange.Rows.Count
Serverコンポーネント
ExcelApplication
ExcelWorkBook
ExcelWorkSheet
上記の3つはExcelでの
Applicationオブジェクト
WorkBookオブジェクト
WorkSheetオブジェクト
とほぼ同等のプロパティやメソッドを持っていますので参考にしてください。
またやりたい作業をマクロ登録を行い,そのソースを解読するという手段もなかなか使えると思います。
(私はほぼこの方法)
> またやりたい作業をマクロ登録を行い,そのソースを解読するという手段もなかなか使えると思います。
これもトライしてみようと思っています。
> ExcelWorkSheet1.UsedRange.Rows.Count
コンパイルエラーになってしまいました。「'['が必要な場所に'.'があります。キャレットはRowsの前にあります。
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));
これでどうでしょうか?
※接続方法が私と違ったのでエラーでてました。すいません。
> ExcelApplication1.Connect;
> LCID := GetUserDefaultLCID;
LCIDの後ろにキャレットが出て、「'('が必要な場所に':='があります。」となってコンパイルが通りませんでした。
っと変数宣言部に以下をたしてください。
var
lcid: Windows.LCID;
何度も済みません。紹介いただいたやり方は、この後やってみます。
で,今苦し紛れにこんなコードを書いてみました。
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']となるはずですから、エラーになる理由がわかりません。これが動作しないとこの後の作業ができないので、困っています。
たびたび済みません。LCIDを使った方法はうまく行きましたが、値がまだ書き込まれていない行にもあらかじめ計算式が入っており、そのためにUsedRangeでは正しく未入力の行が見つけられない事がわかりました。ですので,セルAn,Anが空の行を見つけるしかないようです。先の苦し紛れのコードですが、Value <> nullとしたらループは回るようになりましたが、さいごでやはり「バリアントに対する演算が正しくありません」というエラーになってしまいました。
by COLOR
…わかりたくて もがくほど ココロやせて とがってく♪…
「ヘルプ」観たこと無いの? ⇒バリアントサポートルーチン
解りました! nullとEmptyは別物なんですね。ありがとうございました。
一応解決したコードを書いておきます。
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のワークシートの記入済みの行数が数えられました。みなさんいろいろありがとうございました。
ツイート | ![]() |