Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как ответить на "вопросы" макроса в run-time? / 19 сообщений из 19, страница 1 из 1
24.04.2010, 20:30
    #36596430
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Я из ексельного файла A вызываю другой ексельный файл, скажем, B и работаю с ним, там много чего копирую, создаю и т.д. В файле В есть маскрос, который при его загрузке спрашивает 3 вопроса. Естественно эти вопросы выскакивают на экране в виде msgbox cо стандартными выборами (yes, no, cancel и т.д.)

ВОПРОС:
как я могу из файла А дать ответы на эти вопросы (я ответы знаю), так что бы моя программа текла гладко и не прерывалась появлением этих msgbox-ов?

Спасибо!

Excel 2007, Win XP.
...
Рейтинг: 0 / 0
24.04.2010, 20:36
    #36596440
DzonyB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадамаЯ из ексельного файла A вызываю другой ексельный файл, скажем, B и работаю с ним, там много чего копирую, создаю и т.д. В файле В есть маскрос, который при его загрузке спрашивает 3 вопроса. Естественно эти вопросы выскакивают на экране в виде msgbox cо стандартными выборами (yes, no, cancel и т.д.)

ВОПРОС:
как я могу из файла А дать ответы на эти вопросы (я ответы знаю), так что бы моя программа текла гладко и не прерывалась появлением этих msgbox-ов?

Спасибо!

Excel 2007, Win XP.

Но вы в Форуме Access!!!
...
Рейтинг: 0 / 0
24.04.2010, 20:55
    #36596456
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
DzonyB,
Тут толковые люди. И тот же vba.
...
Рейтинг: 0 / 0
24.04.2010, 21:01
    #36596461
DzonyB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
а показать текст макроса можете?

Модератор: Тема перенесена из форума "Microsoft Access".
...
Рейтинг: 0 / 0
24.04.2010, 23:28
    #36596554
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Вот кусок макроса из файла В. В зависимости от ответов меняются данные. Т.е. ответ важен, я не могу просто отрубить это дело.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        
Select Case MsgBox("Do you want to reformat the currency values as Euros?" & vbCrLf & vbCrLf & _
                           "Select 'Yes' for Euros." & vbCrLf & "Select 'No' for Pounds." & vbCrLf & "Select 'Cancel' for Dollars." & vbCrLf, vbYesNoCancel + vbDefaultButton3, "Number Format")
            Case vbYes
                strNumberFormat = strEuroFormat
            Case vbNo
                strNumberFormat = strPoundFormat
            Case Else
                strNumberFormat = strDollarFormat
        End Select
        
...
Рейтинг: 0 / 0
25.04.2010, 00:03
    #36596575
PlanB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Application.DisplayAlerts = False
включить потом не забудьте =)))
...
Рейтинг: 0 / 0
25.04.2010, 09:22
    #36596684
Сергей06
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
PlanB,
а можно и не включать. сам включится.
...
Рейтинг: 0 / 0
25.04.2010, 20:04
    #36597212
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Это у меня уже давно стоит. Во-первых вопросы почему-то всё равно появляются, допустим над этим можно было бы поработать и добиться их исчезновения, но мне надо не просто пригнорировать вопросы, а ответить на них определённым образом.
3 вопроса: 1-й Cancel и два No.
...
Рейтинг: 0 / 0
25.04.2010, 20:22
    #36597229
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадамакак я могу из файла А дать ответы на эти вопросы (я ответы знаю), так что бы моя программа текла гладко и не прерывалась появлением этих msgbox-ов?

Запишите ответы куда-нить из файла А (реестр, ячейки листа книги B, текстовый файл... - вариантов множество) и читайте их из кода VBA файла B.
Напрямую значения переменных, к сожалению, из книги А в книгу B не передать.
...
Рейтинг: 0 / 0
25.04.2010, 21:03
    #36597276
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
vlth,
знать ответы и где их хранить не проблема. Проблема как "сказать" файлу В об этом?
...
Рейтинг: 0 / 0
25.04.2010, 21:13
    #36597285
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадама, "обрубите",как Вы это называете, опубликованный код, а вместо его выполнения присвойте требуемое значение переменной strNumberFormat.
strNumberFormat = [a1], например (a1 - ячейка листа книги B)
...
Рейтинг: 0 / 0
25.04.2010, 21:42
    #36597329
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадамамне надо не просто пригнорировать вопросы, а ответить на них определённым образом.
3 вопроса: 1-й Cancel и два No
Если эти значения не должны меняться, объявите вместо трёх переменных (одну из них - strNumberFormat - Вы опубликовали) три константы:
Код: plaintext
1.
Const сstrNumberFormat As String=strDollarFormat ' например
Хотя, похоже, strDollarFormat, это и есть Ваша константа...
...
Рейтинг: 0 / 0
26.04.2010, 06:46
    #36597616
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
vlth,
вы по-моему что-то путаете. Я нахожусь в файле A. Этот код происходит в файле В. У меня нет доступа к КОДУ файла В в run-time. У меня есть доступ только к обектам этого workbook.
...
Рейтинг: 0 / 0
26.04.2010, 08:56
    #36597658
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадама, я Вас понял и ничего не путаю.

Из описания задачи следует, что конечной целью является присвоение значений неким переменным в коде файла B.
Это можно сделать:

1. Во время выполнения кода файла B, запускаемого из кода файла A (передавая их значения посредством промежуточных записей в ячейки листа книги B, например);

2. Если передаваемые значения всегда одни и те же, прописать их в коде файла B в режиме редактирования.


И в первом, и во втором случае вызов MsgBox-ов, которыми Вы хотите управлять, становится лишним.
"Нажимать" же кнопки 'Да', 'Нет' и 'Отмена' MsgBox-ов программно можно с помощью метода SendKeys, но это абсурдный вариант.
...
Рейтинг: 0 / 0
27.04.2010, 18:42
    #36601473
