Top > OOoBasic > Tutorial > kakeibo > tutorial

家計簿チュートリアル OOo Basic 編 Edit

図のような OpenOffice.org Calc のファイルを作成することを通して,OpenOffice.org Basic に入門しましょう。

IDE Edit

まずは,チュートリアル用のファイルを作成しましょう。

OpenOffice.org を起動して,メニューの「ファイル」 - 「新規」 から「表計算」を選択して表計算ドキュメントを一つ新規作成してください。

そして,メニューの「ツール」 - 「マクロ」 - 「マクロ...」を選択します。

kakeibo_tuto_ide1.png

すると,こんなダイアログが開きます。

kakeibo_tuto_ide2.png

このダイアログは,マクロを実行したり,モジュールを作成したりするためのものです。

このダイアログで,左側に並んでいるのが「ライブラリ」と「モジュール」です。そして,その右側に並んでいるのがモジュール中のマクロです。

左側に並んでいる kakeibo_tuto_ide3.png のアイコンはドキュメントを示しています。そのすこし右側にあるアイコン kakeibo_tuto_ide4.png はライブラリです。また, kakeibo_tuto_ide5.png はモジュールです。

まず,左側にある「無題1」をみると,すこし右側に「Standard」ライブラリがあります。その「Standard」ライブラリをクリックしてください。

「Standard」ライブラリにモジュールを作成してチュートリアルを進めていくことにします。そこで,右側に並んでいるボタンの「新規作成」をクリックします。

「新規作成」のボタンをクリックすると,次のようなモジュールの名前を入力するダイアログが表示されます。

kakeibo_tuto_ide6.png

モジュール名は最初のままの「Module1」を使うことにして,そのまま「OK」ボタンをクリックします。名前を変更したいときには名前を入力してから「OK」ボタンをクリックします。

「OK」ボタンをクリックするとモジュールが作成されて,IDE のウィンドウが開きます。

kakeibo_tuto_ide7.png

この画面でチュートリアルのマクロを作成していきます。

定義 Edit

変数の定義部分です。

Sub kakeibo_tutorial
Dim oDoc As Object, oSheet As Object
Dim oRange As Object
Dim aHeader() As String
Dim oCell As Object
Dim i As Integer
Dim oBorderLine1 As New com.sun.star.table.BorderLine
Dim oBorderLine2 As New com.sun.star.table.BorderLine
Dim oBorderLine3 As New com.sun.star.table.BorderLine
Dim oTableBorder As New com.sun.star.table.TableBorder
Dim oColumn As Object
Dim oLocale As New com.sun.star.lang.Locale
Dim nKey As Long
Dim oNumberFormats As Object
Dim sFormat As String
Dim oStyleFamilies As Object
Dim oCellStyles As Object
Dim oSunStyle As Object, oSatStyle As Object, oNextMonth As Object
Dim aNewStyles(2) As Object
Dim sNewStyleName(2) As String
Dim oConditionalFormat As Object
Dim aCondition1(2) As New com.sun.star.beans.PropertyValue
Dim aCondition2(2) As New com.sun.star.beans.PropertyValue
Dim aCondition3(2) As New com.sun.star.beans.PropertyValue

この部分については補足/定義?で詳しく説明します。

ドキュメント Edit

OpenOffice.org Basic 上で最も重要といえるのがこの部分でしょう。ドキュメントにアクセスするときにいつかは通る道です。この部分については,どのドキュメントを使う場合でも同じです。Calc 以外に Writer ,Draw ,Impress でも同じようにします。

  oDoc = ThisComponent

変数の定義のところで定義した変数 oDoc にドキュメントオブジェクトを取得するコードです。

たったこの一行が OpenOffice.org Basic からドキュメントへアクセスすることが出来るようにします。

ドキュメントに関することはこのドキュメントオブジェクトにかかわりのあるオブジェクトからアクセスすることになります。

