Доступ к VBA 2016 — Установите цвет границы для каждого элемента управления, если он пуст

#vba #ms-access-2016

#vba #ms-access-2016

Вопрос:

Я пытаюсь перебрать все текстовые поля / выпадающие списки и изменить цвет их границы на красный, если он пуст. Я пробовал предыдущее решение для использования функции «Handle Focus», но цвет границы меняется только на красный, когда я нажимаю на текстовое поле / поле со списком.

  1. Как изменить цвет границы без необходимости нажимать на нее?
  2. Во-вторых, как мне получить имя метки для отображения в msgbox вместо имени элемента управления?

Предыдущий пример: https://www.access-programmers.co.uk/forums/threads/change-border-color-of-textboxes-when-they-have-focus.246363/

 Public Function validateCase() As Boolean
Dim ctrl As Control

For Each ctrl In Me.Controls
    If IsNull(ctrl) Then
        If TypeOf ctrl Is TextBox Or TypeOf ctrl Is ComboBox Then
            MsgBox (ctrl.Name amp; " is Empty")
            ctrl.OnGotFocus = "=HandleFocus([" amp; ctrl.Name amp; "], True)"
        End If
    End If
Next ctrl    
End Function

Public Function HandleFocus(ByRef ctrl As Control, ByVal blnFocus As Boolean)
If blnFocus = True Then
    ctrl.BorderColor = RGB(255, 0, 0)
Else
    ctrl.BorderColor = RGB(0, 0, 0)
End If
End Function
 

Ответ №1:

 ctrl.LabelName.caption
 

Измените LabelName на имя вашей метки

Ответ №2:

Короткое замечание к вашему собственному ответу на вопрос о границе: нет абсолютно никаких причин устанавливать фокус перед установкой цвета границы. Вы неправильно поняли цель вопроса, на который вы ссылались: идея заключалась в том, чтобы изменить цвет границы, когда элемент управления попадает в фокус.
Обратите внимание, что вы должны задавать только один вопрос за раз в Stackoverflow. Если вам нужно знать две вещи, задайте два отдельных вопроса.


Чтобы найти метку текстового поля (или аналогичного элемента управления), используйте controls-свойство элемента управления. Метка сохраняется как controls(0) . Следующие 2 функции извлекают элемент управления label для соответствующего элемента управления. это заголовок:

 Function getLabelCaption(ctrl As Control) As String
    Dim ctrlLabel As label
    Set ctrlLabel = getLabel(ctrl)
    If Not ctrlLabel Is Nothing Then getLabelCaption = ctrlLabel.Caption
End Function

Function getLabel(ctrl As Control) As label
    On Error Resume Next
    If TypeName(ctrl.Controls(0)) = "Label" Then
        Set getLabel = ctrl.Controls(0)
    End If
    On Error GoTo 0
End Function
 

В вашем коде вы могли бы использовать что-то вроде

 Dim caption as String
caption = getLabelCaption(ctrl)
MsgBox Iif(caption = "", ctrl.name, caption) amp; " is Empty")
 

Ответ №3:

У меня есть частичный ответ.

Я решил первый вопрос, добавив строку ctrl.SetFocus сразу после ctrl.OnGotFocus .

У меня нет решения для второго вопроса.