Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коллекция Dialogs Excel, Поиск нужного встроенного окна 
:(
    Опции темы
CaptainNemo
Дата 21.9.2008, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 2
Всего: 9



Коллекция Dialogs состоит вроде как из 258 элементов (хотя у меня в Excel 2003 Dialogs.Count показывает, что их более 800), они проиндексированы как-то хитро, например, задать цикл типа 
For i = 1 To Application.Dialogs.Count
Next i 
на втором витке приведет к ошибке, поэтому мне пришлось ввести инструкцию On Error Resume Next для того, что бы перескочить через ошибку. 
Вот такой код работает до поры до времени (витков 20 сделать получается): 
========================
Sub Дыялог()
Rem Для таго, каб гартаць убудаваныя дыялогавыя вокны выкарыстайце клавішу Esc
Dim Default As Dialog
Dim Index As XlBuiltInDialog
For i = 1 To Application.Dialogs.Count
On Error Resume Next
Application.Dialogs(i).Show
Next i
End Sub
======================
Помогите доработать код, что бы найти нужное окно, получить его имя и запрограммировать отклик. 
P.S. Такое бывает необходимо если программировать, например, удаление страницы из книги. Выскакивает встроенное окно, которое спрашивает, нужно ли удалять лист. Как запрограммировать отклик на такое окно, что бы не делать лишних движений?  smile ))))))))))))))) Спасибо
PM MAIL WWW ICQ Skype GTalk   Вверх
FINANSIST
Дата 22.9.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 13
Всего: 23



Цитата(CaptainNemo @  21.9.2008,  03:02 Найти цитируемый пост)
P.S. Такое бывает необходимо если программировать, например, удаление страницы из книги. Выскакивает встроенное окно, которое спрашивает, нужно ли удалять лист. Как запрограммировать отклик на такое окно, что бы не делать лишних движений?   ))))))))))))))) Спасибо 

Код

Application.DisplayAlerts = False
Sheets("Лист1").Select
ActiveWindow.SelectedSheets.Delete
' Либо любая другая операция
Application.DisplayAlerts = true

Вот и всё


--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
CaptainNemo
  Дата 22.9.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 2
Всего: 9



 Согласен. Я вчера разрешил этот вопрос. Я тож прописывал Application.DisplayAlerts = true в коде изначально. Подумал, что если окно появляется после удаления, дык и инструкцию, которая гасит это окно,  надо вводить после удаления. На самом деле - наоборот. эту инструкцию надо вводить перед удалением  

Код

Application.DisplayAlerts = False
    ActiveWindow.SelectedSheets.Delete


В любом случае – спасибо 
  smile

Добавлено @ 13:53
Хочу задать ещё один чисто теоретический вопрос по синтаксису в VBA. Что бы не создавать лишних тем, пусть будет про окна)) 

Как обходить такие моменты, например я эту таблицу с именами (с сайта MSDN) скопировал на лист. Пытался задать такой цикл, что бы просмотреть окна:
Код

Sub Дыялог()
For i = 1 To 100
Application.Dialogs(Range("A" & i).Value).Show
Next i
End Sub


Но Range("A" & i).Value – в кавычках как переменная прописывается. Я пробовал разными способами её прописать, что бы она чисто имена перебирала без кавычек Trim, Cstr, Str и т.п. А как правильно? Всё равно она в кавычках прописывается… 
Файл с неудачными попытками написать такой код прилагаю. Спасибо.


Это сообщение отредактировал(а) CaptainNemo - 22.9.2008, 13:58

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  post.rar 16,26 Kb
PM MAIL WWW ICQ Skype GTalk   Вверх
FINANSIST
Дата 22.9.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 13
Всего: 23



Конечно не получится. Переменная вообще может быть либо строковая, либо числовая (дата - то же число, булев - то же)
Кстати тему интересную затронул - предполагаю, что как- то  это можно решить. 
Тогда можно было бы макросы клиентских приложений обновлять!
Вроде народ на форумах  про файлы .ini что то упоминал.


--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
CaptainNemo
Дата 22.9.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 2
Всего: 9



Интересно на все эти окна глянуть, и не только в Excel. Удобно бы было цикл этот как-нибудь дописать. Esc-ом они неплохо листаются. 

Вот таким кодом все имена отображаются в MsgBoxе

Код

Sub Дыялог()
Dim iVar As String
    For i = 1 To 5
      iVar = CStr(Range("A" & i))
       MsgBox iVar
    Next i
End Sub


Но как тока попробовать добавить в цикл 
Application.Dialogs(iVar).Show - сразу ошибка, т.к. она прописывает переменную в кавычках Application.Dialogs("iVar").Show 
PM MAIL WWW ICQ Skype GTalk   Вверх
LOPUH
Дата 25.9.2008, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Растение
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4



Цитата(CaptainNemo @  22.9.2008,  18:43 Найти цитируемый пост)
Но Range("A" & i).Value – в кавычках как переменная прописывается. Я пробовал разными способами её прописать, что бы она чисто имена перебирала без кавычек Trim, Cstr, Str и т.п. А как правильно? Всё равно она в кавычках прописывается… 
Файл с неудачными попытками написать такой код прилагаю. Спасибо.
  Я для перебора   соседних ячеек использую метод Offset.   Он как раз для этого создан и обладает большой гибкостью. В Вашем случае код будет выглядеть примерно так:
Код

Sub Дыялог()
Dim iVar As Range
    For i = 1 To 5
      iVar = Range("A1").Offset(0, 1)
       MsgBox iVar.Value
    Next i
End Sub

 О диалоговых окнах. Список всех диалоговых окон можно получить используя  Object Browser. ( В модуле VBA нажмите F2,  в верхней  части выберите Excel ,  в нижней наберите xlDialog.)  При использовании встроенных диалоговых окон существуют  следующие грабли: попытка отобразить диалоговое окно в неверном контексте приводит к ошибке, некоторые диалоговые окна требуют обязательных  параметров. Поэтому запихать их все в цикл не получится.. 

Это сообщение отредактировал(а) LOPUH - 25.9.2008, 08:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.