「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:2
総数:2962
現在:2


オートフィルタを利用したマクロの作成ができません。

ページOpenOffice.org FAQの登録ページ
投稿者あいだ
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-04-07 15:38:37 (火)
OSWindows XP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

マクロの記録を利用したところ、オートフィルタは記録されないようです。

ですので、なんとか自力でやってみたいのですがご教授願えませんでしょうか?
もしくはサンプル等がございましたら、紹介していただけませんか?

やってみたいこととしては、
・ある列のうち、0以上もしくは0以下の数字をもつ行のみ抽出。
・ある列とある列の両方とも、0以上もしくは0以下の数字を持つ行のみ抽出。

頻繁に行うのでマクロにしてボタンに取り付けて実行したいと考えております。
よろしくおねがいします。


参考になるサイト

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

無題

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

ありがとうございます。

あいだ (2009-04-07 18:47:16 (火))

お二方とも本当にありがとうございます。

サンプルをさっそく使用させていただき、動きをチェックいたしました。
適当な数字を入れてみると、面白く動くものですね。
あとは、0以上だったら、抽出しないという設定にすればいいというところなのですが、> とか <をどこにいれていいものやら・・・

大変恐縮なのですが、=ではない等符号をどこにどのようにしていれればよいのか教えてください。
よろしくおねがいします。

無題

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

できました!

あいだ (2009-04-07 21:42:42 (火))

なんとか形にすることができました、ありがとうございました。
作業をするときに感じたのですが、マクロを何度も手直しして実行する際、やりにくい事がありました。

oRange = oActiveSheet.getCellRangeByName("C3:D6")

と設定して、実行したあとに、

oRange = oActiveSheet.getCellRangeByName("A3:D6")

という風にレンジを帰って実行するとまったく反応せず、
前のC3-D6の範囲でしか動きませんでした。
いちいち新規にページをコピーして何度も手直ししたために時間を食ってしまいました。
ほかになにか方法はあったのでしょうか?

訂正

あいだ (2009-04-07 21:43:25 (火))

レンジを帰って→範囲を変えて
です。ごめんなさい

無題

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)


スムーズにいきました!

あいだ (2009-04-07 22:30:02 (火))

ありがとうございました。

こういうのはやりなれていなかったのですが、やってみると楽しいものでした。
もっと技術をみがいていこうとおもいます笑

お名前:
題名: