1

Тема: Макрос Word для появления самогаснущего окна

Здравствуйте!
Есть макрос (даже не макрос, а целый модуль), который вызывает диалоговое окно, а потом оно само гаснет. Можно задать время отображения.
Раньше модуль отлично работал, а тут стал выдавать ошибку. То ли из-за перехода с 32-битной системы на 64-битную, то ли еще от чего.
Может быть, таймер по-другому надо вызывать. Я слабоват в этом деле.
Подскажите, пожалуйста, что надо исправить.
Код модуля такой:

'To display a timed Msgbox use the MsgboxOKDrop routine given below.
'By Andrew Baker

Option Explicit

'API calls for Msgbox2. Must be placed in a standard module
Declare PtrSafe Function SetTimer Lib "user32" (ByVal Hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare PtrSafe Function KillTimer Lib "user32" (ByVal Hwnd As Long, ByVal nIDEvent As Long) As Long
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
Private zsMessageTitle As String, lTimerId As Long

'Purpose     :  Stops the timer routine
'Inputs      :  N/A
'Outputs     :  Returns True if the timer routine was stopped
'Author      :  Andrew Baker
'Date        :  15/10/2000 15:24
'Notes       :  Code must be placed in a module
'Revisions   :

Function EndTimer() As Boolean
    If lTimerId Then
        lTimerId = KillTimer(0&, lTimerId)
        lTimerId = 0
        EndTimer = True
    End If
End Function

'Purpose     :  Starts the continuous calling of a private routine at a specific time interval.
'Inputs      :  lInterval           The interval (in ms) at which to call the routine
'Outputs     :  N/A
'Author      :  Andrew Baker
'Date        :  15/10/2000 15:30
'Notes       :  Code must be placed in a module
'Revisions   :

Sub StartTimer(lInterval As Long)
    If lTimerId Then
        'End Current Timer
        EndTimer
    End If
    lTimerId = SetTimer(0&, 0&, ByVal lInterval, AddressOf TimerRoutine)
End Sub

'Purpose     :  Routine which is called repeatedly by the timer API.
'Inputs      :  Inputs are automatically generated.
'Outputs     :
'Author      :  Andrew Baker
'Date        :  15/10/2000 15:32
'Notes       :
'Revisions   :

Private Sub TimerRoutine(ByVal lHwnd As Long, ByVal lMsg As Long, ByVal lIDEvent As Long, ByVal lTime As Long)
    Const WM_CLOSE = &H10
    Dim lHwndMsgbox As Long

    'Find the Msgbox
    lHwndMsgbox = FindWindow(vbNullString, zsMessageTitle)
    'Close Msgbox
    Call SendMessage(lHwndMsgbox, WM_CLOSE, 0, ByVal 0&)
End Sub

'Purpose     :  Extended version of Msgbox, has extra parameter to set time msgbox is displayed for
'Inputs      :  As per Msgbox
'               [DisplayTime]               The time in MS to display the message.
'Outputs     :  As per Msgbox
'Author      :  Andrew Baker
'Date        :  03/01/2001 13:23
'Notes       :
'Revisions   :

Function MsgboxOKDrop(Prompt As String, Buttons As VbMsgBoxStyle, Title As String, Optional DisplayTime As Long = 3000) As VbMsgBoxResult
    If DisplayTime > 0 Then
        'Enable the timer
        StartTimer DisplayTime
        zsMessageTitle = Title
    End If
    MsgboxOKDrop = MsgBox(Prompt, Buttons, Title)
    'Stop the timer
    EndTimer
End Function

Само сообщение вызывается таким кодом:

Sub СамогаснущееОкно()
    lRetVal = MsgboxOKDrop("Это окно должно само погаснуть!" & vbCrLf & "Сейчас, через 5 секунд, окно погаснет!", vbOKOnly + vbInformation, "Самогаснущее окно", 5000)
End Sub

При отладке ошибка выскакивает на строке выделенной желтым.
Фото прилагаются.

Post's attachments

Гаснущие окна 1.png 15.45 Кб, 1 скачиваний с 2017-09-26 

You don't have the permssions to download the attachments of this post.

2

Re: Макрос Word для появления самогаснущего окна

auto-teacher пишет:

. . .
Подскажите, пожалуйста, что надо исправить.
. . .

Добрый день. Да, к сожалению, в 64-битном офисе это не работает, там надо по-другому объявлять внешние системные программы (используя PtrSafe и т.д.). Все примеры почему-то приводят для Excel и часто программный код завязан на проблемах разработки Excel-приложений.
Некоторые предлагают использовать WSH-скрипты (см.напр., внешняя ссылка, но работают они не стабильно.
Я сам, намучившись с этой же проблемой самозакрывающихся сообщений, я решил "взяться за старое", а именно, вернуться к UserForm'ам VBA. Идеи можно почерпнуть на той же странице.
Подход простой: использовать для тела сообщения форму с кнопкой ОК. При активации формы стартует таймер на заданное пользователем время. Если до истечения этого времени пользователь не нажмет ОК, то форма закроется по таймеру. 
Чтобы все это работало, надо импортировать форму и отдельно модуль (все материалы в прицепе). В модуле есть тестовый пример.
Чем хорош подход - больше возможностей для оформления сообщения: можно добавить картинку, раскрасить фон формы и т.д. Проверьте, пжл, на 64-х разрядном офисе.

Post's attachments

OKMsgBox_UserForm_Based_Solution.rar 1.34 Кб, 3 скачиваний с 2017-09-27 

You don't have the permssions to download the attachments of this post.

3

Re: Макрос Word для появления самогаснущего окна

Здравствуйте, yshindin!
Спасибо за совет!
На основном компе с установкой 32-битного Офиса на 64-битную систему кроме указанной появились и другие. Например, пришлось заменить это:

Private Declare Function

на это:

Declare PtrSafe Function

На другом у меня стоит все 64-битное. Там я на днях обязательно тоже испробую все Ваши советы.
На сайте (по Вашей ссылке) я почитаю с переводом и разберусь попозже, может быть, будет работать.
***
Я так понял, что Вы предлагаете другой способ вызвать самогаснущее окно, да еще с параметрами. Я это хочу на и на 32-битном испытать.
Но все-таки, подскажите по шагам, как и куда мне импортировать три файла из архива в шаблон normal.dotm, чтобы я не напутал. Я же слабоват...

4

Re: Макрос Word для появления самогаснущего окна

Почему-то в архиве файл *.bas не распаковывается.

Post's attachments

Ошибка в архиве.png
Ошибка в архиве.png 4.25 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

5

Re: Макрос Word для появления самогаснущего окна

auto-teacher пишет:

Почему-то в архиве файл *.bas не распаковывается.

Вот он отдельно.

Post's attachments

UF_Messaging.bas 488 b, 1 скачиваний с 2017-09-29 

You don't have the permssions to download the attachments of this post.

6

Re: Макрос Word для появления самогаснущего окна

yshindin пишет:
auto-teacher пишет:

Почему-то в архиве файл *.bas не распаковывается.

Вот он отдельно.

Post's attachments

OKMB.frm 733 b, 1 скачиваний с 2017-09-29 

You don't have the permssions to download the attachments of this post.

7

Re: Макрос Word для появления самогаснущего окна

yshindin пишет:
yshindin пишет:
auto-teacher пишет:

Почему-то в архиве файл *.bas не распаковывается.

Вот он отдельно.

Post's attachments

OKMB.frx 2.52 Кб, 2 скачиваний с 2017-09-29 

You don't have the permssions to download the attachments of this post.

8

Re: Макрос Word для появления самогаснущего окна

auto-teacher пишет:

...
Но все-таки, подскажите по шагам, как и куда мне импортировать три файла из архива в шаблон normal.dotm, чтобы я не напутал.
...

Откройте VBE (Alt+F11), выделите в дереве проектов проект NewMacros, в контекстном меню ваыберите импорт модуля .bas и второй операцией - импортируйте форму .frm. Возможно, понадобится также импортировать .frx.
Перейдите в текст модуля UF_Messaging, поместите курсор в программу t_OKMB

Sub t_OKMB()
OKMessageBox "Тестовое сообщение", "Заголовок", 1
End Sub

Выполните ее (F5).
Первый параметр OKMessageBox - само сообщение, второй - текст заголовка окна, третий - число секунд показа сообщения (если пользователь сам раньше не закроет окно сообщения кнопкой ОК).
Перед вызовом подпрограммы можно дополнительно настроить вид окна: напр.,  чтобы область текста и фон самой формы был зеленым, укажите:

Sub t_OKMB()
OKMB.BackColor = &HC0FFC0
OKMB.MessageText.BackColor = &HC0FFC0
OKMessageBox "Тестовое сообщение", "Заголовок", 1
End Sub

9

Re: Макрос Word для появления самогаснущего окна

Уважаемый товарищ yshindin!
Предложенный Вами код я попробовал, и он работает очень хорошо, и мне понравился!
Это как раз то, что мне нужно.
Если сравнить его с тем модулем, которым я пользовался, то он значительно короче плюс добавляет параметры к форме.
Я теперь даже не знаю, на чем остановиться.
У меня есть привычка (для самообучения) оставлять в шаблоне разные варианты, чтобы через некоторое время выбрать лучший.
Для этого я вывожу подряд два или три окна в разных интерпретациях и смотрю, что интереснее.
Короче говоря, очень здорово получается.
Но возникли вопросы:
В первоначальном коде делался перевод строк и выводились значок и кнопка.
Перевод строк я догадался, как делать.
А можно ли к вашему коду добавить появление значка и кнопки?