Индикатор выполнения с использованием 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.

Другие вопросы по тегам