Заставка при открытии книги Excel

Этот прием позволит Вам выводить на экран окно-заставку при открытии любой заданной книги в Excel.

splash.png

Заставка появляется сразу после открытия файла и автоматически исчезает через несколько секунд.

Шаг 1. Создаем экранную форму

Откройте редактор Visual Basic - в старых версиях Excel это можно сделать через меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor), а в новых кнопкой Visual Basic на вкладке Разработчик (Developer) и создайте новую форму, используя команду меню Insert - UserForm. Появится пустая серая оконная форма будущей заставки. Добавим на нее изображение при помощи панели инструментов Toolbox (если у вас ее не видно, то зайдите в меню View - Toolbox):

splash2.jpg

Нажмите кнопку Image и растяните на форме прямоугольник - в него будет помещено фоновое изображение. Затем на панели инструментов Properties (если у вас ее не видно, то выберите в меню View - Properties) задайте выберите файл картинки в поле Picture:

splash3.gif

Возможно, придется немного изменить размер формы, чтобы изображение уместилось полностью. Чтобы написать на форме текст, можно использовать элемент управления Label с панели Toolbox.

Ну, и наконец, выделив предварительно всю форму, можно задать текст в строке заголовка, используя свойство Caption в панели Properties:

splash4.gif

В итоге у вас должно получиться нечто подобное:

splash5.jpg

Шаг 2. Добавляем управляющий код

Щелкните правой кнопкой мыши по форме и выберите View Code. В открывшийся модуль формы добавьте такой код:

 
Private Sub UserForm_Activate() 
   Application.OnTime Now + TimeValue("00:00:05"), "KillTheForm" 
End Sub

Откройте модуль ЭтаКнига в левом верхнем углу (если ее не видно - отобразите соответствующее окно через меню View - Project Explorer) и добавьте в него следующий код:

 
Private Sub Workbook_Open() 
   UserForm1.Show 
End Sub
 

И, наконец, вставьте обычный модуль (Insert - Module) и скопируйте туда это:

 
Private Sub KillTheForm() 
   Unload UserForm1 
End Sub 

Все. Можно закрывать редактор Visual Basic, сохранять файл и пробовать закрыть-открыть книгу...

Как это работает?

При открытии книги Excel выполняет процедуру Workbook_Open из модуля ЭтаКнига. Эта процедура отображает на экране нашу форму-заставку. При отображении формы запускается процедура UserForm_Activate, которая с задержкой в 5 секунд запускает макрос KillTheForm, который убирает форму с экрана.

Ссылки по теме

 



08.08.2013 11:17:42
Привет! Отличный макрос, только если отчет с этим макросом открывать из письма Outlook высвечивается следующая ошибка: Run-time error '1004': Metod 'Ontime' of object '_Application' faild.

Когда сохраняешь файл на компьютер - этой ошибки нет. Можно это как-то исправить?

Заранее спасибо!  
28.12.2013 11:09:38
Скорее всего, это защита от макровирусов в Outlook. Сначала сохраните файл на диск из сообщения, а потом открывайте (с разрешением макросов).
01.10.2013 15:09:11
сделала все (каждый шаг), но ничего при открытии не показывается...
11.11.2013 22:17:44
привет! Схрани документ в Формате "с поддержкой макросов", после чего снова открой его, запусти через Run. Если ошибки посмотри внимательно, возможно пропущена буква.Еще как вариант рисунок в другое место убежал.
27.12.2013 11:08:33
Ругается:
Private Sub Workbook_Open()
  UserForm1.Show
End Sub
28.12.2013 11:08:06
Проверьте наличие формы UserForm1. Вы ее не переименовывали, часом?
16.01.2014 18:48:30
Здравствуйте, а сменить картинку можно после?
15.02.2014 23:15:28
Здравствуйте! Можно ли как-то сделать, чтобы рамок формы не было и заставка открывалась на всю страницу?
28.02.2014 11:29:46
Добрый день!

Попробовал это упражнение.
Результат такой: в Excel 2010 все отлично работает.
А в 2013 - проходят отмеренные 5 секунд и выскакивает ошибка "Run-time error '424' Object required"

При попытке отладить подсвечивается последняя строчка End Sub в модуле KillTheForm.

Единственное, что я переименовал UserForm1 в Hello и дважды заменил его название в коде.
Попробовал без переименования - все работает.
Подскажите, пожалуйста, в чем моя ошибка?
31.03.2014 09:29:27
КЛАСС!!!!! Спасибо, все работает
22.04.2014 20:23:13
Добрый день! Подскажите пожалуйста, а можно такую табличку с 5-секундной задержкой назначить на кнопку формы? Т.е. мне надо напечатать документ из разработанного модуля, в нем  есть кнопка с назначенным макросом на печать документа - шаблона, и вот было бы здорово чтобы еще "выскакивала" информационная заставка - "Идет печать!" ....можно так? Спасибо!!!
07.05.2014 12:29:08
Вот команда, которая делает пятисекундную паузу в коде:
Application.Wait (Now + TimeValue("0:00:05"))
10.06.2014 11:53:33
Добрый день в моем модуле уже используется  Private Sub Workbook_Open(), при сохранении ругается на неоднозначное имя. Что можно придумать? Спасибо
19.07.2015 10:41:43
Не должно быть нескольких процедур с одинаковыми именами - проверяйте код :)
16.09.2014 14:42:17
Я не могу сделать первый шаг, кнопка toolbox серым цветом, никак не нажать ее
14.02.2015 04:27:05
У меня такая проблемка... не знаю как вставить не заставку а свою таблицу с определенними даными, тоисть при включении мне ее показывать должно.... данные меняэтся каждый день.... как мне сделать ссылку на ячейку что ли?
24.03.2015 15:59:04
Спасибо, всё отлично работает. Excel 2007.
Скажите, а как сделать, чтобы форму нельзя было закрыть, пока она сама не закроется?
16.07.2015 14:21:11
Добрый день, не могли бы вы подсказать, почему при добавлении такой заставки мог поломаться автобэкап, созданный полностью по уроку:
Создание резервных копий ценных файлов   Поломался он так, что не выдает никаких ошибок, просто не появляется файл в папке сохранения.

Наверно это что-то связанное с созданием Userform, и конфликтом в исполнении модуля с бекапом и формы. Сначала я переименовал форму, естественно, поменяв все необходимые ссылки на неё в текущей книге и модуле2. Обнаружил проблему с бэкапом. Подумал, решил, может быть, макросы выполняются при запуске в иерархичном порядке, переименовал userform так, чтобы в списке модулей он отображался позже модуля бэкапа. Не помогло. Возникла следующая идея. Удалил модуль2, относящийся к картинке, макрос оттуда добавил в модуль1(бэкап). Тоже не помогло. Картинка как работала, так и работает, но бэкап не сохраняется. Новых идей у меня, к сожалению, пока не возникло. Походу придется удалять заставку, так как функция бэкапа, объективно, важнее всяких картиночек.

Николай, обращаюсь к вам за советом, может быть вы знаете, в чем проблема, и надеюсь, что вы увидите и ответите. Заранее спасибо.

upd. Вопрос решил, добавив в макрос в ЭтаКнига строку Module1.auto_open.

p.s. Я тыкаюсь в vba как слепой котенок, но чаще всего это приносит свои плоды.
18.07.2015 10:04:08
Добрый день, а защитил  макрос, во время закрывание книг, спрашивает VBA пороль.
Подскажите, пожалуйста, в чем моя ошибка?

И еще, в модулье ЭтаКнига у меня ранше был вот токой запис.

Private Sub Workbook_Open()
Const MY_COMPUTERNAME = "DELL-PC2"
If Environ$("COMPUTERNAME";) <> MY_COMPUTERNAME Then
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
End If
End Sub

которой проверяет имя компютера, при несовподание, закрывает книгу.
как написать модуль, чтобы в месте работали?
19.07.2015 10:43:38
Что такое "VBA пороль"?
20.07.2015 10:20:13
Я зашитил Visual basic (через меню Tools - VBAProject Properties)
27.10.2015 18:29:02
Здравствуйте! Что то у меня ни чего не получилось. При повторном открытие пишет ошибку.

