ListBox не будет отображать подсветку, так как выбор не был сделан. Когда выбор не был сделан, ListBox не имеет Value
(Text
). Если вы назначите Value
программно, он будет подсвечен автоматически. Если вы назначите значение, отсутствующее в списке, произойдет ошибка.
Попробуйте использовать событие Worksheet_Activate для установки значения.
Private Sub Worksheet_Activate()
On Error Resume Next
ActiveSheetDisplay.Text = ActiveSheet.Name
End Sub
Оператор On Error имеет функция предотвращения взлома sh, если ActiveSheet по какой-либо причине нет в списке.
Вышеуказанная идея была реализована в решении, представленном ниже. Вам нужно будет адаптировать его части для использования имен переменных, с которыми вы уже знакомы.
- У вас должна быть форма пользователя. Я назвал мой MyForm . Замените имя в моем коде тем, которое вам больше нравится, где бы оно ни появлялось.
- My MyForm имеет ListBox с именем
ListBox1
. Замените имя в моем коде тем, которое вам больше нравится, где бы оно ни появилось. Установите следующие 3 процедуры в стандартном модуле кода.
Sub ShowMyForm () 'Variatus @STO 21 Фев 2020
Dim UForm As MyForm
If FormIndex = True Then ' prevents creation of several instances
Debug.Print "New form"
Set UForm = New MyForm
UForm.Show vbModeless
End If
Конец Sub
Sub RefreshMyForm () 'Variatus @STO 21 февраля 2020
Dim i As Integer
i = FormIndex
If i > -1 Then
UserForms(i).ListBox1.Text = ActiveSheet.Name
End If
Конец Sub
Частная функция FormIndex () As Integer 'Variatus @STO 21 февраля 2020 г.
Dim i As Integer
For i = UserForms.Count To 1 Step -1
If UserForms(i - 1).Name = "MyForm" Then Exit For
Next i
FormIndex = i - 1
Функция завершения
Эта процедура входит в модуль кода ThisWorkbook
.
Private Sub Workbook_Open () 'Variatus @STO 21 февраля 2020 ShowMyForm End Sub
Процедура, приведенная ниже, входит в модуль кода пользовательской формы. Вы можете настроить способ заполнения списка, чтобы исключить некоторые листы, но важно установить переменную V
, чтобы указать текущий активный лист.
Private Sub UserForm_Initialize () 'Variatus @STO 21 февраля 2020 г.
Dim Ws As Worksheet
Dim Arr() As String
Dim V As Integer
Dim i As Integer
With Worksheets
ReDim Arr(1 To .Count)
For i = 1 To .Count
Arr(i) = .Item(i).Name
If .Item(i) Is ActiveSheet Then V = i
Next i
End With
With ListBox1
.List = Arr
.ListIndex = V - 1
End With
End Sub
Наконец, эту процедуру необходимо установить в листе кодов каждого листа, указанного в списке.
Private Sub Worksheet_Activate () 'Variatus @STO 21 февраля 2020 г.
RefreshMyForm
End Sub
Теперь, чтобы собрать все воедино: Когда рабочая книга открыта, процедура ShowMyForm
вызывается. Если после этого форма была случайно удалена, вы можете восстановить ее, вызвав ту же процедуру или процедуру события Workbook_Open
(которую также можно вызвать с помощью F5). Если ShowMyForm
вызывается повторно, он откажется открывать более одного экземпляра формы.
Когда форма показывается, запускается процедура события Initialize. Эта процедура перечисляет листы в списке и устанавливает текущий ActiveSheet.
При смене листов активируется новый лист и происходит событие Worksheet_Activate. Процедура относительного события вызывает событие Initialize ListBox, сбрасывая список.
Когда вы выбираете другой лист из списка, он активируется этой процедурой в кодовой таблице UserForm. Тем не менее, я думаю, что у вас уже есть.
Private Sub ListBox1_Click()
' Variatus @STO 21 Feb 2020
Worksheets(ListBox1.Value).Activate
End Sub