Top > OOoBasic > Calc > address
*セルのアドレス [#r0c606a8]

セルのアドレスにはいくつかのあらわし方があります。それをマクロで取り扱ってみます。

#contents

**文字列 [#bae4b587]
ユーザーに分かりやすい文字列としてアドレスを取得してみます。これには、com.sun.star.sheet.SheetCellRange サービスを使用します。

 Sub celladdresses_1
 Dim oSelection As Object, oCellRangeAddress As Object
   oSelection = ThisComponent.CurrentController.Selection
   oCellRangeAddress = ThisComponent.createInstance( _
   "com.sun.star.sheet.SheetCellRanges" )
   oCellRangeAddress.insertByName( "", oSelection )
   MsgBox oCellRangeAddress.getRangeAddressesAsString()
 End Sub

上のコードは選択範囲のアドレスを "A1:B3" のような文字列で表示します。ダイアログなどに範囲を表示する際などには便利です。

*** アドレス変換 [#na4b434d]
3.2 付近からはセルのインデックスから文字列でのアドレスへ変換するサービスがあります。

 Sub CellAddressConversion
  oAddrConv = ThisComponent.createInstance("com.sun.star.table.CellAddressConversion")
  
  aAddr = CreateUnoStruct("com.sun.star.table.CellAddress")
  aAddr.Row = 5
  
  oAddrConv.Address = aAddr
  
  msgbox oAddrConv.PersistentRepresentation
  msgbox oAddrConv.UserInterfaceRepresentation
 End Sub

以下はセル範囲用。
 Sub CellRangeAddressConversion
  oRangeAddrConv = ThisComponent.createInstance("com.sun.star.table.CellRangeAddressConversion")
  
  aAddr = CreateUnoStruct("com.sun.star.table.CellRangeAddress")
  aAddr.StartRow = 5
  aAddr.EndRow = 7
  
  oRangeAddrConv.Address = aAddr
  
  msgbox oRangeAddrConv.PersistentRepresentation
  msgbox oRangeAddrConv.UserInterfaceRepresentation
 End Sub
**インデックス [#ga0b594f]
セルの持つプロパティーに ''CellAddress'' があります。これはセルのアドレスを struct として取得します。取得する struct は .table.CellAddress です。また,これはインデックスとして "0" を基準として取得します。

 Sub celladdresses_2
 Dim oCell As Object
   oCell = ThisComponent.Sheets(0).getCellRangeByName( "A1" )
   With oCell.CellAddress
     MsgBox "Sheet: " & .Sheet & Chr(10) & _
     "Column: " & .Column & Chr(10) & _
     "Row:" & .Row
   End With
 End Sub

この struct の element は ''Sheet'', ''Column'', ''Row'' の三つです。

セル範囲では ''RangeAddress'' があります。これはシートオブジェクトでも使用できます。取得する struct は .table.RangeAddress です。

 Sub celladdresses_3
 Dim oCell As Object
   oCell = ThisComponent.Sheets(0).getCellRangeByPosition( 0, 0, 0, 4 )
   With oCell.RangeAddress
     MsgBox "Sheet: " & .Sheet & Chr(10) & _
     "StartColumn: " & .StartColumn & Chr(10) & _
     "StartRow:" & .StartRow & Chr(10) & _
     "EndColumn: " & .EndColumn & Chr(10) & _
     "EndRow: " & .EndRow
   End With
 End Sub

この struct の element は ''Sheet'', ''StartColumn'', ''StartRow'', ''EndColumn'', ''EndRow'' の五つです。

** 列インデックスから列指定形式 [#a8bbfad9]
列のインデックスからアルファベットの列形式を生成します。シート名が不要なときなどに利用できます。

 Function ConvertToColumn(nColumn As Long) As String
  nCol = nColumn
  nMod = nCol mod 26
  sAddr = chr(65 + nMod)
  nCol = (nCol - nMod) / 26
  While nCol > 26
    nMod = nCol mod 26
    sAddr = chr(65 + nMod - 1) & sAddr
    nCol = (nCol - nMod) / 26
  WEnd
  If nCol >= 1 Then sAddr = chr(65 + nCol - 1) & sAddr
  
  ConvertToColumn = sAddr
 End Function

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes