Страницы: 1
RSS
Как бы сделать, чтобы Excel думал, что мы нажали кнопку не на форме, а на ленте?
 
Приветствую!  
Подскажите, можно-ли обмануть Excel при вызове диалогового окна из формы?  
Т.е. имеется немодальная форма с кнопочками на выполнение определенных процедур. Хочется на нее добавить кнопку вызова диалога "Текст по столбцам". Но при вызове методом Show становится невозможной отмена. Как-бы сделать, чтобы Excel думал, что мы нажали кнопку не на форме, а на ленте? Городить макрос отмены тоже не хочется.
 
Мне близка Ваша проблема!  
Для работы с откатами возможно использование горячих клавиш (конечно, если они не переопределены)  
Имеет значение текущая раскладка, поэтому сначала поменяем её на английскую, а в конце восстановим текущую  
Это работает и в новых, "ленточных" версиях Excel  
 
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long  
Private Declare Function ActivateKeyboardLayout Lib "user32" _  
                                (ByVal HKL As Long, _  
                                 ByVal flags As Long) As Long  
Private Const kb_lay_ru As Long = 68748313  
Private Const kb_lay_en As Long = 67699721  
   
Sub DialogTextToColumnsShow()  
   'Application.Dialogs(xlDialogTextToColumns).Show - без отката  
   'Application.CommandBars.FindControl(, 806).Execute - без отката  
   Dim L As Long  
     
   L = GetKeyboardLayout(0) 'определяем раскладку клавиатуры активного процесса  
   Call ActivateKeyboardLayout(kb_lay_en, 0) 'заменяем на английскую раскладку  
   Application.SendKeys "%lt" 'вызываем диалог  
   Call ActivateKeyboardLayout(L, 0) 'возвращаем исходную раскладку  
End Sub
 
Спасибо, Владимир, буду пробовать.
 
Попробовал в 2007, все отлично.  Но возник ряд вопросов.  
Для чего смена раскладки?  
Строка Application.SendKeys "%lt" работает вне зависимости от раскладки.  
По ленте определил сочетание Application.SendKeys "%se", которое тоже работает в любой раскладке.  
Или это зависит от версии Excel?  
В связи с этим вопрос - почему 2 различных сочетания, и какое из сочетаний правильней.  
Смена раскладки на русскую требуется при записи  
Application.SendKeys "%ыу" и Application.SendKeys "%де"
 
http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B0%D0%BD-%D0%BA%D0%BE%D0%B4  
 
>>Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов  Caps Lock ,  Num Lock  и  Scroll Lock , ни от состояния управляющих клавиш ( ⇧ Shift ,  Alt ,  Ctrl ).
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Рaзговор в чaте:  
- Помогите, уменяпробелнерaботaет!  
Ответ:  
- Настоящему_прогрaммисту_пробел_не_нужен!  
Андрюш, тема обсуждалась здесь:  
http://www.planetaexcel.ru/forum.php/?thread_id=33830
Я сам - дурнее всякого примера! ...
 
Ну послали, так послали! -:)  
Я, правда, без чтения википедии подозревал, что каждой клавише соответствует свой код...  
И про переключение раскладки тоже видел.  
Единственное, что понять не могу - какую информацию из этих посылов, дающую ответ на мои вопросы, я упустил?
 
Христос воскрес!  
Всей тёплой компании привет!  
Только что проверил очередной раз - у себя (XP + XL2003; XL2007) и у дочки (WN7 + XL2003; XL2007)  
Код с закомментированными API отказывается работать при активной русской раскладке  
Почему я вызываю горячие клавиши на аглицком? Ведь мы пишем универсальный код. Моя абракадабра сработает и для уважаемого монгольского  
 
Андрей, если Вам интересна техника работы с откатами, можем расширить круг вопросов (благо тема сформулирована более, чем гибко :)) Я - великий и могучий забывальщик и абсолютный чемпион по количеству откатов в единицу времени!  
По роду работы каждый день приходится не столько выполнять расчёты, сколько пробовать какие-то варианты (частенько в обнимку с VBA). Поэтому естественно, приходится обманывать XL. Горячие клавиши при сём - главная, но не единственная волшебная палочка  
Ребята, а с Вашей помощью надеюсь найти ещё кое-что (например, скрипты)
 
Еще раз проверил (ХР + 2007). Все работает независимо от раскладки. Может Пунто вмешивается?  
А техника работы с откатами я думаю будет интересна не только мне.
 
До выяснения обстоятельств предлагаю считать, что зависит, а прочее - проделки Шапокляка-Пунто  
Мне кажется, что код надо немножко прихорошить (убрать Application там, где можно обойтись без него, добавить описание API для 64-битной версии a la #If Win64) и двигаться дальше. А дальше всего-ничего, но чем богаты...
 
Поехали!  
Для начала попробуем использовать возможности независимых откатов на разных листах  
Во многих случаях это приемлемо: на активном листе возможны откаты, а макросы изменяют ячейки на других листах
 
Чуток подправил (забыл очистить Лист2 и Лист3 при открытии)
 
Погонял в конфигурации W7 + 2010.  
C формы НЕ запустить не удалось в любой раскладке, хоть с Пунто, хоть без.  
А из стандартного модуля вообще не запускается? Вместо вызова диалога начинает редактировать текст макроса!  
Варианты откатов и использованием доп листов не очень удобны, особенно для надстройки.
 
Недосмотрел - сейчас исправим  
Просто при работе из формы (так же, как и при работе из редактора VBA) надо сначала активизировать окно XL, ведь это его горячие клавиши!  
Вариант работы из формы приложен  
По поводу работы с несколькими листами отвечу чуть позже (воюю с дочкой за комп)
 
У меня получилось так (файл).  
 
Для работы горячих клавиш в окне диалога надо переключаться на русский, иначе они не работают.  
 
Зато после запуска post_327638.xls окно VBA спряталось за окно Excel, и на солнышко носа не кажет.
 
Теперь по поводу "листового" оката  
Мы попытаемся разобрать разные трюки. Мне кажется, лучше пунктуально перебрать их все, никого не обидеть, а уже потом определять лидеров и аутсайдеров  
Каждый трюк имеет свою ущербность, но и свою неожиданность, оригинальность  
Такая у них противоречивая судьба  
 
У меня есть скромный опыт "листовых" откатов, и есть чувство признательности тому, что они есть  
Не для всех, но многих XL-расчётов вполне характерно вынесение исходных данных и результатов на отдельные листы  
В этом случае на прочих листах может кипеть VBA-работа, не препятствуя откатам на "фасадных", интерфейсных листах. Не всегда, но часто рабочие листы с расчётами или данными интересны только для утончённого анализа, отсутствие откатов там - невелика потеря  
Сейчас мне важна обратная связь. Тогда будем по-тихоньку разбирать и другие приёмы (их немного)
 
Я наверное не очень понимаю дух этого листового отката. При вводе данных с клавиатуры возможность отката имеется безо всяких ухищрений. А после запуска  
Sub qqq()  
[a1:a10] = 5
End Sub  
прямого доступа к Undo все равно нет (кнопка не активна).  
Вот вариант с диалогом  и SendKeys оказался то, что надо.
 
Привет, Володя и Андрей!  
Не вникая в суть очередных шедевров Володи (именно шедевров, без всякого сарказма), могу посоветовать: ребята, если не хотите иметь дел с налоговой, то фильтруйте базар! У вас же откат за откатом идёт и откатом погоняет :)  
 
P.S. Я гляжу, Володя-таки подсел на Планету! А сколько раз я его сюда приглашал... Ну теперь всё... коготок увяз - птичка пропала!
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Ура! С нами Лёша!  
Сейчас мы будем друг-друга хвалить - это у нас получается лучше всего :)
 