Run-Time error 424:
Objekt required
15.12.2015 15:22:15
Я подобным образом создал кнопки в UserForm но не могу понять как мне их отобразить на листе!
[url=http://nick-name.ru/nickname/id1208315/][img]http://nick-name.ru/forum/i72.gif[/img][/url];
28.12.2015 09:35:49
Всем доброго дня!

Кроме заставки, можно еще сделать приветствие пользователя голосом.
Не могу сказать точно с какой версии Win это работает, но у меня на Win8-10 работат 100%.

Для этого нам нужен Microsoft Speech API (SAPI) 5.3

Простая процедура позволит приветствовать пользователя по заданному имени:
Sub voiceHello()
    Dim uNm$, sAPI As Object
    uNm = "Иванов Иван Иванович"
    Set sAPI = CreateObject("sapi.spvoice")
    sAPI.Speak "Привет " & uNm
    Set sAPI = Nothing
End Sub
При запуске этой процедуры система нам голосом скажет "Привет Иванов Иван Иванович".
Вот так просто ))

Событие можно повесить на открытие книги, соответственно при открытии книга будет приветствовать вас голосом...

Если одна общая книга используется многими пользователя, то можно использовать функционал получения имени пользователя из переменной окружения (например - username), в этом случае имя будет например такое - "Ivanov.Ivan".
Также при наличии ActiveDirectory можно получать данные напрямую из AD с помошью вот такой функции (нашел ее где-то на просторах интеренета):

Function GetADInfo(ByVal SearchField, ByVal SearchString, ByVal ReturnField)
    Dim adoCommand, strDomain$, objConnection, objRecordSet, objCommand
    On Error Resume Next
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open "Provider=ADsDSOObject;"
    strDomain = "dc=company,dc=name" ' здесь нужно вписать правильное имя домена
    Set adoCommand = CreateObject("ADODB.Command")
    adoCommand.ActiveConnection = objConnection
    adoCommand.CommandText = "<LDAP://" & strDomain & ">;(&(objectCategory=" & "User" & ")" & "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"
    Set objRecordSet = adoCommand.Execute
    If objRecordSet.RecordCount = 0 Then
        GetADInfo = "N/A" ' если пользователь не найден - выводим N/A
        Else
        GetADInfo = objRecordSet.Fields(ReturnField)
    End If
    objConnection.Close
    Set objRecordSet = Nothing
    Set objCommand = Nothing
    Set objConnection = Nothing
End Function 
И в результате мы получим вот такую процедуру, которая получает текущее имя пользователя (с компьютера которого открывается книга) и приветствует пользователя по имени, полученному из ActiveDirectory:

Sub voiceHelloAD()
    Dim uNm$, eUnm$, sAPI As Object
    eUnm = Environ$("username") ' получаем имя пользователя из переменной окружения
    uNm = GetADInfo("sAMAccountName", eUnm, "sn") ' получаем данные из AD (только имя), ФИО-замените sn на name
    Set sAPI = CreateObject("sapi.spvoice")
    sAPI.Speak "Привет " & uNm
    Set sAPI = Nothing
End Sub
Всем удачи и с наступающим!!!
17.01.2016 11:25:36
Ещё хочу заметить, что добавлять Picture из Тулбокса не обязательно - картинку можно добавлять в свойство самой формы "Picture"
22.02.2016 19:41:53
Николай, добрый день!
Попытался повторить ваш пример, но, видать, что-то получилось как всегда :( и у меня на служебном компе появляется картинка, а вот скрываться не хочет. Попытался удалить файл, но все тоже самое происходит и с другими книгами экселя. В другой книге попробовал удалить макрос, но похоже удалил начальный макрос экселя. Теперь, что не запущу появляется картинка и ни одна книга не открывается нормально с той информацией которая в ней была. Помогите, пожалуйста, как восстановить первичные настройки и удалить нацарапанный мной макрос?
Заранее благодарен.
11.02.2017 23:55:12
Доброго времени суток! Как сделать так что бы в начале запустилась форма, как приветствие, а потом открылась книга?
A G
25.03.2017 23:08:22
Привет! Добавил заставку в PLEX, теперь при открытии любой книги появляется ;)
24.04.2017 04:00:36
Здравствуйте, Николай, хочу у Вас спросить как не профессионал у профессионала, возможно ли сделать последовательность вылета таких  Userforms одной за другой, а после эксель сам закрылся, чтобы была как открытка? Заранее благодарен.  
26.04.2017 14:47:53
Здравствуйте, Николай. Благодарю за информацию о данном приеме.
06.02.2019 12:24:15
:)Все работает. Спасибо!
Наверх