* オートフィルタを利用したマクロの作成ができません。 [#jbdc1c21]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|あいだ|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(重要,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2009-04-07 15:38:37 (火)|
 |~OS|	Windows XP|
 |~依存するページ||
 |~バージョン|#listbox3(3.0.1,faq03,version)|
 
 ** メッセージ [#p470c19f]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 マクロの記録を利用したところ、オートフィルタは記録されないようです。~
 ~
 ですので、なんとか自力でやってみたいのですがご教授願えませんでしょうか?~
 もしくはサンプル等がございましたら、紹介していただけませんか?~
 ~
 やってみたいこととしては、~
 ・ある列のうち、0以上もしくは0以下の数字をもつ行のみ抽出。~
 ・ある列とある列の両方とも、0以上もしくは0以下の数字を持つ行のみ抽出。~
 ~
 頻繁に行うのでマクロにしてボタンに取り付けて実行したいと考えております。~
 よろしくおねがいします。~
 
 
 ----
 ***参考になるサイト [#n9a76f56]
 >M.Kamataki (2009-04-07 16:36:49 (火))~
 ~
 Calcのオートフィルタをマクロで設定する例が以下のサイトで紹介されています。まずはこのあたりから調べると良いと思います。~
 ~
 マクロでオートフィルタを使用してある値でフィルタするには~
 http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs2%2F60~
 ~
 あと、英語では以下とか。~
 ~
 Filters~
 http://wiki.services.openoffice.org/wiki/Documentation/OOo3_User_Guides/Calc_Guide/Filters~
 
 //
 ***無題 [#ab16c03b]
 >tani (2009-04-07 17:13:38 (火))~
 ~
 サンプル書いてみました。"A1:D6"の範囲でA列およびB列が両方0ではない行を抽出します。~
 ~
  Sub Main
  
   oActiveSheet = ThisComponent.getCurrentController().getActivesheet()
   oRange = oActiveSheet.getCellRangeByName("A1:D6")
   oRanges = ThisComponent.DatabaseRanges
   If oRanges.HasByName("range1") = False Then
     oRanges.addNewByName("range1", oRange.RangeAddress)
   End If
   oDbRange = oRanges.getByName("range1")
   oDbRange.AutoFilter = true
   oFD = oDbRange.FilterDescriptor
  
   dim aFilterFields(1) as new com.sun.star.sheet.TableFilterField 
   aFilterFields(0).Field = 0
   aFilterFields(0).IsNumeric = true
   aFilterFields(0).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
   aFilterFields(0).NumericValue = 0
  
   aFilterFields(1).Field = 1
   aFilterFields(1).IsNumeric = true
   aFilterFields(1).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
   aFilterFields(1).NumericValue = 0
   aFilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
  
   oFD.setFilterFields(aFilterFields())  
   oDbRange.refresh()
  
  End Sub
 
 //
 ***ありがとうございます。 [#f82a1e15]
 >あいだ (2009-04-07 18:47:16 (火))~
 ~
 お二方とも本当にありがとうございます。~
 ~
 サンプルをさっそく使用させていただき、動きをチェックいたしました。~
 適当な数字を入れてみると、面白く動くものですね。~
 あとは、0以上だったら、抽出しないという設定にすればいいというところなのですが、> とか <をどこにいれていいものやら・・・~
 ~
 大変恐縮なのですが、=ではない等符号をどこにどのようにしていれればよいのか教えてください。~
 よろしくおねがいします。~
 
 //
 ***無題 [#f8ccc6ab]
 >tani (2009-04-07 19:01:27 (火))~
 ~
  aFilterFields(0).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
 とかになってる行がそうです。ここではNOT_EQUALなので0では無いという条件ですね。~
 ~
 0以上という条件だったら~
  aFilterFields(0).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
 0以下という条件だったら~
  aFilterFields(0).Operator = com.sun.star.sheet.FilterOperator.LESS_EQUAL
 みたいな感じに変えてください。以下に定数一覧があります。~
 
 ~
 http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/FilterOperator.html~
 
 //
 ***できました! [#h07ce450]
 >あいだ (2009-04-07 21:42:42 (火))~
 ~
 なんとか形にすることができました、ありがとうございました。~
 作業をするときに感じたのですが、マクロを何度も手直しして実行する際、やりにくい事がありました。~
  oRange = oActiveSheet.getCellRangeByName("C3:D6")
 と設定して、実行したあとに、~
  oRange = oActiveSheet.getCellRangeByName("A3:D6")
 という風にレンジを帰って実行するとまったく反応せず、~
 前のC3-D6の範囲でしか動きませんでした。~
 いちいち新規にページをコピーして何度も手直ししたために時間を食ってしまいました。~
 ほかになにか方法はあったのでしょうか?~
 
 //
 ***訂正 [#sf9a39e9]
 >あいだ (2009-04-07 21:43:25 (火))~
 ~
 レンジを帰って→範囲を変えて~
 です。ごめんなさい~
 
 //
 ***無題 [#le963a9b]
 >tani (2009-04-07 22:02:45 (火))~
 ~
 サンプルコードだと、一度指定したレンジ範囲(例えばC3:D6)が「"range1"」として登録されてしまうからだと思います。毎回削除してから登録するように変更すると意図通りに動作するのではないでしょうか。具体的には~
  If oRanges.HasByName("range1") = False Then
    oRanges.addNewByName("range1", oRange.RangeAddress)
  End If
 となっているところを~
  If oRanges.HasByName("range1") = True Then
    ' もしrange1が既に登録済みの場合はまず削除
    oRanges.removeByName("range1")
  End If
  ' range1を登録
  oRanges.addNewByName("range1", oRange.RangeAddress)
 のように変えて試してみてください。~
 
 ~
 追記:~
 ~
 ちょっと自分でも色々試してみたら↑のままだと範囲指定を変えた場合に、画面にゴミ(以前のオートフィルタの残骸)が残るようですね。~
 画面を開きなおすときれいになってるので気にならなければそのままでもよさそうですが、念のために以下のようにするともっといいかも。~
  If oRanges.HasByName("range1") = True Then
    ' もしrange1が既に登録済みの場合はまず削除
    oRanges.getByName("range1").AutoFilter = False
    oRanges.removeByName("range1")
  End If
  ' range1を登録
  oRanges.addNewByName("range1", oRange.RangeAddress)
 ~
 //
 ***スムーズにいきました! [#a30c2e85]
 >あいだ (2009-04-07 22:30:02 (火))~
 ~
 ありがとうございました。~
 ~
 こういうのはやりなれていなかったのですが、やってみると楽しいものでした。~
 もっと技術をみがいていこうとおもいます笑~
 
 //
 #article