マクロでのセル領域が2個での条件付き書式でSource Position を正しく設定するには?

質問日 2019-08-18 08:16:59 +0200

sunshellsaloha のGravatar画像

updated 2019-08-18 17:52:19 +0200

nogajun のGravatar画像

LibreOffice6.2.3.2マクロ(basic) で複数セル範囲に1つの数式で条件付き書式を設定しました。 しかし、設定された条件付き書式は定義数式が壊れます。

定義数式($A3<=$A$2)を壊さないためにはどこを修正すれば良いでしょうか?。

  • 表の大きさは A1:Q250

    • 1行目=見出し
    • 2行目=データ管理行
    • 3行目以降=データ
  • A列

    • シリアル値ベースの日付 形式:yy/mm/dd 昇順に並んでる
    • A3~A184行・・・18/03/31~19/11/27が入力済
    • A185~A250行・・・空白
  • A2:=today()として本日日付を表示
  • B-C列・・・摘要でかな文字
  • D,H-I,Q列・・・数値
  • E-G列・・文字列

条件定義してる範囲とスタイル

  • A3:A250 , E3:G250 -- セル領域が2つ
  • "文字G + 中央揃え"
    • 「文字G」-- フォント色でG=緑
    • 「揃え」-- セル内の横位置
    • 日本語表記なので「G,+,空白」はそれぞれ半角で入力

マクロを走らせると条件付き書式は正しく機能

が、定義数式($A3<=$A$2)→($A5<=$A$2)に 壊れます。

推定するに oCondition(0).Name = "SourcePosition"に定義してる値 oCondition(0).Value = oRange.RangeAddresses(0) が正しくないと思われます。

A3:A250 , E3:G250の2つの領域の1つ目のA3:A250の左上セルの位置(=A3) を掴むメソッドまたはプロパティはあるのでしょうか?

簡略化したコード

Sub SetConditionalStyle_ABDEGHIQ()

  Dim oRange as object
  Dim oConFormat            'Conditional format object
  Dim oCondition(3) As New com.sun.star.beans.PropertyValue

  Dim sAddress

  oCondition(0).Name = "SourcePosition"
  oCondition(1).Name = "Operator"
  oCondition(2).Name = "Formula1"
  oCondition(3).Name = "StyleName"

  Dim a: a = array("A3:A250,E3:G250")
  Dim s: s = "文字G + 中央揃え"
  Dim n as long, i as long

  sAddress = Split( a(0), ",")
  oRange = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
  for i=0 to ubound(sAddress)
    oRange.addRangeAddress(ThisComponent.Sheets(0). _
    getCellRangeByName(sAddress(i)).RangeAddress,False)
  next

  oCondition(0).Value = oRange.RangeAddresses(0)
  oCondition(1).Value = com.sun.star.sheet.ConditionOperator.FORMULA
  oCondition(2).Value = "$A3<=$A$2"
  oCondition(3).Value = s

  oConFormat = oRange.ConditionalFormat
  oConFormat.addNew(oCondition())
  oRange.ConditionalFormat = oConFormat

End Sub
edit retag flag offensive close merge delete

Comments

当方は Source Position 定義がよく理解できてなかったようです
例えば セル領域が2つの場合 A3:A250,E3:G250 のとき その左上コーナーセル = A3
セル領域が3つの場合 D3:D250,H3:I250,Q3:Q250 のとき その左上コーナーセル = D3
この考え方でそれぞれの行で設定したとき

oCondition(0).Value =
ThisComponent.Sheets(0).getCellByposition(0,2).getCellAddress() ThisComponent.Sheets(0).getCellByposition(3,2).getCellAddress()

で設定したら条件付き書式は正しく機能し、定義数式も壊れませんでした。

となると振り出しに戻り、本件のような2つ(複数)領域にて

左上コーナーセル位置を整然とした手法で求めるには
どういうメソッドまたはプロパティ(組み合わせを含む)がああるでしょうか?

という Q/A になります。

sunshellsaloha のGravatar画像sunshellsaloha ( 2019-08-20 07:25:27 +0200 )edit