Андрей, у меня форма тоже сработала!  
По поводу листового отката  
Чтобы почувствовать всю его прелесть в Вашем примере изменим:  
Sub qqq()  
Worksheets(2).[a1:a10] = 5
End Sub  
И запустим эту процедуру при активном Листе1  
Но сначала надо на этом Листе1 изменить несколько ячеек  
После работы процедуры:  
1) на Листе2 что-то программно измениться  
2) на Листе1 будут возможны откаты
 
{quote}{login=v__step}{date=16.04.2012 09:55}{thema=}{post}Андрей, у меня форма тоже сработала!{/post}{/quote}  
 
Если я правильно понял, то при вызове из формы смена раскладки не требуется?
 
По поводу программных изменений на листе2 с возможностью отката на листе1.  
Вероятно такая необходимость бывает, но так сразу и не придумывается.  
А вот как сделать для кнопки из той-же формы  
Private Sub CommandButton1_Click()  
If TypeName(Selection) <> "Range" Then Exit Sub  
   Selection.Replace What:="~*", Replacement:="", LookAt:=xlPart, _  
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _  
       ReplaceFormat:=False  
End Sub
 
{quote}{login=RAN}{date=16.04.2012 10:04}{thema=Re: }{post}Если я правильно понял, то при вызове из формы смена раскладки не требуется?{/post}{/quote}  
Я бы не спешил с общими выводами. Надо будет попробовать в разных операционках и в разных версиях, понять, почему на моей форме такое не вышло. Пока что мы на этапе предварительных экспериментов. Главное - обеспечить активность XL в момент задания горячих клавиш  
Насчёт замен с откатами - скорее всего, это возможно (подумаем)  
А пока что попробуем откатно заполнять ячейки значениями на активном листе
 
Ребята, на всякий случай (не вникая, какими откатами вы тут занимаетесь), но в последнем примере Володи увидал обращение к буферу обмена.  
На всякий случай, вдруг пригодится, не помню, где списал... просто вспомнил, что у меня в копилке лежит:  
Function GetFromClipBoard()   ' считать значение из буфера обмена  
  'Dim DataObject As New MSForms.DataObject ' при раннем связывании нужна ссылка на объектную библиотеку Microsoft Forms 2.0  
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
     .GetFromClipBoard  
     GetFromClipBoard = .GetText  
  End With  
End Function  
Function PutInClipBoard(sValue$)   ' вставить значение в буфер обмена  
  'Dim DataObject As New MSForms.DataObject ' при раннем связывании нужна ссылка на объектную библиотеку Microsoft Forms 2.0  
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
     .SetText sValue  
     .PutInClipBoard  
  End With  
End Function
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А я даже скажу где. Это Леша(Казанский) предложил.
Я сам - дурнее всякого примера! ...
 
Привет, Серёга.  
Да, точно! Это я стырил у Казанского отсюда : http://www.planetaexcel.ru/forum.php?thread_id=26894
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Лёша, с добрым утром!  
Отличный пример, благо нам скоро понадобиться не только заносить данные в буфер, но и считывать из него (например, вариант задачи Андрея с откатной заменой)  
И за ссылку на библиотеку Microsoft Forms 2.0 списибо - конечно!  
Лёш, загляни по ссылке http://www.planetaexcel.ru/forum.php?thread_id=39971&page_forum=2&allnum_forum=47 - там есть какой-то вариант решения  
 
Андрей, я с утра побегал по компам - попробовал твою и свою форму  
Подтверждаю твоё предположение: если "откатная" процедура расположена в модуле формы, нет необходимости активировать окно Excel, если из стандартного модуля - такая необходимость есть  
В Excel не ленточных версий "%se" не срабатывает, поэтому универсальная комбинация одна - "%lt"
 
Пробуем замены с откатами
Страницы: 1
Читают тему
Loading...