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