2009年07月06日

セルの書式設定

関連記事:日付書式の場合はそのまま、日付書式以外は YYYY/MM/DD を設定

セルを「文字」書式にする場合、VBA ならば

    Range("A1").NumberFormat = "@"

とするだけで済みます。


OOo.Calc のセルオブジェクトにも、同じ名前の NumberFormat プロパティ
があります。そして、セルの書式設定ダイアログを見ると「テキスト」書式は
同じく "@" の文字で表現されています。そこで、同じように

    oCell.NumberFormat = "@"

としてみますが、書式は「テキスト」にはなりません。

実は、OOo.Calc/Basic では、NumberFormat プロパティの値が『書式』
の文字列そのものではなく、「書式」リストのインデックス番号となっています。


つまり、「テキスト」書式にするには、
  (1) 【テキスト書式のインデックス番号】を調べる
  (2) 得られたインデックス番号を NumberFormat プロパティに設定する
という手順を踏む必要があります。

それで、肝心の「テキスト書式のインデックス番号」を調べる方法ですが、下記の
ようなコードで行ないます。

Dim oNumberFormats As Object
Dim oLocale As New com.sun.star.lang.Locale
Dim lngKeyText As Long

  oNumberFormats = ThisComponent.NumberFormats()
  lngKeyText = oNumberFormats.getStandardFormat _
               (com.sun.star.util.NumberFormat.TEXT, oLocale)

  oCell.NumberFormat = lngKeyText
oLocal は『国/言語』を設定するパラメータですが、標準書式ならば何も
設定する必要はありません(言語設定が”標準”となります)。

標準書式以外で登録されている、例えば「 #,##0 」の書式インデックス
番号を調べる方法は下記サイトで紹介されています。
    [ OOoBasic > Calc > numberformats セルの数書式設定 ]


しかし、たかが「テキスト」書式にする為に毎回こんな事を行なってはいられ
ませんので、以下の関数を用意しました。
(2009/7/11 標準書式以外のサポートを追加)

'==============[ GetKeyNumberFormat ]========
' "YYYY年MM月DD日" 等では [argLocaleJP=True] を指定する

Global Function GetKeyNumberFormat(ByVal argFormat As String, _
Optional ByVal argLocaleJP As Boolean) As Long
Dim oNumberFormats As Object
Dim oLocale As New com.sun.star.lang.Locale
Dim lngType As Long
Dim lngKey As Long

If IsMissing(argLocaleJP) Then
'Nothing(Standard)
Else
If argLocaleJP Then
oLocale.Language = "ja"
oLocale.Country = "JP"
Else
'Nothing(Standard)
End If
End If

oNumberFormats = ThisComponent.NumberFormats()

Select Case UCase(argFormat)
Case "ALL" : lngType = com.sun.star.util.NumberFormat.ALL
Case "DEFINED" : lngType = com.sun.star.util.NumberFormat.DEFINED
Case "DATE" : lngType = com.sun.star.util.NumberFormat.DATE
Case "TIME" : lngType = com.sun.star.util.NumberFormat.TIME
Case "CURRENCY" : lngType = com.sun.star.util.NumberFormat.CURRENCY
Case "NUMBER" : lngType = com.sun.star.util.NumberFormat.NUMBER
Case "SCIENTIFIC" : lngType = com.sun.star.util.NumberFormat.SCIENTIFIC
Case "FRACTION" : lngType = com.sun.star.util.NumberFormat.FRACTION
Case "PERCENT" : lngType = com.sun.star.util.NumberFormat.PERCENT
Case "TEXT" : lngType = com.sun.star.util.NumberFormat.TEXT
Case "DATETIME" : lngType = com.sun.star.util.NumberFormat.DATETIME
Case "LOGICAL" : lngType = com.sun.star.util.NumberFormat.LOGICAL
Case Else : lngType = -1
End Select

If (lngType <> -1) Then
GetKeyNumberFormat = oNumberFormats.getStandardFormat(lngType, oLocale)
Else
lngKey = oNumberFormats.queryKey( UCase(argFormat), oLocale, False )
If (lngKey <> -1) Then
GetKeyNumberFormat = lngKey
Else
GetKeyNumberFormat = oNumberFormats.addNew( UCase(argFormat), oLocale )
End If
End If
End Function

  oCell.NumberFormat = GetKeyNumberFormat("TEXT")
  oCell.NumberFormat = GetKeyNumberFormat("yyyy年mm月", True)




lngKey = oNumberFormats.queryKey( argFormat, oLocale, False )
If (lngKey <> -1) Then
  GetKeyNumberFormat = lngKey
Else
  GetKeyNumberFormat = oNumberFormats.addNew( argFormat, oLocale )
End If
[ 書式コードの追加 ] のコードは、このようになっているが、このままでは
エラーとなる場合がある為、上記関数では UCase を施してあります。

書式設定を確認すると判るように、書式文字は【大文字】で登録されています。

querykey は大文字/小文字を区別して検索( "yyyy/mm/dd" で検索す
ると -1 になりますが、実際には "YYYY/MM/DD" があります)しますが、
addNew が小文字を大文字変換して処理( "yyyy/mm/dd" で追加する
と登録済みでエラーになります)する為にエラーとなります。これを回避する
為に、UCase で大文字に統一して処理しています。



お役に立ちましたら拍手して貰えると嬉しいです

addinbox at 15:08コメント(0)ブック・シート・セル | マクロ・関数 

コメントする

名前
 
  絵文字
 
 
記事検索
プロフィール

角田(つのだ)




  • ライブドアブログ