読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

OOo CalcのBasicマクロで,「値のある最後の行や列」を取得する方法。Excel VBAのEnd(xlDown), End(xlToRight)と同じ目的のサンプルコード

OpenOffice Basic OpenOffice.org calc サンプルコード

Excel/Wordオフィス製品のTipsまとめへ


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の値がデータの行数です。


Excel/Wordオフィス製品のTipsまとめへ