Как установить условное форматирование для форм, отчетов и таблиц с помощью VBA

#error-handling #frontend #conditional-formatting #ms-access-2016

#обработка ошибок #интерфейс #условное форматирование #ms-access-2016

Вопрос:

Ну, это продолжение другой темы.

У меня есть Person таблица с несколькими полями

Таблица представляется пользователю 3 различными способами:

1) в качестве таблицы данных введите описание изображения здесь

2) в виде таблицы введите описание изображения здесь

3) в виде отчета (без рисунка, но похож на таблицу данных)

В форму добавляется специальный тег §Person§ , чтобы выбрать основную прикрепленную таблицу

Кроме того, существует запрос, возвращающий ошибки и их правила форматирования для каждого field в заданном table введите описание изображения здесь

вот фрагмент кода, который я бы использовал для определения правил conditionalformattingrules для каждой формы, отчета, таблицы данных при их загрузке.

     Private Sub Form_Open(Cancel As Integer)
      Call validazione.validate(Form)
    End Sub

    Function validate(aForm As Form)
      Call DeleteFormats(aForm)       ' to remove existing formats
      Call setFormats(aForm)          ' to insert the new formats
    End Function

 

Подраздел SetFormat выглядит следующим образом:

      Sub setFormats(aForm As Form)
      Dim TableName As String, t() As String, ErrSQL As String, ctlName As String
      Dim ErrRst As DAO.Recordset, FormCtl As Control, ctl As Variant
      Dim frmtCount As Integer, Cnt As Integer
      Dim fcdSource As FormatCondition, fcdDestination As FormatCondition
      Dim varOperator As Variant, varType As Variant, x As Variant, y As Variant
      Dim varExpression1 As Variant, varExpression2 As Variant
      Dim intConditionCount As Integer, intCount As Integer

      If Len(aForm.Tag) > 0 And Mid$(aForm.Tag, 1, 1) = "§" Then
        t = Split(aForm.Tag, "§", 1)
        If Len(t(0)) > 0 Then TableName = t(0)
        TableName = Replace(TableName, "§", "")

        ErrSQL = "SELECT * FROM [Q Errori per tabella] WHERE ([TableName] = """ amp; TableName amp; """);"
        Set ErrRst = CurrentDb.OpenRecordset(ErrSQL, , dbReadOnly)

        If ErrRst.EOF Then Exit Sub

    ' ***IT RUNS UNTIL HERE***

          FormCtl = aForm.Controls("CAP")
          y = aForm.Properties(ctlName).Item("Codice Fiscale")


        With ErrRst
            .MoveFirst
            Do Until .EOF
              x = ErrRst.Fields("FieldName")
              Debug.Print x

             ' On Error GoTo fine
              FormCtl = aForm.Controls("CAP")
              FormCtl = aForm.

              On Error GoTo 0
              If FormCtl.ControlType = acTextBox Or FormCtl.ControlType = acComboBox Then
              ' Add the FormatCondition
              Cnt = FormCtl.FormatConditions   1
              FormCtl.FormatConditions.Add acExpression, , .Fields.Item(Cnt).Value

            ' Reference the FormatCondition to apply formatting.
            ' Note: The FormatCondition cannot be referenced
            ' in this manner until it exists.
              Set fcdDestination = ctl.FormatConditions.Item(Cnt).Value

              With FormCtl.FormatConditions.Item(Cnt)
                  .BackColor = Eval("RGB" amp; ErrRst.item("Sfondo").value)
        '         .FontBold = fcdSource.FontBold
        '         .FontItalic = fcdSource.FontItalic
        '         .FontUnderline = fcdSource.FontUnderline
                  .ForeColor = Eval("RGB" amp; ErrRst.item("pen").value)
              End With
            End If
    fine: On Error GoTo 0
        '  Next x
         .MoveNext
       Loop
      End With
     End If
    End Sub

 

*** Ну, это выглядит безумно, но моя проблема заключается в том, как получить доступ к formfield, или reportcolumn, или к столбцу таблицы by name .

Кроме того, я хотел бы иметь только одну функцию для управления всеми тремя параметрами: формой, отчетом и таблицей данных.


Кто-нибудь может помочь? ТИА Паоло

Комментарии:

1. Хорошие примеры экрана, очищены. Пожалуйста, экспортируйте [Q Errori для каждой таблицы] в формате XML (или CSV), который затем можно легко импортировать, и приложите это к этому вопросу. Тогда наше тестирование может дублировать проблему (проблемы).

2. Слишком просто. Результатом является объект, следовательно, его необходимо УСТАНОВИТЬ :: Set FormCtl = AForm.Controls(«CAP»)