Top > OOobbs2 > 60

OOobbs2/60 Edit

  • サマリ: マクロでオートフィルタを使用してある値でフィルタするには
  • 環境: Calc
  • 状態: 解決
  • 投稿者: とうし?
  • 投稿日: 2007-08-08 (水) 09:03:31

質問 Edit

マクロでオートフィルタを使用してある値でフィルタする方法を教えてほしい。

回答 Edit

  • オートフィルタの機能を使用するにはデータベース範囲に範囲を追加する必要があります。

まず、データベース範囲コンテナオブジェクトをドキュメントオブジェクトから DatabaseRanges プロパティなどで取得します。そこへ、オートフィルタを設定したい範囲を名前指定で追加します addNewByName メソッドを使用します。追加する範囲の指定は com.sun.star.table.CellRangeAddress sruct で行います。

追加した範囲をデータベース範囲から名前指定などで取得してやり、AutoFilter プロパティを true に設定するとオートフィルターが利用できるようになります。

フィルターの設定は FilterDescriptor を取得、さらにそこからフィールドを取得します。オートフィールドではフィルターフィールドは一つしかありませんので、インデックス "0" のものを利用します。

Sub Main
  oDoc = ThisComponent
  oRanges = oDoc.DatabaseRanges
  oRange = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(1,0,1,7)

  oRanges.addNewByName("range1", oRange.RangeAddress)
  
  oDbRange = oRanges.getByName("range1")
  oDbRange.AutoFilter = true
  oFD = oDbRange.FilterDescriptor
  
  aFields = oFD.FilterFields
  With aFields(0)
    .Connection = com.sun.star.sheet.FilterConnection.AND
    .Field = 0
    .Operator = com.sun.star.sheet.FilterOperator.EQUAL
    .IsNumeric = true
    .NumericValue = 6
    .StringValue = "6"
  End With
  oFD.setFilterFields( aFields )
  
  oDbRange.refresh()
End Sub

フィルターのフィールドの設定は com.sun.star.sheet.TableFilterField struct で行います。(上の例だと数値 6 に一致するものを表示しています)

フィールドの値を設定したら、setFilterFields メソッドを使用してフィールドをセットしなおします。

最後にフィルター範囲を更新するために refresh メソッドを呼び出します。

オートフィルタの設定で「標準」フィルタにするには、FilterDescriptor のほかのプロパティを設定します。また、複数のフィールドが必要であれば新しく追加します。

FilterDescriptor の設定は次参照 http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/SheetFilterDescriptor.html

SbxBOOL ContainsHeader列ラベルを含む範囲
SbxBOOL CopyOutputDataフィルタ結果の貼り付けを使用
SbxBOOL IsCaseSensitive大文字小文字を区別する
SbxLONG MaxFieldCountフィールド最大数(読み取り専用)
SbxLONG Orientationフィルター方向
SbxOBJECT OutputPosition貼り付け時の貼り付け先
SbxBOOL SaveOutputPosition貼り付け先位置の保存
SbxBOOL SkipDuplicates重複なし
SbxBOOL UseRegularExpressions正規表現を使用
SbxARRAY FilterFieldsフィールド

新しくフィルターを追加するには、新しく個数指定で struct を作成

Dim aFields(1) As New com.sun.star.sheet.TableFilterField

フィルターフィールド設定後、setFilterFields メソッドの引数として与えます。

  • はにゃ?? 2007-08-08 (水) 13:32:08
  • Connection = com.sun.star.sheet.FilterConnection.ANDの行で「許可されない値またはデータ型、定義された範囲外のインデックス」とのエラーになります。 -- とうし? 2007-08-08 (水) 14:32:47
  • 最初はフィルタフィールドが無いためのようです。次のようにして作成しておきます。

取得する代わりに新しくフィルタフィールドを作成します。

  'aFields = oFD.FilterFields

  Dim aFileds(0) As New com.sun.star.sheet.TableFilterField
  With aFields(0)
    .Connection = com.sun.star.sheet.FilterConnection.AND
  • はにゃ?? 2007-08-08 (水) 19:19:06
  • ご回答通りに変更しましたが、同じ行で「BASICランタイムエラー SubまたはFunctionプロシージャーの未定義」とのエラーになります。 -- とうし? 2007-08-20 (月) 15:42:50
  • こちらの環境ではエラーが出ないので、原因が分かりません。一応、正しく動作するマクロを含むファイルを添付しておきます。fileOOobbs2-60.ods -- はにゃ?? 2007-08-20 (月) 16:18:52
  • 動作するようになりました。ただ1回目はOKですが、2回目は、oRanges.addNewByName("range1", oRange.RangeAddress)の行でエラーが出ます。 -- とうし? 2007-08-21 (火) 10:27:07
  • 同じ名前の範囲がデータベース範囲コンテナにあるとエラーになるので次のようにして削除してから追加するなど
 If oRanges.hasByName( "range1" ) Then
   oRanges.removeByName( "range1" )
 End If
 oRanges.addNewByName("range1", oRange.RangeAddress)

データベースコンテナオブジェクトは XDataBaseRanges のメソッドおよび基本のインターフェース XNameAccess および XElementAccess のメソッドが利用できます。

  • はにゃ?? 2007-08-21 (火) 15:28:40

感想,コメント,メモ Edit



Attach file: fileOOobbs2-60.ods 948 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