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をこえて表を作ることはないとは思いますがね。