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

「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をドロップダウンのように
探せないのか?

等々

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

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

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

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

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

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

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

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

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

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

https://opengrok.libreoffice.org/xref/core/sc/uiconfig/scalc/ui/conditionalentry.ui?r=492b0d5d#459

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

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlgentry.cxx?r=00ae441b#44

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

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

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

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#97

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#121

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

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

https://opengrok.libreoffice.org/xref/core/sc/inc/conditio.hxx?r=8c637b47#513

https://opengrok.libreoffice.org/xref/core/sc/inc/conditio.hxx?r=8c637b47#ScCondFormatDateType

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

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

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#465

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#BtnPressedHdl

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#597

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#563

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#144

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#165

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlgentry.cxx?r=00ae441b#1251

https://opengrok.libreoffice.org/xref/core/sc/source/core/data/conditio.cxx?r=8c637b47#1750

https://opengrok.libreoffice.org/xref/core/sc/source/ui/condformat/condformatdlg.cxx?r=00ae441b#606

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

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


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

https://opengrok.libreoffice.org/xref/core/sc/inc/unonames.hxx?r=823c77a9#345

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

https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/fmtuno.cxx?r=09c657eb#292

aEntryの型はScCondFormatEntryItemであり

https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/fmtuno.cxx?r=09c657eb#254

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

https://opengrok.libreoffice.org/xref/core/sc/inc/fmtuno.hxx?r=09c657eb#49

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

https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/fmtuno.cxx?r=09c657eb#AddEntry_Impl

以下、こうなる。
https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/cellsuno.cxx?r=09c657eb#2392

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

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

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

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

処で
末尾掲示 LibreOffice Module sc (master): conditio.hxx Source File を眺めて
おや? 変だな? と直感した部分があります。

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

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

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

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

//

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

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

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

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

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

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

conditionalentry.ui Property
https://opengrok.libreoffice.org/xref/core/sc/uiconfig/scalc/ui/conditionalentry.ui?r=492b0d5d#459

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

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

となると

458行~461行目にカテゴリそのものに関係するキーワードがあり。その中に
461行目:Date isの"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を膨大なソーステキストから探せるのでしょうか?

"|datetype”とあるので

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

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

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

https://opengrok.libreoffice.org/xref/core/sc/source/core/data/conditio.cxx?r=8c637b47#1431

https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/fmtuno.cxx?r=09c657eb#266

https://opengrok.libreoffice.org/xref/core/sc/source/core/data/conditio.cxx?r=8c637b47#1399

https://opengrok.libreoffice.org/xref/core/offapi/com/sun/star/sheet/ConditionOperator2.idl?r=944eb990#19

失礼しました。

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

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

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

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

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

,

整形されての入力

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

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