Можно ли заморозить Excel, пока я что-то обрабатываю? - PullRequest
2 голосов
/ 18 января 2012

Можно ли заморозить Excel, пока я что-то обрабатываю?Я использую 2007. Я уже знаю, что замораживание обновления листов из VBA возможно, но я ищу небольшую остановку всего этого (с курсором ожидания и, возможно, чем-то хорошим, например затемнение окна или что-то в этом роде).

Кто-нибудь когда-нибудь пробовал подобное с VBA?

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Кто-нибудь когда-нибудь пробовал такое с VBA?

Да. В зависимости от вида обработки, которую я делаю, я либо скрываю приложение Excel целиком, либо показываю пользовательскую форму с обновлением прогресса, чтобы избежать вмешательства пользователя

Пример 1 (скрытие приложения)

Option Explicit

Sub Sample()
    Application.Visible = False

    '~~> Rest of the code

    Application.Visible = True
End Sub

Пример 2 (Использование пользовательской формы, у которой отключен «X»)

Создайте пользовательскую форму и поместите туда этот код

Option Explicit

Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Const MF_BYPOSITION = &H400&

Private Sub UserForm_Initialize()
    Dim lHwnd As Long

    lHwnd = FindWindow("ThunderDFrame", "Please Wait...")

    Do While lHwnd = 0
        lHwnd = FindWindow("ThunderDFrame", "Please Wait...")
        DoEvents
    Loop

    RemoveMenu GetSystemMenu(lHwnd, 0), 6, MF_BYPOSITION
End Sub

'~~> The below code will not be there
'~~> This is just there so that if you try the above code then you can exit the form
Private Sub UserForm_Click()
    Unload Me
End Sub

И использование будет таким

Option Explicit

Sub Sample()
    UserForm1.Show vbModeless

    '~~> Rest of the code

    Unload UserForm1
End Sub
1 голос
/ 23 января 2012

Чтобы заморозить Excel во время обработки, установите для screenupdating значение false.Обязательно верните его значение true, когда вы закончите, иначе пользователь не сможет взаимодействовать с Excel.В дополнение к тому, что вы не пугаете своих пользователей движением и мерцанием на экране, это значительно ускоряет обработку.

Sub Sample()
    Application.ScreenUpdating = False

    '~~> Rest of the code

    Application.ScreenUpdating= True
End Sub

Я согласен с JMax, что индикатор выполнения - отличный вариант.Здесь вы можете найти несколько различных индикаторов выполнения Excel VBA: http://spreadsheetpage.com/index.php/blog/progress_bars_the_movie/

Кстати, вы можете пропустить фильм и перейти по ссылкам ниже.Вам может показаться, что фильм смешной, но все, что он говорит, это «индикаторы прогресса = хорошо, крутятся вещи = плохо».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...