• 会社案内
  • 事業内容
  • 事業実績
  • ブログ・SNS
  • スタッフ募集
  • 校正学校
  • お問い合わせ
<< 梅雨 | main | スタイル >>
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]OCRオペレータ:電子書籍関連業務 校正、タグ修正など
[4]内勤(アルバイト):事務作業、ゲラ(校正刷り)配達等の手伝い
[5]DTPオペレータ:在宅、内勤問わず
募集フォームよりお申し込みください
※[3][4]は定員に達した為、現在募集を見合わせております
URL:http://www.ouraidou.net/form.htm/

| blog-ouraidou | OpenOffice.org | 11:13 | comments(0) | trackbacks(0) |









http://blog.ouraidou.net/trackback/829176
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< June 2019 >>
_