質問する
0

マクロ(Basic)での条件付き書式の設定(プロパティ)は?

質問日 2019-06-01 06:10:38 +0200

sunshellsaloha のGravatar画像

updated 2019-06-04 06:11:07 +0200

「A3:A200の日付で過去7日間の背景を赤にする」コードを作りたいのですが、うまく行きません。 どこをどのように修正すればよいでしょうか?

A3:A200はシリアル値ベースの日付で yy/mm/dd 書式

  • バージョン6=6.2.3.2
  • バージョン5=5.0.5.2

です。スタイルの「背景R」は事前に定義されてます。

現状でのコードは以下の通り

Sub SetGreenStyle()
  Dim oRange as object
  Dim oConFormat
  Dim oCondition(2) As New com.sun.star.beans.PropertyValue
  oRange = ThisComponent.Sheets(1).getCellRangeByName("A3:A200") 
  oConFormat = oRange.ConditionalFormat
  oCondition(0).Name = "SourcePosition"
  oCondition(0).Value = oRange.getCellByposition(0,0).getCellAddress()
  oCondition(1).Name = "Operator"
  oCondition(1).Value = com.sun.star.sheet.DateType.LAST7DAYS
  oCondition(2).Name = "StyleName"
  oCondition(2).Value = "背景R" 
  oConFormat.addNew(oCondition())  
  oRange.ConditionalFormat = oConFormat
End Sub

〔状況〕

  1. 入力されてる行はすべて赤くなる
  2. 作られた書式を確認すると 〔セルの値が〕,次の値より大きい ,次の値=0 となっており、カテゴリ分類が〔日付が〕になってません。
  3. マニュアルでこの条件付き書式設定をすると正常に反映され 作られた書式を確認すると 〔日付が〕,過去7日間 で生成されてます。
  4. マクロ記録ではそのような書式記述はされてないです。
  5. 不足に感ずること ・・ A3:A300のデータ書式がシリアル値ベースの書式であることを 伝えなくてはいけないような気がしてます。

追記 -- 2019/06/04 13:00

1.・・.beans.PropertyValueで、不足するName,及び,Value を当方自身が探しきれてないのも 解決を遅くしてると考えてます。従い、知恵者に希望するのは,回答に至る段取りも併記してほしい。 なぜなら,例えば A3:A200が書式 yy/mm/dd でなければならない --- そのPropertyはどう調べていくか?

2.マニュアルではうまく行くのでその条件付き書式が含まれているはずの odsファイルから探す方法があるのかないのか(逆アセンブル?)など

3.いずれにしてもEXCEL-VBAのIDEでの入力支援のように、候補Propertyをドロップダウンのように 探せないのか?

等々

edit retag flag offensive close merge delete

Comments

多分これLibreOffice側が未実装なんだなぁ

himajin100000 のGravatar画像himajin100000 ( 2019-06-03 15:46:09 +0200 )edit

