Индикатор выполнения с использованием VBA
Я работаю над таблицей Excel с помощью VBA: я пытаюсь проверить индикатор выполнения. Я уже закончил дизайн, как показано ниже:
Ниже userForm
код:
'PLACE IN YOUR USERFORM CODE
Private Sub UserForm_Initialize()
#If IsMac = False Then
'hide the title bar if you're working on a windows machine. Otherwise, just display it as you normally would
Me.Height = Me.Height - 10
HideTitleBar.HideTitleBar Me
#End If
End Sub
Ниже Module
код:
'PLACE IN A STANDARD MODULE
Sub LoopThroughRows()
Dim i As Long, lastrow As Long
Dim pctdone As Single
lastrow = Range("A" & Rows.Count).End(xlUp).Row
'(Step 1) Display your Progress Bar
ufProgress.LabelProgress.Width = 0
ufProgress.Show
For i = 1 To lastrow
'(Step 2) Periodically update progress bar
pctdone = i / lastrow
With ufProgress
.LabelCaption.Caption = "Processing Row " & i & " of " & lastrow
.LabelProgress.Width = pctdone * (.FrameProgress.Width)
End With
DoEvents
'--------------------------------------
'the rest of your macro goes below here
'
'
'--------------------------------------
'(Step 3) Close the progress bar when you're done
If i = lastrow Then Unload ufProgress
Next i
End Sub
Когда я запускаю код, я получаю такую ошибку:
И когда я нажимаю на Debug
, он подчеркивает это:
ufProgress.LabelProgress.Width = 0
Дополнительная информация
Имя UserForm - (ufProgress). Метка в верхнем левом углу UserForm, которая будет использоваться для отображения текста, указывающего имя статуса (LabelCaption)... И фрейм в имени UserForm (FrameProgress).. Finlay, еще одна метка, который будет расти, название индикатора (LabelProgress)..
Любой совет...
С уважением
1 ответ
Пользовательская форма в VBA - это объект, и вам необходимо создать экземпляр объекта, прежде чем вы сможете его использовать. Но этот факт хорошо скрывается поведением VBA по созданию экземпляра пользовательской формы по умолчанию, если вы обращаетесь к нему через имя класса (имя формы).
Предположим, у вас есть форма с именем Form1
и ты пишешь Form1.Show
: VBA создаст экземпляр формы и отобразит его.
Альтернативный вариант - объявить переменную типа формы, создать ее вручную и затем работать с этой переменной:
Dim ufProgress as Form1
set ufProgress = new Form1
ufProgress.Show
Обычно лучше сделать последнее, но в вашем особом случае вы можете продолжить с экземпляром по умолчанию - поскольку форма используется только для отображения (если вы вводите данные в форму пользователя и хотите что-то с ними сделать, используя экземпляр по умолчанию может привести к неожиданным проблемам).
Тем не менее, учитывая, что ваша форма называется "Form1", вы можете решить проблему,
а) переименуйте форму в ufProgress
б) заменить ufProgress
с участием Form1
в вашем коде
(в обоих случаях вы получите доступ к автоматически сгенерированному экземпляру формы)
c) Используйте приведенный выше фрагмент кода.
Обновление - после получения дополнительной информации:
строка, отображаемая в отладчике, вводит в заблуждение, заявление о виновности (скорее всего) находится в пределахUserForm_Initialize
-код формы, но отладчик не останавливается на достигнутом, пока вы не сообщите ему об этом: в редакторе VBA откройте окно параметров (Инструменты-> Параметры), выберите вкладку "Общие" и выберите "Разбить модули классов". Я бы предположил, что командаHideTitleBar.HideTitleBar Me
выдает эту ошибку. Либо удалите эту строку (и живите с тем фактом, что форма показывает ее заголовок), либо найдите определение дляHideTitleBar
.