OpenOffice.org/LibreOffice CalcでPosition形式からName形式への変換


OpenOffice.org/LibreOfficeのマクロで近くのセルを参照する計算式をセルに記入しようとしてはたと困った。

Position形式( (3,4)のような座標形式 )でセルを指定して数値や文字列を記入しているが数式には名前形式( B9とかAZ32とか )で式を表してセルに記入しないといけない。

どうやってPosition形式からName形式に変換したらいいんだろうか。

いろいろ探したけど見つけられなかったので泣く泣く作った関数がこれ。

Function Fn_GetCellPos2Name( ByVal iCol As Long,  ByVal iRow As Long ) As String
    Dim str As String : str = ""
    Dim i As Long
    Dim a As Long
    Dim t As Long
    Const ciAlpha As Long = 26       'Alphabetの個数
    Const ciChrA As Long = 65       'A
    Const ciChrPreA As Long = 64  'Aの1つ前
    
    t = iCol
    'Dim iKeta As Long : iKeta = CLng( Log( t ) / Log(26)  + 0.5 )  ' 0-25までは1, 26-   ' 26進数かと思っていたけど、実は違う。26,27,27,27...
    Dim iKeta As Long : iKeta = 1
    Do While t>0 
        If iKeta = 1 Then
            t = Int( t / ciAlpha )
        Else
            t = Int( t / (ciAlpha+1) )
        EndIf
        If t > 0 Then
            iKeta = iKeta + 1
        EndIf
    Loop
    t = iCol
    For i=iKeta To 1 Step -1
        Select Case i
            Case 1
                str = str & CHR( ciChrA + t mod ciAlpha )
            Case 2
                If Int( t/ciAlpha ) = 0 Then
                    str = str & ""
                Else
                    str = str & CHR( ciChrA + Int( (t-ciAlpha) /  ciAlpha )  mod ciAlpha )
                EndIf
            Case 3 to 9999
                If Int(t/ciAlpha / (ciAlpha+1)^(i-2) ) = 0 Then
                    str = str & ""
                Else
                    str = str & CHR( ciChrPreA + Int( (t-ciAlpha) /ciAlpha / (ciAlpha) ^ (i-2) ) mod ciAlpha )
                EndIf
            Case Else
                Msgbox "Fn_GetCellPos2Name()で異常発生。桁=[" & i & "]"   
        End Select
    
    Next i
    
    Fn_GetCellPos2Name = str & (iRow + 1)
    Exit Function

End Function  ' Fn_GetCellPos2Name

ほぼ骨格ができたときに出先でふと思い立って検索してみたら、ドンピシャではないけどカラムのpositionをnameに変換する手順を見つけてしまった。

それを使って関数を作りなおしても良かったんだけど、変換にはSheetの情報をもらってセルを指定してから変換しないといけない感じだったので、それはそれであほらしく感じられて作りかけのを完成させることにした。

ちなみに見つけたのはこれ。

Function ColumnNumberToString(ByVal the_column As Long) As String
  oDoc = ThisComponent
  oSheet = oDoc.Sheets( 0)
  ColumnNumberToString = oNSheet.getcolumns().ElementNames( the_column)
End Function 

http://www.oooforum.org/forum/viewtopic.phtml?p=43221#43221

Function CalcColumnNumberToName( oSheet As com.sun.star.sheet.Spreadsheet,_
                     nColumnNumber As Long ) As String
   oColumns = oSheet.getColumns()
   oColumn = oColumns.getByIndex( nColumnNumber )
   cColumnName = oColumn.getName()
   CalcColumnNumberToName() = cColumnName
End Function

http://www.oooforum.org/forum/viewtopic.phtml?p=24878&sid=94d8bca5b333bf8b5ac2fa954f395132#24878

ちなみに、カラムは現在1023個までの制限があるようですが、今回作った関数はカラムの上限の1023まで余裕で扱えます。将来拡張されてもたぶん最後までいけるでしょう。拡張されてもなかなか1023をこえて表を作ることはないとは思いますがね。