Microsoft Access 掲示板

VBAで条件付き書式を4件以上

8 コメント
views
4 フォロー

Access2016、accdb環境で
VBAでフォームのコンボボックスに条件付き書式をマスタテーブルからループを使い一括で登録したく、
フォーム読み込み時に追加のコードを書いているのですが
4件目で「実際の書式条件よりも多い値が、書式条件数に設定されています」と出てしまい追加できない状態です
ネットで検索してみても3件までと書いてある事もあれば
FormatConditions.Addを4回以上実行できている例もありどうすれば入れられるのかわからないのです
件数はマスタテーブルから読み込むため不定になります

どうすれば4件以上追加できるのでしょうか?

tetsusi
作成: 2020/09/04 (金) 11:59:20
通報 ...
1

Acc2016なら条件付き書式4件以上でも追加できるはずです。(最大何件かまでは把握してませんが。)
3件まではかなり前のバージョンだったと思います。

最初に条件付き書式を削除してから、追加してますか。

実際のコードを提示してください。

2
tetsusi 2020/09/07 (月) 10:21:18 28ccc@a46a9

ありがとうございます
実際のコードは以下のようになっています

Dim Db      As DAO.Database
Dim Rs      As Recordset
Dim StrSQL  As String
Dim Fmt     As FormatCondition

Private Sub Form_Load()
    Set Db = CurrentDb
    StrSQL = "SELECT DISTINCT 文字色 FROM 項目MT ORDER BY 文字色"
    Set Rs = Db.OpenRecordset(StrSQL, dbOpenSnapshot)
    Me!項目.FormatConditions.Delete  →ここで削除してるはず
    Do Until Rs.EOF = True
        Set Fmt = Me!項目.FormatConditions.Add(acExpression, acEqual, "[文字色] = " & Rs!文字色)
        Fmt.ForeColor = Rs!文字色  → ループ4回目のここでエラーになります
        Rs.MoveNext
    Loop
End Sub

7

当方、Access2016で同じエラー解決しました。
条件付き書式のスペースを消すとエラーが出なくなりませんか。
NG: "[文字色] = " & Rs!文字色
OK: "[文字色]=" & Rs!文字色
これは以下2点において、Access2016のバグと言っていいと思います。
・条件付き書式の解析の問題
・エラー内容とメッセージが違う問題

4
hatena 2020/09/07 (月) 13:07:09 修正

手元にあるフォームで試してみましたが、6件登録してもエラーにはなりませんでした。

テーブルとか作るのは面倒なので、色は配列にしました。

Private Sub Form_Load()
    Dim Fmt As FormatCondition

    Dim Colors
    Colors = Array(vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan)
    With Me!名前.FormatConditions
        .Delete
        Dim i As Long
        For i = 0 To UBound(Colors)
           Set Fmt = .Add(acExpression, acEqual, "[ID]=" & i + 1)
           Fmt.ForeColor = Colors(i)
        Next
    End With
End Sub

画像1

Access2019ですので、ひょっとしてバージョンで違うのかな。
デザインビューで手作業で条件書式を追加したときは4件以上でも登録できますか。

5
tetsusi 2020/09/07 (月) 14:24:46 28ccc@a46a9

デザインビューで試してみたところ4件、5件と追加できていました…
正直なところ2016でなぜこのエラーが出るのか分かりません

6

今日は無理ですが、明日、出先にAccess2013環境があるので試してみます。

8
hiroton 2022/02/14 (月) 11:48:46 9ea4e@f966d

文字色がレコードに保存されているならリッチテキスト形式を使うと楽ができるかもしれません

標準モジュールに次の関数を追加する(※)

'R+G*256+B*256*256の値をカラーコード表記に変換する
Function getColorCode_D2H(decimalValue As Long)
    Dim HexString As String
    HexString = Right("000000" & Hex(decimalValue), 6)
    
    '並び順がBGRなので順番を変えてカラーコード表記にする
    getColorCode_D2H = "#" & Right(HexString, 2) & Mid(HexString, 3, 2) & Left(HexString, 2)
End Function

新たにテキストボックスを設置する

コントロールソース: ="<font color=""" & getColorCode_D2H([文字色]) & """>" & [項目] & "</font>"
文字書式:リッチ テキスト形式

このテキストボックスは編集できないので、編集が必要なら元のテキストボックスにぴったり重ね合わせて(前面配置にする)フォーカス取得時にMe!項目.setFocusとかしてあげる必要があります

(※)単純な計算なので関数を使わず直接コントロールソースで計算させることもできます

="<font color=""#" & Right(Hex([文字色]+256),2) & Mid(Hex([文字色]+16777216),4,2) & Mid(Hex([文字色]+16777216),2,2) & """>" & [項目] & "</font>"