Excel – изменение BackColor текстовых полей UserForm и ComboBoxes с помощью VBA

Я просто изучаю VBA и использовал код из старой книги (Excel 2010). Возможно, Excel 2016 имел некоторые изменения, которые заставляют этот код больше не работать.

Я не получаю ошибку компиляции для класса или Subs. Поведение заключается в том, что ничего не происходит. Предполагается, что BackColor как ComboBox, так и TextBox должен менять цвет, как если бы он фокусировался или фокусировался.

Как я уже сказал, по какой-то причине, когда я запускаю код, ничего не происходит. Ошибок или предупреждений не возникает, так что код работает, а затем ничего не делает.

Вот мой код. Комментарии должны дать понять. Я надеюсь, кто-то может объяснить мне, что происходит, и почему этот код не приводит к изменениям цвета, поскольку фокус меняется, когда я просматриваю UserForm.

Этот первый блок кода является автономным модулем класса, называемым «clsCtlColor»,

Public Event GetFocus() Public Event LostFucus(ByVal strCtrl As String) Private strPreCtr As String 'Base Class for chaging Backcolor of ComBoxes and TextBoxes when focus is changed. Public Sub CheckActiveCtrl(objForm As MSForms.UserForm) With objForm If TypeName(.ActiveControl) = "ComboBox" Or _ TypeName(.ActiveControl) = "TextBox" Then strPreCtr = .ActiveControl.Name 'On Error GoTo Terminate Do DoEvents If .ActiveControl.Name <> strPreCtr Then If TypeName(.ActiveControl) = "ComboBox" Or _ TypeName(.ActiveControl) = "TextBox" Then RaiseEvent LostFucus(strPreCtr) strPreCtr = .ActiveControl.Name RaiseEvent GetFocus End If End If Loop End If End With Terminate: Exit Sub End Sub 

Следующие Subs находятся в коде UserForm

 Option Explicit Private WithEvents objForm As clsCtlColor '********************************************************************************************************************* '*Subs for managing the BackColor of comboxes and TextBoxes depending on focus.*************************************** '********************************************************************************************************************* 'initializes the Userform with the clsCtlColor class Private Sub UserForm_Initialize() Set objForm = New clsCtlColor End Sub 'Changes the BackColor of the Active Control when the form is activated. Private Sub UserForm_Activate() If TypeName(ActiveControl) = "ComboBox" Or _ TypeName(ActiveControl) = "TextBox" Then ActiveControl.BackColor = &H99FF33 End If objForm.CheckActiveCtrl Me End Sub 'Changes the BackColor of the Active Control when it gets the focus. Private Sub objForm_GetFocus() ActiveControl.BackColor = &H99FF33 End Sub 'Changes the BackColor back to white when the control loses focus. Private Sub objForm_LostFocus(ByVal strCtrl As String) Me.Controls(strCtrl).BackColor = &HFFFFFF End Sub 'Clears the objForm when the form is closed. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Set objForm = Nothing End Sub 

В модуле класса это заявление об ошибке, которое завершает Sub при возникновении ошибки. Тем не менее, я прокомментировал это и все еще не вижу ошибок компиляции. Поэтому я могу только заключить, что это проблема времени выполнения.

Любая помощь приветствуется.

ОБНОВИТЬ:

Если я использую эти два субмастера в TextBox, я получаю эффект, который я ищу:

 Private Sub TextBox1_Enter() TextBox1.BackColor = RGB(153, 255, 51) End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox1.BackColor = RGB(255, 255, 255) End Sub 

Я ненавижу об этом, так это то, что у моего UserForm есть более сотни текстовых полей, и мне нужно будет написать эти два подмножества для каждого TextBox – так, как 200 ++ Subs!

Я все еще пытаюсь получить выше общий подход к работе.
Одна вещь, которую я заметил, это то, что если я изменю значения RGB в двух поднаборах выше на значения Hex, они перестанут работать. Я попытался изменить шестнадцатеричные значения цвета в более общем подходе к RGB, но это не имело никакого значения.

Еще одно обновление:

Было указано, что у меня была опечатка в классе LostFucus . Я изменил это в двух местах на LostFocus . Однако код по-прежнему не работает. Тогда возник вопрос: был ли мой код в модуле пользовательской формы. Это. Затем я попробовал эксперимент. Я создал новую Рабочую книгу и импортировал код в совершенно новый класс и пользовательскую форму. Я добавил три текстовых поля. Абракадабра! Это сработало! Однако это не работает в том виде, в котором я хочу, чтобы он работал. Я просмотрел свойства самой формы и текстовых полей, и я не вижу ничего другого между моей формой и фиктивной формой.

Это должно быть что-то очень просто, я уже смотрю!

После того, как я сильно поцарапал голову и кричал на моем бедном мониторе, я наконец нашел решение, но на данный момент я полностью разочарован в Microsoft за странность работы с UserForms. Вот что поставило проблему:

Я еще не установил порядок вкладок!

Я понял, что на вкладке была открыта моя форма с первой установкой табуляции, установленной для TextBox в MultiPage в моей форме. Я установил порядок табуляции, чтобы первый TextBox был активен в UserForm, и все работает с раскраской на основной части формы.

Вот где, на мой взгляд, начинается странность.

Когда последний TextBox в основной части формы достигнут и нажата вкладка, выбирается сама многостраничная страница. Только после того, как вы нажмете вкладку во второй раз, это первый TextBox в пределах выбранной MultiPage, а затем цвета не применяются, так как они находятся в основном корпусе формы. Тот же сценарий справедлив и для Frames. Кроме того, нет простого способа просто перейти от конца страницы 1 к началу страницы 2.

Это очень разочаровывает меня, потому что я бы подумал, что это не так. Я ПРИНИМАЮ, Я мог бы настроить 1000 TextBoxes, использовать Frames и Multipage для упорядочивания вещей (ТАК МОЖЕТ ОСУЩЕСТВИТЬ ОКНО НА ОДНОМ РАЗМЕРЕ И НЕ ПРОПУСКАТЬ ФОРМУ ВВЕРХ И ВНИЗ), а затем установить порядок табуляции, который будет перемещать ВСЕ TextBoxes, независимо от того, в какой организации они находятся. Я предположил, что это будет так, потому что он делает SENSE! Я хочу щелкнуть первый текстовый блок и просто не прикасаться к мыши, пока форма не будет полностью заполнена. В противном случае, нет смысла прилагать усилия к созданию UserForm! Я мог бы указать и щелкнуть по электронной таблице без хлопот проектирования формы и написания кода!

Какой облом!

Полагаю, я могу «сделать так!» написав кучу кода, чтобы перейти от контейнера к контейнеру … MICROSOFT – Это не должно быть так ужасно и глупо!

  • Добавление текстовых и текстовых значений в ячейку
  • Автоматическое заполнение текстового поля в Excel VBA
  • Возвращаемое значение в текстовом поле из Combobox в Excel
  • Excel VBA Userform Textbox - выделение изменений, сделанных в разных цветах шрифта
  • Значение по умолчанию для текстового поля VBA Userform и выделено
  • Скопировать и вставить содержимое из текстового поля в диапазон ячеек рабочего листа?
  • Как использовать данные, введенные в пользовательскую форму в основном модуле
  • Диалоговое окно WPF modess из надстройки MS Excel
  • Написание кода / макроса Excel VBA для заполнения текстовых полей Powerpoint с значениями ячейки Excel
  • Код VBA / Macro для получения значения текстового поля
  • Размер текста Excel / PowerPoint после сжатия
  • Давайте будем гением компьютера.