次の図に OpenOffice.org Calc ドキュメントの構造の概略図を示します。

doc_structure.png

よく表計算を使っている人は一目瞭然でしょう。ドキュメントには,さまざまなオブジェクトが属していますがその一つに「シートコンテナ」オブジェクトがあります。このシートコンテナオブジェクトには,ドキュメントにあるすべての「シート」オブジェクトがまとめられています。

それぞれのシートには「セル範囲」が属しています。そのセル範囲オブジェクトには「セル」があります。セル範囲は点線で描いてありますが,これはシートオブジェクトから直接にセルにもアクセスできることを示しています。

シートとセル Edit

ドキュメントオブジェクトを変数に取得して,ドキュメントにアクセスすることができるようになりました。つぎは,Calc ドキュメントの主要部分のシートとセルにアクセスします。

シート Edit

まずは,シートです。

Calc ドキュメントには普通はいくつかのシートがあります。それらのシートは,一つのオブジェクトにまとめられた形で管理されていて,そのなかに個別のシートオブジェクトがあります。

上の図で描かれているように,シートコンテナの下にシートそれぞれがあります。

その個々のシートは,名前とインデックスで管理されています。そのため,アクセスするときにもそれらを使って行います。

シートへアクセスするためにシートオブジェクトを取得しているのが次の部分です。

  oSheet = oDoc.getSheets().getByIndex(0)

このようにすることで,変数 oSheet にシートオブジェクトを取得しています。

詳しく説明すると,

oDoc.getSheets()

の部分で,シートコンテナオブジェクトへアクセスしています。ここでは,シートコンテナオブジェクトはもう必要ないので,わざわざ変数にオブジェクトを作成せずに使っています。シートコンテナからインデックスで特定のシートオブジェクトを取得するのが,

.getByIndex(0)

の部分です。この getByIndex メソッドの引数の "0" は,取得するシートオブジェクトのインデックスを指定しています。インデックスは 0 から始まり,順に 1, 2 ... とつづきます。Calc ドキュメントの下のシートタブに表示されている左から順にインデックスが振られています。ここでは,インデックス "0" のシートのオブジェクトを取得しています。シートタブの一番左側のシートに当たります。

これをつづけて使うことで,シートへアクセスしています。

セル Edit

つぎに,セルです。

セルは,ドキュメントの構造を示した図にあるように,シートに属しています。そこで,セルオブジェクトはシートオブジェクトからアクセス,取得します。

実は,セルといっても複数のセルを含んだ「セル範囲オブジェクト」と単一のセルのみの「セルオブジェクト」は正しくは別のものです。 これは,そのオブジェクトがもつインターフェースの違いから別のものといっているのですが,そのオブジェクトを取得するときにもすこしだけ違いがあります。

詳しく説明する前に,チュートリアルのコードを見てみます。

  oRange = oSheet.getCellRangeByName("A1:T50")

変数 oRange にセル範囲オブジェクトを取得しています。このセル範囲オブジェクトは範囲 "A1:T50" の範囲のものです。セル範囲オブジェクトは複数個のセルを含んだオブジェクトで,範囲ごとに別々のものです。

ここでは,シートオブジェクト oSheet からセル範囲オブジェクトを取得するために「名前」を使って行う getCellRangeByName メソッドを使っています。

「名前」というのは,セル範囲のアドレスを文字列で表す時の記述方法です。これは,ユーザーの見た目にも分かりやすい形式です。"A1:T50" や "A1" などです。

この getCellRangeByName メソッドはセルまたはセル範囲のアドレスを文字列として引数に取ります。戻されるのがそのセルまたはセル範囲のオブジェクトです。

プロパティー Edit

セル範囲のオブジェクトを取得しました。

オブジェクトというのは,プロパティーを持っています。この,プロパティーというのはそのものの色や大きさといった状態を示すものです。