多分これLibreOffice側が未実装なんだなぁ`

となるとLibreOfficeのバージョンごとのリリース内容の検証を疑いますね。

〔状況〕3にあるように適切なPropertyValueを指定したいです。

sunshellsaloha のGravatar画像sunshellsaloha ( 2019-06-04 03:04:26 +0200 )edit

1 Answer

0

回答日 2019-06-04 08:07:53 +0200

himajin100000 のGravatar画像

updated 2019-06-04 08:40:43 +0200

  • なぜ俺が、「LibreOffice側で未実装で、少なくともこのやり方ではできない、バグだ」と考えるのか?

  • 「できるべき、欠陥品だ」「代わりのコード提供しろや」という話は置いておく

従い、知恵者に希望するのは,回答に至る段取りも併記してほしい。

「手動で日付を用いた条件付き書式を設定したとき、何が行われているのか?」を調べる。

予めUI言語を英語にしておく。

A1を選択して、条件付き書式のウィンドウを開く。セルの値を条件とすることを選べるコンボボックスには"Cell Value is" という項目があり、これをソースコード検索ツールOpenGrokによって調べる。対象となる文字列が特定の場所でしか使われなさそうなものを選ぶのが重要だが、"Date is"は、色々なところで使われそうだったので避けた。

https://opengrok.libreoffice.org/xref...

このファイルはどこかから読み込まれているはずだからこれを検索する。

https://opengrok.libreoffice.org/xref...

ところで、このScCondFrmtEntryクラスは多くのクラスの継承元となっている。

https://docs.libreoffice.org/sc/html/...

継承先のクラスは、コンボボックスの選択内容や、このダイアログを開いたときにその範囲に対して設定されている条件付き書式に応じてインスタンスが生成されている。

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

97行目ScDateFrmtEntryの第三引数ScCondDateFormatEntryにも注目だ。

このScCondDateFormatEntryクラス、SetDateTypeの引数にはScCondFormatDateTypeという何やら見慣れた要素を持つ列挙体が登場する。

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

ここからScCondDateFormatEntryクラスのコンストラクタだとか、SetDateTypeメソッドが使われている場所を検索していくのもありだろう。

話は戻って、ダイアログのOKボタンが押されたとき、

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

という経緯を経て置換されることがわかる。

ScCondDateFormatEntryが利用されて、SetDateTypeが使われていることが重要、というわけだ。


では、質問文に記載されたコードが何をするかを追ってみる。特徴的な文字列は"SourcePosition"だろう。 その文字列はここでヒットする。

https://opengrok.libreoffice.org/xref...

わらしべ長者的にSC_UNONAME_SOURCEPOSを検索すると、以下、addNewという、見慣れたものが登場する。

https://opengrok.libreoffice.org/xref...

aEntryの型はScCondFormatEntryItemであり

https://opengrok.libreoffice.org/xref...

そもそもこの構造体には、日付に関する情報を保持されていない。

https://opengrok.libreoffice.org/xref...

そして、生成されるインスタンスはScTableConditionalEntryのものだからだ。

https://opengrok.libreoffice.org/xref...

以下、こうなる。 https://opengrok.libreoffice.org/xref...

前掲の図の通り、ScCondDateFormatEntryやScColorFormatは後追いなのかもしれない(単なる推測)

https://docs.libreoffice.org/sc/html/...

edit flag offensive delete link もっと

Comments

膨大なソーステキスト提示および流れの解釈ありがとうございます。

”OpenGrok"なるツールがあるのですね。ちなみにこれはWINDOWS-10 Pro 1809 でも 動くのが存在するのでしょうか?

処で  末尾掲示 https://docs.libreoffice.org/sc/html/conditio_8hxx_source.html を眺めて おや? 変だな? と直感した部分があります。

239行目   enum class Type の部分 で Date がどこかにリンクできるようになってますが クリックしても 404 Not Found になってしまう --- 異常ですよね?

283行目 265行~288行目まで switch文の記述がありますが case文のType::に続く単語とその次行のstream文の "<<"に続く単語は 他の5個はスペルが同じなのに、283行目だけは違います。 case文は"Date"だがstream文は"Data"です。

拙い当方のソフト開発経験からすれば このように整然性が外れた(乱れた)記述(はあまり見なかったですね。

ひょっとしたら、 himajin100000 さんが指摘されるようなバグに繋がってるかも知れませんね。

//

sunshellsaloha のGravatar画像sunshellsaloha ( 2019-06-05 02:15:03 +0200 )edit

https://github.com/oracle/opengrok

動かしてみたことはありません

enum class Type の部分 で Date がどこかにリンクできるようになってますが クリックしても 404 Not Found になってしまう --- 異常ですよね?

LibreOffice側の問題ではなくOpenGrok側の問題だと考えています。

283行目 265行~288行目まで switch文の記述がありますが case文のType::に続く単語とその次行のstream文の "<<"に続く単語は 他の5個はスペルが同じなのに、283行目だけは違います。 case文は"Date"だがstream文は"Data"です。

Typoでしょうね。望ましくないとはいえ、自分はコレ自体が直接的なバグの原因になっているとは思っていません。おそらくデバッグログ出力用なので。

himajin100000 のGravatar画像himajin100000 ( 2019-06-05 02:38:19 +0200 )edit

問題解決のために視点を変えて。コメントいただければ有り難いです。

conditionalentry.ui Property https://opengrok.libreoffice.org/xref...

を眺めててPropertyの羅列がありこの中から 406行~418行目にカテゴリが「日付が」に関係するキーワードがあり。 409行目:<item translatable="yes" context="conditionalentry|datetype">Last 7 days</item>の "LAST7DAYS"につながるそれもある。これは"|datetype”とあるので

oCondition(1).Name = "Operator" oCondition(1).Value = com.sun.star.sheet.DateType.LAST7DAYS

となると

458行~461行目にカテゴリそのものに関係するキーワードがあり。その中に 461行目:<item translatable="yes" context="conditionalentry|type">Date is</item>の"Date is"ながるそれもある。これは"|type”とあるので

oCondition(n).Name = "?????" oCondition(n).Value = com.sun.star.sheet.Type."Date is" -- ""で囲むので無茶かなと。

このときに oCondition(n).Nameに何を? oCondition(n).Valueの正しいnamespaceは何か? を探らねばならないような気がします。

処で "Cell is"の場合に「重複する」を設定する場合に oCondition(0).Name = "Operator" oCondition(0).Value = com.sun.star.sheet.ConditionOperator2.DUPLICATE で機能してます。

のOperatorやConditionOperator2を膨大なソーステキストから探せるのでしょうか?

sunshellsaloha のGravatar画像sunshellsaloha ( 2019-06-06 06:11:30 +0200 )edit

"|datetype”とあるので

これはおそらく翻訳のために存在しているもので、Basic側のコードには直接影響しないと思っています。(ので質問者さんの内容が的外れに自分には思える)

OperatorやConditionOperator2を膨大なソーステキストから探せるのでしょうか?

名前さえわかってしまえばどうにでも。(質問の内容を自分が正しく認識できているか不安になってます、正直)

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

https://opengrok.libreoffice.org/xref...

himajin100000 のGravatar画像himajin100000 ( 2019-06-06 07:13:27 +0200 )edit

失礼しました。

名前さえわかってしまえばどうにでも。 (質問の内容を自分が正しく認識できているか不安になってます、正直)

処で "Cell is"の場合に・・・ ソーステキストから探せるのでしょうか?

はマニュアルでは機能してる。"date is", "Last 7 days"を提示いただけたので LiBOのことも深くは利用してないので、リリースされてるならば どこでカバーされてるのでhないか? と希望を抱き "OperatorやConditionOperator2"が組み込まれてる周辺にはあるのではないか?と思った訳でした。

独断ですが 例えば "Category"のようなNameで登録されtるのかな? と期待を持った次第でした。 お手数を掛けました。

PS Ask-Liboででこのまま「コメント追加」すると文章書式が改行なしで送信されてしまうようです。 編集以外に整形されての入力は出来るのでしょうか? (入力中は読み易い行替えがされてるのですが)

,

sunshellsaloha のGravatar画像sunshellsaloha ( 2019-06-06 10:01:09 +0200 )edit

整形されての入力

段落区切りを明示するため、空行を入れています。

himajin100000 のGravatar画像himajin100000 ( 2019-06-06 10:24:02 +0200 )edit

Ask LibreOfficeの投稿やコメントは、 Markdown という記法で書きます。Markdownの文法については、Markdownで検索すれば出てきますし、テキストを入力して入力欄の上にあるアイコンを使って入力もできます。

nogajun のGravatar画像nogajun ( 2019-06-06 12:23:34 +0200 )edit
ログイン/サインアップして回答する

質問ツール

2 followers

Stats

Asked: 2019-06-01 06:10:38 +0200

Seen: 46 times

Last updated: Jun 04