мадама
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Повторю ещё раз, код файла В мне недоступен. Файл В создаётся на машине юзера другой программой. У меня просто есть образец этого файла из которого я привела вам кусочек кода.

Насчёт SendKeys я с вами согласна, я тоже не люблю этот вариант.
...
Рейтинг: 0 / 0
27.04.2010, 19:46
    #36601579
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадамаТ.е. ответ важен, я не могу просто отрубить это дело.Т.е. получается, что "могу, но это не будет правильно, потому что ответ - важен"
Файл В создаётся на машине юзера другой программойСказали бы сразу, а то напустили тумана...

В таком случае остаётся только SendKeys управлять MsgBox-ами иначе не получится.
Кстати, это модальные окна, поэтому A и B должны запускаться в разных экземплярах Excel.

Может быть, есть ещё возможность управлять ими с помощью функций API, но это так... предположение.
...
Рейтинг: 0 / 0
28.04.2010, 13:56
    #36602924
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадама, вот Вам пример управления окном MsgBox с помощью функций API, который Вы можете доработать для решения своей задачи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Option Explicit
Declare Function SendMessage32 Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Const WM_LBBUTTONDOWN = &H201
Const WM_LBBUTTONUP = &H202

Sub ClickOnButtonInMsgBox()
Dim hWnd As Long
Dim x As Long, y As Long, z As Long

'Вместо AAA подставьте заголовок Вашего MsgBox-а
hWnd = FindWindow("#32770", "AAA") 'указатель на окно MsgBox

x = FindWindowEx(hWnd,  0 , "button", vbNullString) 'указатель на кнопку 'Ok'     (кнопку №1)
y = FindWindowEx(hWnd, x, "button", vbNullString) 'указатель на кнопку 'No'     (кнопку №2)
z = FindWindowEx(hWnd, y, "button", vbNullString) 'указатель на кнопку 'Cancel' (кнопку №3)

'Имитация щелчка левой клавишей мыши по кнопке 'Cancel' MsgBox-а
SendMessage32 z, WM_LBBUTTONDOWN,  1 ,  1  'нажатие на кнопку 'Cancel' левой клавишей мыши
SendMessage32 z, WM_LBBUTTONUP,  1 ,  1    'отжатие левой клавиши мыши на кнопке 'No'

End Sub

Документ с кодом необходимо загружать в приложении (или экземпляре приложения), отличном от родителя окна MsgBox, которым предполагается управлять.
...
Рейтинг: 0 / 0
28.04.2010, 13:59
    #36602936
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
Опечатка:
Код: plaintext
SendMessage32 z, WM_LBBUTTONUP,  1 ,  1    'отжатие левой клавиши мыши на кнопке 'No'
Верно:
Код: plaintext
1.
SendMessage32 z, WM_LBBUTTONUP,  1 ,  1    'отжатие левой клавиши мыши на кнопке 'Cancel'
...
Рейтинг: 0 / 0
29.04.2010, 00:55
    #36604332
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ответить на "вопросы" макроса в run-time?
мадама3 вопроса: 1-й Cancel и два No
Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Option Explicit
Declare Function SendMessage32 Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    
'Таймер высокого разрешения (в коде не использован)
'Declare Function SetTimer Lib "user32" _
'    (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
'Declare Function KillTimer Lib "user32" _
'    (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
'Dim TimerID As Long

Dim i As Byte
Const WM_LBBUTTONDOWN = &H201
Const WM_LBBUTTONUP = &H202

Sub ClickOnButtonInMsgBox(ByVal bytNcbn As Byte)
Dim hwnd As Long
Dim x As Long, y As Long, z As Long

'Вместо AAA подставьте заголовок Вашего MsgBox-а
hwnd = FindWindow("#32770", "AAA") 'указатель на окно MsgBox

x = FindWindowEx(hwnd,  0 , "button", vbNullString) 'указатель на кнопку 'Ok'     (кнопку №1)
y = FindWindowEx(hwnd, x, "button", vbNullString) 'указатель на кнопку 'No'     (кнопку №2)
z = FindWindowEx(hwnd, y, "button", vbNullString) 'указатель на кнопку 'Cancel' (кнопку №3)

'Имитация щелчка левой клавишей мыши по кнопке 'Cancel' MsgBox-а
SendMessage32 IIf(bytNcbn <  3 , y, z), WM_LBBUTTONDOWN,  1 ,  1  'нажатие на кнопку 'Cancel' левой клавишей мыши
SendMessage32 IIf(bytNcbn <  3 , y, z), WM_LBBUTTONUP,  1 ,  1   'отжатие левой клавиши мыши на кнопке 'Cancel'
If hwnd >  0  Then i = i +  2 
End Sub

Sub test()
Dim bytBN As Byte

Select Case i
    Case  0 : bytBN =  3 
    Case  2  To  4 : bytBN =  2 
End Select
ClickOnButtonInMsgBox ByVal bytBN
If i >  4  Then
    i =  0 
    Exit Sub
End If
Application.OnTime Now + TimeValue("0:00:01"), "test"
End Sub

Скрипт vbs для проверки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for j= 1  to  3 
 x=MsgBox( "", vbYesNoCancel,"AAA")
 select case x
  case  6 :i= 1 
  case  7 :i= 2 
  case  2 :i= 3 
 end select
 MsgBox "нажата кнопка № " & i
next
Запускаем процедуру 'test', далее запускаем скрипт.
Если частота проверки раз в секунду мала, подключайте таймер - тогда окна на экране, думаю, вообще даже мелькать не будут.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как ответить на "вопросы" макроса в run-time? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]