たとえば,「セルの背景色」,「セルの枠線」,「セル内の文字」,「文字の色」,「フォント名」などさまざまです。他にもたくさんのプロパティーがありますが,その中から必要なものを設定することでオブジェクト思うように設定することができます。

背景色 Edit

セルの背景色はセル範囲オブジェクトのもつプロパティーのうちの CellBackColor プロパティーです。

oRange.CellBackColor = RGB(230,230,255) 'Blue gray

このようにして,セル範囲 oRange の CellBackColor プロパティーに背景色を設定します。このプロパティーは Long 型の整数を取りますが,色を数値で指定するのは結構難しいです。すこし簡単になるように,RGB 関数を使って与えた RGB 値に相当する Long 型の数値を取得して使用するといいでしょう。

セルの背景色を設定したら,次に進みます。

項目を用意しておきます。

aHeader() = Array( "収入", "住居費", "光熱費", "消耗品", _
     "教育費", "食費", "嗜好品", "教養娯楽", "衣服", _
     "交通費", "その他", "支出計", "残高" )
     
For i = 0 To 12
  oSheet.getCellByPosition( 4 + i, 2 ).String = aHeader(i)
Next i

まず,配列 aHeader() に項目を用意しておき,For 文を使って順にセルに項目を入力していきます。セルに入力するために使っているのが,String プロパティーです。

oSheet.getCellByPosition( 4 + i, 2 ).String = aHeader(i)

このようにして,セルの String プロパティーは文字列を設定できます。

セルの回転 Edit

つぎは,セルの回転です。回転させるセルをまずオブジェクトとして取得しておきます。

  oRange = oSheet.getCellRangeByPosition( 4, 2, 14, 2 ) 'Range "E3:O3"

そして,範囲 oRange を回転させるために RotateAngle プロパティーを使います。

  With oRange
    .RotateAngle = 4500
    .HoriJustify = com.sun.star.table.CellHoriJustify.CENTER
  End With

ここでは,With ステートメントを使って複数のことを行っていますが,回転の設定を行ったあとで横方向を中央ぞろへにしています。

まず,回転の RotateAngle プロパティーは回転させる角度を 1/100 度で指定します。ここでは,45 度回転させたいので,4500 と指定しています。

oRange.RotateAngle = 4500

としてもいいです。

横および縦方向のそろえ Edit

そして,次に横方向のそろへを行っています。

  With oRange
    .RotateAngle = 4500
    .HoriJustify = com.sun.star.table.CellHoriJustify.CENTER
  End With

の三行目の部分です。

oRange.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER

と同じことです。この HoriJustify プロパティーに設定できる値は enum と呼ばれる定義済みの値です。たとえば,enum の com.sun.star.table.CellHoriJustify には,STANDARD, LEFT, CENTER, RIGHT, BLOCK, REPEAT の値があります。このどれかを指定して横方向のそろへを指定します。中央ぞろへでは上記のように com.sun.star.table.CellHoriJustify.CENTER のようにします ("." ピリオドでつなげて書く)。書くときに気をつけたいのは,大文字と小文字を正しく書くことです。間違っていると動作しないときがあります。

この enum ですが,IDL Reference マニュアルをみなければ分かりません。IDL Reference マニュアルを用意しましょう (オンラインで見るのことも可)。

枠線 Edit

枠線を引きます。対応する部分はしたのとおりです。

  With oBorderLine1
    .Color = RGB(230, 230, 255)
    .OuterLineWidth = 2 '0.05 pt
  End With
  
  With oTableBorder
    .IsLeftLineValid = True
    .IsRightLineValid = True
    .IsVerticalLineValid = True
    .LeftLine = oBorderLine1
    .RightLine = oBorderLine1
    .VerticalLine = oBorderLine1
  End With

ここで,始めの With ステートメントと二つ目の With ステートメントを分けて説明します。

