![]() 2008.06.02 Monday
2. 値の入っているセルの行数を調べる
データが何行あるのか知りたいとき、Excel(VBA)ではEndプロパティやCurrentRegionプロパティを使っていると思います。Calc(OOoBasic)にはこれらのプロパティが用意されていないので、別の方法を使います。
* * * ■例1<データが一まとめになっている場合> 例えばこんなシートがあったとします。 (左の数字は行番号、右の文字列はA列の内容) 1 北海道 2 青森 3 岩手 4 秋田 5 宮城 6 山形 7 福島 8 9 ・ (8行目以下は空) ・ ・ 65536 ここで、最後のデータ "福島" が入っているA7セルを得るには、VBAだと Range("A65536").End(xlUp) でできました。そして、 Range("A65536").End(xlUp).Row で得られる行番号(7)がデータの行数になります。 では、OOoBasicで行数を知るためのコードを書いてみます。 (oSheetは該当シートのシートオブジェクト) oColumn = oSheet.getColumns().getByIndex(0) oRanges = oColumn.queryContentCells(31) nRangeCount = oRanges.getCount() If nRangeCount = 0 Then nRowCount = 0 Else oRange = oRanges.getByIndex(0) nRowCount = oRange.getRows().getCount() End If queryContentCellsというメソッドを使って、A列の全セルの中で値の入っている領域を調べ、その行数を取得しています。変数nRowCountの値がデータの行数です。 それでは、各行で何をやっているのか順に説明していきます。 まず、oSheet.getColumns().getByIndex(0)でシートのA列全体を取得し、その列オブジェクトに対してqueryContentCellsメソッド(引数の数字については下の補足を参照)を実行します。このメソッドは、対象セルの中から値の入っているセル範囲を探して返します。その戻り値は、「値の入っている一続きのセル範囲」を1つの領域として、それらの領域のコレクション(集合)になっています。この戻り値をoRangesに代入します。 上の例だと、1行目の"北海道"から7行目の"福島"まで一続きになっていて、それより下には値が入っていません。ですからqueryContentCellsメソッドは要素数1の集合を返し、その要素はセル範囲「A1:A7」になっているわけです。 次に、oRanges.getCount()で要素数を調べます。 要素数が0ならA列はすべて空なので、データの行数nRowCountは0とします。 要素があったらoRanges.getByIndex(0)で1番目の要素(この例ではデータは一まとめになっているという前提なので唯一の要素)にアクセスし、その要素、つまりセル範囲をoRangeに代入します。最後に、oRange.getRows().getCount()で行数を取得してnRowCountに代入します。 ※oRangesとoRangeの違いに注意してください。queryContentCellsメソッドの戻り値を代入するoRangesはセル範囲の集合です。一方oRangeはoRangesの中の個々のセル範囲です。 ■例2<データが飛び飛びになっている場合> 今度はデータの間に空行が入っている例です。 (左の数字は行番号、右の文字列はA列の内容) 1 北海道 2 3 青森 4 岩手 5 秋田 6 7 宮城 8 山形 9 福島 10 11 ・ (10行目以下は空) ・ ・ 65536 この例の場合、「値の入っている一続きのセル範囲」が3つあるので、queryContentCellsメソッドは要素数3の集合を返します。要素となっているセル範囲は、"北海道"の「A1」、"青森" "岩手" "秋田"の「A3:A5」、"宮城" "山形" "福島"の「A7:A9」、以上の3つです。 そこで、データの合計行数を知るにはこんなコードが考えられます。 oColumn = oSheet.getColumns().getByIndex(0) oRanges = oColumn.queryContentCells(31) nRangeCount = oRanges.getCount() nRowCount = 0 For i = 0 To nRangeCount - 1 oRange = oRanges.getByIndex(i) nRowCount = nRowCount + oRange.getRows().getCount() Next oRangesの要素となっている各セル範囲oRangeの行数をカウントしていくという方法です。これでデータの行数7が得られます。 では続いて、データの行数ではなく一番下の "福島" が入っているセルの行番号が知りたい、という場合のコード例を挙げます。 oColumn = oSheet.getColumns().getByIndex(0) oRanges = oColumn.queryContentCells(31) nRangeCount = oRanges.getCount() If nRangeCount = 0 Then nBottomRow = -1 Else oRange = oRanges.getByIndex(nRangeCount - 1) nBottomRow = oRange.getRangeAddress().EndRow End If まず要素数が0、つまりデータが1行もないときは、最終の行番号を表す変数nBottomRowを-1と答えるようにしました。この仕様はあくまで一例です。 次に、要素があったときです。ここでoRanges.getByIndex(nRangeCount - 1)とすることで、oRangesの最後の要素、つまり一番下にある「値の入っている一続きのセル範囲」(この場合「A7:A9」)が得られます。そのセル範囲の最終行を調べれば、それが知りたかった行番号、というわけです。OOoBasicでは行番号や列番号は0から始まるので、この例の場合は最終の行番号として8が得られます。 * * * ※補足 ・queryContentCellsメソッドの引数の数字 queryContentCells(31)の31などの数字は、clearContents(31)のものと同じで、どういうセルを該当させるかを指定するための引数です。今回紹介したコードでは、実質的な内容を持つセルを指定するために以下の1〜16を合計した31という数字を使いました。 1:数値 2:日付と時刻 4:文字列 8:コメント 16:数式 32:セルに直接設定された書式 64:スタイルによる書式(間接書式) 128:図形描画オブジェクト 256:セル内の一部の文字列に設定された書式 注)queryContentCellsメソッドでは32以上の指定がうまくいきません。また、clearContentsメソッドでは64が32と変わらないのですが、2つ合わせた96だと正しく機能してくれます。 文責:磯部 このブログは神楽坂の校正・校閲プロダクション鴎来堂(おうらいどう)が運営しています URL:http://www.ouraidou.net/ 鴎来堂では校正者を募集しています [1]在宅校正者:一般書籍(文芸・実用)の校正・校閲・原稿整理 [2]派遣校正者:都内出版社・印刷所への出張校正 [3] [4] [5]DTPオペレータ:在宅、内勤問わず 募集フォームよりお申し込みください ※[3][4]は定員に達した為、現在募集を見合わせております URL:http://www.ouraidou.net/form.htm/ ![]() |