OOo CalcのBasicマクロで,「値のある最後の行や列」を取得する方法。Excel VBAのEnd(xlDown), End(xlToRight)と同じ目的のサンプルコード
Excel VBAでいう End(xlDown) ・ End(xlToRight) を,
OpenOffice.org CalcのBasicマクロで実現した。
再利用可能なコードを下記に示す。
' シート上の「データが存在する一番下」や「一番右」を ' 取得するサンプル Sub hoge ' 0番目のシート上で,様々な列内で最後の行番号を求める msgbox EndXlDownInSheet( 0, 0 ) msgbox EndXlDownInSheet( 0, 1 ) msgbox EndXlDownInSheet( 0, 2 ) msgbox EndXlDownInSheet( 0, 4 ) ' 0番目のシート上で,様々な行内で最後の列番号を求める msgbox EndXlToRightInSheet( 0, 0 ) msgbox EndXlToRightInSheet( 0, 2 ) msgbox EndXlToRightInSheet( 0, 6 ) End Sub ' あるシート内で,ある列の中に最後にデータが存在する行番号を0始まりで返す。 ' Excel VBAの End(xlDown) のパクリ。 ' 引数のシート番号と列番号は0始まりで指定すること。 Function EndXlDownInSheet( sheet_index, column_index ) ' シート oSheet = ThisComponent.Sheets( sheet_index ) ' シート内の特定の列 oColumn = oSheet.getColumns().getByIndex(column_index) ' セル検索用の定数 magic_number = 31 ' 列内から,「値の入っている一続きのセル範囲」を複数取得 oRanges = oColumn.queryContentCells(magic_number) ' ひとつながりの領域がいくつあるか nRangeCount = oRanges.getCount() ' 一つながりの領域が1つもなかったら If nRangeCount = 0 Then ' どこにもデータはない nBottomRow = -1 Else ' 最後に現れる一つながりの領域 oRange = oRanges.getByIndex(nRangeCount - 1) ' その領域内で,データが入っている最終行の番号 (0始まり) nBottomRow = oRange.getRangeAddress().EndRow End If ' 返却値 EndXlDownInSheet = nBottomRow End Function ' あるシート内で,ある行の中に最後にデータが存在する列番号を0始まりで返す。 ' Excel VBAの End(xlToRight) のパクリ。 ' 引数のシート番号と行番号は0始まりで指定すること。 Function EndXlToRightInSheet( sheet_index, row_index ) ' シート oSheet = ThisComponent.Sheets( sheet_index ) ' シート内の特定の行 oRow = oSheet.getRows().getByIndex(row_index) ' セル検索用の定数 magic_number = 31 ' 行内から,「値の入っている一続きのセル範囲」を複数取得 oRanges = oRow.queryContentCells(magic_number) ' ひとつながりの領域がいくつあるか nRangeCount = oRanges.getCount() ' 一つながりの領域が1つもなかったら If nRangeCount = 0 Then ' どこにもデータはない nLastColumn = -1 Else ' 最後に現れる一つながりの領域 oRange = oRanges.getByIndex(nRangeCount - 1) ' その領域内で,データが入っている最終列の番号 (0始まり) nLastColumn = oRange.getRangeAddress().EndColumn End If ' 返却値 EndXlToRightInSheet = nLastColumn End Function
上記のサンプルで,シート内の「下端」や「右端」が取れる。
行番号・列番号ともに0始まりで返却されることに注意。
参考
Excel VBAの場合は,最初からメソッドが組み込まれている。
End(xlDown)で,Range内のデータが存在する最終行(一番下)を取得できるし,
End(xlToRight)で,Range内の最終列(一番右)を取得できる。
値が含まれる最後のセルの取得 - Rangeオブジェクトの取得 - Excel VBA入門
http://www.officepro.jp/excelvba/cell...
- 基準の位置となるRangeオブジェクトに対して「End」プロパティを使います。 Dim range1 As Range Set range1 = Range("A1").End(xlDown)
Excel VBAと同じメソッドがOpenOfficeに存在しないので,みな自前で作る必要がある。
AddinBox/VBAユーザーの為のOpenOffice.org 備忘録:End(xlUp).Row
http://blog.livedoor.jp/addinbox/arch...
- OOo.Calc/Basic には、そんな便利な機能は無いそうです。 無いものは作り込まなきゃいけない(泣)
AddinBox/VBAユーザーの為のOpenOffice.org 備忘録:VBA to Calc.Basic 移植ドキュメント
http://blog.livedoor.jp/addinbox/arch...
- End(xlUp) を代替するユーザー定義関数も掲載されていました
- 1セル1セルをチェックするループで作ってありましたので、[A65536] から End(xlUp) を実行したら、全然終わりませんね ┐('〜`;)┌
OpenOffice.org | 鴎来堂ブログ|校正・校閲の鴎来堂
http://blog.ouraidou.net/?cid=41942
- queryContentCellsというメソッドを使って、A列の全セルの中で値の入っている領域を調べ、その行数を取得しています。変数nRowCountの値がデータの行数です。