まず,初めの部分です。

  With oBorderLine1
    .Color = RGB(230, 230, 255)
    .OuterLineWidth = 2 '0.05 pt
  End With

この部分では,変数 oBorderLine1 を使用していますが,定義の仕方を見てみます。

Dim oBorderLine1 As New com.sun.star.table.BorderLine

という定義の仕方で変数 oBorderLine1 を定義しています。ここで,New キーワードを用いて com.sun.star.table.BorderLine struct として oBorderLine1 を定義しています。

struct というのは,構造体と呼ばれるものです。構造体はそのプロパティーを持っていて,性質があります。しかし,メソッドは持っていません,ここがオブジェクトとの違いです。それぞれの struct の情報は API Reference に記載されています。

複数ある BorderLine struct のプロパティーのうち,色を指定する Color と外側の線の幅を指定する OuterLineWidth をここでは使っています。

Color プロパティーは背景色と同じように指定します。

OuterLineWidth は線の幅を 1/100 mm 単位で指定します。たとえば,0.05 pt の太さの線の時には 2 を指定します。このプロパティーが 0 の時には線が引かれていないことを示します。また,Calc のダイアログで線を指定するときよりも柔軟に幅を指定することができます。

ここまでは,初めの部分について説明しましたが,この部分では使用する「線」を作成しました。この「線」を用意しておいてそれを設定することで実際に線を描くことになります。

それでは,後半部分です。ここでは,「線の引き方」を作成します。

  With oTableBorder
    .IsLeftLineValid = True
    .IsRightLineValid = True
    .IsVerticalLineValid = True
    .LeftLine = oBorderLine1
    .RightLine = oBorderLine1
    .VerticalLine = oBorderLine1
  End With

やはり,ここで登場する oTableBorder も struct として定義しています。

Dim oTableBorder As New com.sun.star.table.TableBorder

始めの三つのプロパティーの Is...LineValid プロパティーは ... の部分に線を描くかどうかを指定します。ここでは,左と右および内部の縦線を指定しています。

さらに,後ろの三つの ...Line プロパティーで ... の部分にどんな線を描くかを指定しています。前半部分で作成した線を描くので,上記のようになります。

枠線の引き方を作成したら,実際に枠線を描く部分に設定します。次の部分の二行目にあたります。

  With oSheet
    .getCellRangeByPosition( 4, 2, 14, 2 ).CharColor = RGB(230,230,255)
    .getCellRangeByPosition( 4, 2, 14, 2 ).TableBorder = oTableBorder
    .getCellByPosition( 4, 2 ).CellBackColor = RGB( 92, 133, 38 ) 'Green 2
    .getCellRangeByPosition( 5, 2, 14, 2 ).CellBackColor = _
        RGB( 0, 74, 74 ) 'Turquoise 8
    .getCellRangeByPosition( 15, 2, 16, 2 ).HoriJustify = _
        com.sun.star.table.CellHoriJustify.RIGHT
  End With

抽出すると,

.getCellRangeByPosition( 4, 2, 14, 2 ).TableBorder = oTableBorder

この部分です。枠線の引き方を設定するのは,TableBorder プロパティーです。そのプロパティーに,先ほど作成した oTableBorder 変数を設定します。

この部分のほかの行を見ていきます。

最初の行は,文字の色を指定します。 CharColor プロパティーです。

二行目は枠線です。

三行目および四行目は,セルの背景色を指定しています。これはすでに取り上げました。

最後の行では,セルの横方向のそろへを指定します。これもすでに取り上げました。

セルの幅 Edit

セルの幅を指定しておきます。まず,列オブジェクトを取得します。使用するのは,getColumns メソッドです。

  oColumn = oSheet.getCellRangeByPosition(0,0,1,0).getColumns()
  oColumn.Width = 1000

二行目で実際に幅を指定しています。列オブジェクトである oColumn の Width プロパティーを使います。このプロパティーは 1/100 mm 単位で幅を設定します。

数書式設定 Edit

次は,数書式設定を行っている部分です。

  oCell = oSheet.getCellRangeByName("C3")
  oCell.Value = Month( Now )
  sFormat = "0月分"
  oNumberFormats = oDoc.NumberFormats
  nKey = oNumberFormats.queryKey( sFormat, oLocale, false )
  If nKey <> -1 Then
    oCell.NumberFormat = nKey
  Else
    nKey = oNumberFormats.addNew( sFormat, oLocale )
    oCell.NumberFormat = nKey
  End If

まず,セル C3 のオブジェクトを作成します。

  oCell = oSheet.getCellRangeByName("C3")

そして,今月の月を取得して,セルの値に入力します。

  oCell.Value = Month( Now )

ここで Now および Month 関数を使っています。両方とも OpenOffice.org Basic の関数です。

そして,ここからが数書式設定に関するところです。まず,数書式設定のためのフォーマットを文字列として用意します。ここでは,"0月分" の部分です。

つぎに,数書式のために必要な数書式のためのオブジェクトを取得します。

  oNumberFormats = oDoc.NumberFormats

ここでは,定義した oNumberFormats 変数にオブジェクトを取得します。このオブジェクトは,ドキュメント全体の数書式を管理しているオブジェクトで,数書式設定を取り扱うときにはいつも必要になってくるオブジェクトです。

さて,次の行からが重要です。

  nKey = oNumberFormats.queryKey( sFormat, oLocale, false )

この行では,数書式オブジェクトである oNumberFormats のメソッド queryKey を使っています。このメソッドは,一番目の引数の sFormat の形式の数書式が,二番めの引数の oLocale ロケールに存在するかどうかをしらべるためのものです。このメソッドは,指定した数書式が存在するときには,その数書式を表すキーを戻します。三番目の引数は,指定した形式の数書式の分類がないときに作成するかどうかを指定するためのものです。普段は false としておいていいと思います。

この queryKey メソッドですが,指定した数書式がないときには -1 を,また存在するときにはその数書式を管理するためのキー番号を戻します。このキーは Long 型の整数です。

つづいて,この部分です。

  If nKey <> -1 Then
    oCell.NumberFormat = nKey
  Else
    nKey = oNumberFormats.addNew( sFormat, oLocale )
    oCell.NumberFormat = nKey
  End If

まず,キーが存在するときには, nKey は -1 以外の整数になるので,そのときにはセルに数書式を設定します。

    oCell.NumberFormat = nKey

セルオブジェクト oCell の NumberFormat プロパティーに取得した数書式のキーを設定します。数書式を設定するのではなく,管理されているキーで設定します。

また,指定した数書式が存在しない nKey = -1 の時には,新しく数書式を追加します。

    nKey = oNumberFormats.addNew( sFormat, oLocale )

この addNew メソッドは数書式オブジェクトでは新しい数書式を指定したロケールに追加します。ここでは,数書式 sFormat をロケール oLocale に追加しています。

そして,同じようにキーを使ってセルに数書式を設定します。

    oCell.NumberFormat = nKey

さらに,数書式を設定している部分を説明する前にセルの高さなどを設定しておきます。

スタイル Edit

 oStyleFamilies = oDoc.StyleFamilies
 oCellStyles = oStyleFamilies.getByName("CellStyles")
 sNewStyleName() = Array( "土曜日", "日曜日", "翌月" )
 aNewStyles() = Array( oSatStyle, oSunStyle, oNextMonth )
 For i = 0 To 2
   If NOT oCellStyles.hasByName(sNewStyleName(i)) Then
     aNewStyles(i) = oDoc.createInstance("com.sun.star.style.CellStyle")
     oCellStyles.insertByName( sNewStyleName(i), aNewStyles(i) )
   Else
     oCellStyles.removeByName( sNewStyleName(i) )
     aNewStyles(i) = oDoc.createInstance("com.sun.star.style.CellStyle")
     oCellStyles.insertByName( sNewStyleName(i), aNewStyles(i) )
   End If
 Next i
 oSatStyle.CellBackColor = RGB( 153, 204, 255 )
 oSunStyle.CellBackColor = RGB( 255, 0, 255 )
 With oNextMonth
   .CharColor = RGB(230,230,255)
   .CellBackColor = RGB(230,230,255)
 End With

スタイルを取り扱うためには,スタイルファミリーコンテナオブジェクトが必要です。このオブジェクトはドキュメントオブジェクトから取得します。

 oStyleFamilies = oDoc.StyleFamilies

ドキュメントオブジェクトのプロパティー StyleFamilies を利用してスタイルファミリーコンテナオブジェクトを作成します。このスタイルファミリーコンテナというのは,複数のスタイルファミリーがまとめられているオブジェクトです。ここでドキュメントオブジェクトから取得するのは,スタイルがドキュメントごとに管理されているためです。

スタイルファミリーコンテナオブジェクト中にはそれぞれのスタイルファミリーが管理されています。OpenOffice.org Calc では二つのスタイルファミリーがあり,それぞれ「セルスタイル」および「ページスタイル」です。それらのスタイルファミリーを名前指定で取得するときには英語名を使用します。"CellStyles" および "PageStyles" です。

ここではセルのスタイルを利用するので次のようにしてセルスタイルファミリーオブジェクトを取得します。

 oCellStyles = oStyleFamilies.getByName("CellStyles")

次では,新しく作成する「土曜日」,「日曜日」,「翌月」の三つのスタイル名を配列の要素として準備しています。さらにそれらのスタイルを格納するための変数も配列に入れて準備しておきます。これは次の For 文で利用するためです。

 sNewStyleName() = Array( "土曜日", "日曜日", "翌月" )
 aNewStyles() = Array( oSatStyle, oSunStyle, oNextMonth )

複数のスタイルを追加するために次のように For 文を利用してみます。

 For i = 0 To 2
   If NOT oCellStyles.hasByName(sNewStyleName(i)) Then
     aNewStyles(i) = oDoc.createInstance("com.sun.star.style.CellStyle")
     oCellStyles.insertByName( sNewStyleName(i), aNewStyles(i) )
   Else
     oCellStyles.removeByName( sNewStyleName(i) )
     aNewStyles(i) = oDoc.createInstance("com.sun.star.style.CellStyle")
     oCellStyles.insertByName( sNewStyleName(i), aNewStyles(i) )
   End If
 Next i

三つのスタイルについて行うために For 文を利用しています。配列のインデックスは "0" からなので,"0 To 2" となります。

まず始めに hasByName メソッドを利用してそのスタイルファミリーに同じ名前を持つスタイルがないかどうかを調べます。

   If NOT oCellStyles.hasByName(sNewStyleName(i)) Then

同じ名前を持つスタイルがなければまずスタイルのためのインスタンスを作成します。

     aNewStyles(i) = oDoc.createInstance("com.sun.star.style.CellStyle")

利用するサービス名は "com.sun.star.style.CellStyle" です。

そして作成したインスタンスをセルスタイルに追加します。追加には insertByName メソッドを利用します。引数に新しいスタイル名,新しいスタイルをとります。

     oCellStyles.insertByName( sNewStyleName(i), aNewStyles(i) )

スタイルファミリーに同じ名前のスタイルがすでに存在するときには,まずすでにあるスタイルを削除してから新たにスタイルを作成,追加することにします。

     oCellStyles.removeByName( sNewStyleName(i) )

この removeByName メソッドを使用してスタイルを削除します。このメソッドの引数には削除したいスタイル名を指定します。

スタイルのインスタンスの作成と追加はスタイルが存在しないときと同じです。

最後にセルスタイルのプロパティーを調整しておきます。

 oSatStyle.CellBackColor = RGB( 153, 204, 255 )
 oSunStyle.CellBackColor = RGB( 255, 0, 255 )
 With oNextMonth
   .CharColor = RGB(230,230,255)
   .CellBackColor = RGB(230,230,255)
 End With

背景色の CellBackColor および文字の色 CharColor プロパティーを変更します。

条件付書式設定 Edit

条件付書式設定の部分についてです。条件付書式というのは,セルに含まれる式や値を条件にしたがってそのセルに特定のセルスタイルを適用するものです。

 oRange = oSheet.getCellRangeByName("C5:C35")
 oConditionalFormat = oRange.ConditionalFormat
 
 aCondition1(0).Name = "Operator"
 aCondition1(0).Value = com.sun.star.sheet.ConditionOperator.GREATER
 aCondition1(1).Name = "Formula1"
 aCondition1(1).Value = "EOMONTH($Sheet1.$C$5;0)"
 aCondition1(2).Name = "StyleName"
 aCondition1(2).Value = sNewStyleName(2)
 
 aCondition2(0).Name = "Operator"
 aCondition2(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
 aCondition2(1).Name = "Formula1"
 aCondition2(1).Value = "WEEKDAY(A1)=7"
 aCondition2(2).Name = "StyleName"
 aCondition2(2).Value = sNewStyleName(0)
 
 aCondition3(0).Name = "Operator"
 aCondition3(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
 aCondition3(1).Name = "Formula1"
 aCondition3(1).Value = "WEEKDAY(A1)=1"
 aCondition3(2).Name = "StyleName"
 aCondition3(2).Value = sNewStyleName(1)
 
 With oConditionalFormat
   .clear()
   .addNew( aCondition1() )
   .addNew( aCondition2() )
   .addNew( aCondition3() )
 End With
 oRange.ConditionalFormat = oConditionalFormat

順をおって説明していきます。

 oRange = oSheet.getCellRangeByName("C5:C35")
 oConditionalFormat = oRange.ConditionalFormat

まず,条件付書式設定を行うセル範囲オブジェクトを取得します。そして,条件付書式設定のためのオブジェクト oConditionalFormat を取得します。取得には,セル範囲のプロパティー ConditionalFormat を使っています。このプロパティーはオブジェクトをとります。

つぎに,条件付書式設定に使うための条件を用意します。ここでは,三つの条件を使用します。条件を作成するために次の変数が定義済みです。

Dim aCondition1(2) As New com.sun.star.beans.PropertyValue
Dim aCondition2(2) As New com.sun.star.beans.PropertyValue
Dim aCondition3(2) As New com.sun.star.beans.PropertyValue

この定義してある変数を利用して条件を作成していきます。ここで,これら三つの変数は,com.sun.star.beans.PropertyValue struct として定義されています。配列の一つ一つが com.sun.star.beans.PropertyValue になっています。その一つ一つに Name および Value プロパティーがあります。値と名前を指定してまとめて設定したり与えたりするときによく用いる方法です。

三つの com.sun.star.beans.PropertyValue にそれぞれ名前と値を指定していきます。

 aCondition1(0).Name = "Operator"
 aCondition1(0).Value = com.sun.star.sheet.ConditionOperator.GREATER
 aCondition1(1).Name = "Formula1"
 aCondition1(1).Value = "EOMONTH($Sheet1.$C$5;0)"
 aCondition1(2).Name = "StyleName"
 aCondition1(2).Value = sNewStyleName(2)
 
 aCondition2(0).Name = "Operator"
 aCondition2(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
 aCondition2(1).Name = "Formula1"
 aCondition2(1).Value = "WEEKDAY(A1)=7"
 aCondition2(2).Name = "StyleName"
 aCondition2(2).Value = sNewStyleName(0)
 
 aCondition3(0).Name = "Operator"
 aCondition3(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
 aCondition3(1).Name = "Formula1"
 aCondition3(1).Value = "WEEKDAY(A1)=1"
 aCondition3(2).Name = "StyleName"
 aCondition3(2).Value = sNewStyleName(1)

そして,条件付書式を作成します。

 With oConditionalFormat
   .clear()
   .addNew( aCondition1() )
   .addNew( aCondition2() )
   .addNew( aCondition3() )
 End With

まず,clear メソッドで条件を初期化します。つぎに条件を指定したい順に addNew メソッドを利用して引数に条件を指定して,条件を追加します。

最後にセル範囲に条件付書式設定を適用して終わりです。

 oRange.ConditionalFormat = oConditionalFormat

オートフィル Edit

OpenOffice.org Calc で連続した値を入力するときなどに使用するオートフィル機能,この機能は OpenOffice.org API 関数を呼び出すことで OOoBasic からも利用できます。

  With oSheet
    .getCellRangeByName( "C4" ).String = "前月より"
    .getCellRangeByName( "C37" ).String = "合計"
    .getCellRangeByName( "C4:C37" ).HoriJustify = _
      com.sun.star.table.CellHoriJustify.CENTER
    .getCellRangeByName( "P5" ).Formula = "=SUM(F5;O5)"
    .getCellRangeByName( "Q5" ).Formula = "=Q4+E5-P5"
    .getCellRangeByName( "E37" ).Formula = "=SUM(E5;E35)"

  .getCellRangeByName("P5:P35").fillAuto( com.sun.star.sheet.FillDirection.TO_BOTTOM, 1 )
  .getCellRangeByName("Q5:Q35").fillAuto( com.sun.star.sheet.FillDirection.TO_BOTTOM, 1 )
  .getCellRangeByName("E37:P37").fillAuto( com.sun.star.sheet.FillDirection.TO_RIGHT, 1 )
  End With

End Sub

オートフィルの前に,表の項目名を入力して中央ぞろへにします。

    .getCellRangeByName( "C4" ).String = "前月より"
    .getCellRangeByName( "C37" ).String = "合計"
    .getCellRangeByName( "C4:C37" ).HoriJustify = _
      com.sun.star.table.CellHoriJustify.CENTER

中央ぞろへはセル範囲のプロパティーの HoriJustify プロパティーの値を com.sun.star.table.CellHoriJustify.CENTER に設定します。

そして,数式をセルに入力しておきます。

    .getCellRangeByName( "P5" ).Formula = "=SUM(F5;O5)"
    .getCellRangeByName( "Q5" ).Formula = "=Q4+E5-P5"
    .getCellRangeByName( "E37" ).Formula = "=SUM(E5;E35)"

最後にオートフィルですが,これには fillAuto メソッドを利用することにします。このメソッドの二つの引数は,フィルの方向およびフィル時の増分の値です。ここでは,下方向にフィルするために com.sun.star.sheet.FillDirection.TO_BOTTOM を始めの引数にそして二つ目の引数に増分値として 1 を指定します。

  .getCellRangeByName("P5:P35").fillAuto( com.sun.star.sheet.FillDirection.TO_BOTTOM, 1 )
  .getCellRangeByName("Q5:Q35").fillAuto( com.sun.star.sheet.FillDirection.TO_BOTTOM, 1 )
  .getCellRangeByName("E37:P37").fillAuto( com.sun.star.sheet.FillDirection.TO_RIGHT, 1 )

完成 Edit

これで完成です。


Attach file: filekakeibo_tuto_ide5.png 377 download [Information] filekakeibo_tuto_ide6.png 238 download [Information] filekakeibo_tuto_ide7.png 423 download [Information] filekakeibo_tuto_ide2.png 405 download [Information] filedoc_structure.png 441 download [Information] filekakeibo_tuto_ide1.png 469 download [Information] filekakeibo_tuto_ide4.png 367 download [Information] filekakeibo_tuto_ide3.png 348 download [Information]

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