Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: oshizelly
Дата сообщения: 15.10.2012 22:33
koyusi 11:01 15-10-2012
Цитата:

Цитата: есть ли способ посмотреть список хоткев, назначенных на макросы

По-моему, нет. Может быть его сгенерить можно через VBA?...
Св-во ShortcutText объекта CommandBarButton.  
Автор: AndVGri
Дата сообщения: 16.10.2012 03:14
oshizelly

Код:
Public Sub GetHotKeys()
Dim pCBar As CommandBar
Dim pCCom As Office.CommandBarButton
Dim pCControl As CommandBarControl

For Each pCBar In Application.CommandBars
For Each pCControl In pCBar.Controls
If TypeOf pCControl Is Office.CommandBarButton Then
Set pCCom = pCControl
If Trim$(pCCom.ShortcutText) <> "" Then Debug.Print pCCom.Caption & " = " & pCCom.ShortcutText
End If
Next pCControl
Next pCBar
End Sub
Автор: koyusi
Дата сообщения: 16.10.2012 09:27
AndVGri
А как программно назначить хоткей юзерской кнопке? Что-то я рылся - не нашел :(
Автор: AndVGri
Дата сообщения: 16.10.2012 11:26
koyusi
И спасибо не будет? Читайте тогда тут и тут
Автор: koyusi
Дата сообщения: 16.10.2012 12:05
AndVGri
Цитата:
koyusi
И спасибо не будет? Читайте тогда тут и тут

Я не понял, чувак, ты от меня что-ли "спасибо" ждешь? За что и за где?
Поясни-ка, да не так дерзко.
Автор: oshizelly
Дата сообщения: 16.10.2012 12:18
AndVGri
koyusi
Друзья, не надо споров на пустом месте. Это я просил помощи, стало быть, все спасибы от меня обоим абсолютно искренне: koyusi за подсказку, где просить помощи, а AndVGri за эту самую помощь, оказанную на удивление быстро. Собственно, я бы и без напоминаний поблагодарил бы, но только что зашёл проверить топик - а вы тут уже почти успели поссориться...
Я проверю макрос и отпишусь!
Автор: AndVGri
Дата сообщения: 16.10.2012 12:52
koyusi
Приношу свои извинения, и впрямь не доглядел. А по ссылкам советую прочитать - ответ на вопрос там есть.
Автор: koyusi
Дата сообщения: 16.10.2012 13:35
[more] [more]Newbie more[/more]
AndVGri
Заметано.


Цитата:
А по ссылкам советую прочитать - ответ на вопрос там есть.

Ссылки хорошие, только читать там особо нечего, кроме грустной констатации факта. Я ведь почему спросил-то про обратную операцию - программного назначения хоткея - ведь ошизелому все равно понадобится , а я помню, что там не все так просто. Вот и поинтересовался - не что пишут, а что ты сам думаешь и знаешь.

Главное, что OnKey - не Офисный, а чисто Экселевский прибамбас. И получается, что хоткей назначается не контролу (почему я ничего подобного в св-х контрола и не увидел), а процедуре. Во как! А уж сама процедура, назначается контролу через OnAction. Так? Получается, что нет у контролов хоткеев. Они есть только у процедур и только в Екселе. А хоткеи хранятся вообще где-то слева, а не в свойствах объекта. Как узнать хоткей, назначенный конкретной процедуре? Как вообще получить их список?

Мне-то вся эта бодяга пофиг - я нестандартными хоткеями не пользуюсь и другим не советую. Кнопки лишь по большой нужде на панель добавляю, тем более ,что совершенно разнаые концепции в Ворде, Екселе и Аксе. Просто интересно. Да и тем, кто плодит и юзает их активно - знать полезно. [/more]
Автор: AndVGri
Дата сообщения: 16.10.2012 14:39
koyusi
В принципе со всем согласен кроме
Цитата:
и только в Екселе

В Word это регулируется через члены коллекции KeyBindings
Автор: koyusi
Дата сообщения: 16.10.2012 22:12
[more] [more]Newbie more[/more]
Futurism
http://forum.ru-board.com/topic.cgi?forum=5&topic=33123&start=2140#6
Вот модуль листа. Но, имей ввиду, сто это, хоть и рабочая, но все равно - заготовка, лишь иллюстрирующая концепцию. В Cells(6, 10) (измени на удобную тебе) надо вводить термин. В соседних ячейках появятся значения.

[more=Код:]

Код:
Option Explicit

Private col_Terms As Collection
Private bChkSkp As Boolean
'

Private Sub Worksheet_Change(ByVal Target As Range)
If Not bChkSkp Then
If Target = Cells(6, 10) Then
Call sb_col_Terms_Chk(Target)
End If
End If
End Sub

Private Sub sb_col_Terms_Chk(pTgt As Range)
Dim i&, iLB&, iUB&
Dim sRsp$
On Error GoTo ErH
If col_Terms Is Nothing Then Call sb_col_Terms_Ini
sRsp = col_Terms(pTgt.Value)
iLB = 1: iUB = Len(sRsp)
bChkSkp = True
For i = iLB To iUB
pTgt.Offset(0, i).Value = Mid(sRsp, i, 1)
Next
bChkSkp = False
Exit Sub
ErH:
sRsp = col_Terms(CStr(-vbObjectError)): Resume Next
End Sub

Private Sub sb_col_Terms_Ini()
Set col_Terms = New Collection
With col_Terms
.Add "Err!", CStr(-vbObjectError) ' error
.Add "1310", "треугольник"
.Add "2473", "круг"
.Add "1596", "квадрат"
End With
End Sub
Автор: oshizelly
Дата сообщения: 16.10.2012 22:18
AndVGri
Проверил макрос: http://forum.ru-board.com/topic.cgi?forum=33&topic=10903&start=2780#17
Не работает он чего-то у меня. Ну, то есть, абсолютно Жму на кнопку [Run] - и абсолютно ничего не происходит, даже сообщений об ошибках нет и курсор не перемещается. Если у других этот макрос работает, то значит, чтто-то я нет так делаю. Но что именно
Другие макросы работают исправно. На всякий случай пару раз перезапустил Excel, открыл редактор VBA, посмотрел: макрос на месте, все линеечки и строчечки в порядке.

На всякий случай уточню: у меня MS Excel 2003, может, там это работает по-другому?
Автор: AndVGri
Дата сообщения: 17.10.2012 01:30
oshizelly
Уважаемый, вы на код смотрели?

Цитата:
Debug.Print pCCom.Caption & " = " & pCCom.ShortcutText

Макрос выводит результат в окно Immediate редактора VBA. Или в VBA меню View/Immediate Window после чего там же запускаете макрос
Автор: oshizelly
Дата сообщения: 17.10.2012 09:52
AndVGri 01:30 17-10-2012
Цитата:
Уважаемый, вы на код смотрели?
Debug.Print pCCom.Caption & " = " & pCCom.ShortcutText  

А как же, конечно, смотрел! Вот только мне эта строка ровно ни о чём не говорит. Ну, не разбираюсь я в VBA и никогда не пытался изобразить обратного Думал, что список будет сгенерирован прямо на листе, в месте нахождения курсора.
Я лучше переспрошу. То есть, этот код надо вставлять не в модуль VBA, как проие макросы, а в окошко VBA -> View -> Immediate под главным окном? И дальше что? Как его после этого запустить на исполнение?

Автор: koyusi
Дата сообщения: 17.10.2012 10:17
oshizelly
Цитата:
мне эта строка ровно ни о чём не говорит. Ну, не разбираюсь я в VBA

Давно уже пора разбираться. Если посмотреть историю твоих запросов в этой ветке и в вордовской, то ты сам уже должен другим помогать в полный рост. 40 постов :)


Цитата:
Макрос выводит результат в окно Immediate редактора VBA. Или в VBA меню View/Immediate Window
после чего там же запускаете макрос


Ну, не ясно AndVGri выразил мысль, но суть-то понятна. Чо уж совсем тупить?
Его код - код модуля. В любой или в новый модуль его вставляешь, запускаешь на выполнение (F5 при курсоре в теле процедуры), а в окне Immediate (Ctrl+G) смотришь результат.

У меня выводит:

Цитата:
&Редактор Visual Basic = Alt+F11
&Справка: Microsoft Excel = F1
&Создать список... = Ctrl+L
Гиперсс&ылка... = Ctrl+K
Гиперсс&ылка... = Ctrl+K
Гиперсс&ылка... = Ctrl+K


Автор: VSHY
Дата сообщения: 17.10.2012 12:39
Открываю xml-файл
Код: <?xml version='1.0' ?>
<documents>
<document>
<FIO>Фамилиев1 И.О.</FIO>
<Worked>44</Worked>
</document>
<document>
<FIO>Фамилиев2 И.О.</FIO>
<Worked>56</Worked>
</document>
<document>
Автор: oshizelly
Дата сообщения: 17.10.2012 13:02
koyusi 10:17 17-10-2012
Цитата:
В любой или в новый модуль его вставляешь, запускаешь на выполнение (F5 при курсоре в теле процедуры), а в окне Immediate (Ctrl+G) смотришь результат.  
У меня выводит:
&Редактор Visual Basic = Alt+F11
&Справка: Microsoft Excel = F1
&Создать список... = Ctrl+L
Гиперсс&ылка... = Ctrl+K
Гиперсс&ылка... = Ctrl+K
Гиперсс&ылка... = Ctrl+K

Теперь понял спасибо
Вот только беда в том, что у меня после выполнения указанных действий выводится точно такой же список из 6 пунктов (правда, на английском). Что, как нетрудно предположить, не имеет никакого отношения к двум десяткам хоткеев, которые я назначил на свои макросы.
То есть, либо ошибка в макросе, либо мы оба что-то не то с ним делаем


Цитата:
Ну, не ясно AndVGri выразил мысль, но суть-то понятна. Чо уж совсем тупить?

Суть понятна не вполне. Распространённая ошибка специалистов (а каждый из нас в чём-то да специалист): если мне всё понятно, то значит и всем остальным тоже. На деле это часто не так. Можно пораспросить работников любой службы поддержки, от интернет-провайдера до финансовой биржи, про их общение с клиентами.
Автор: koyusi
Дата сообщения: 17.10.2012 13:31
oshizelly

Цитата:
Вот только беда в том, что у меня после выполнения указанных действий выводится точно такой же список из 6 пунктов (правда, на английском). Что, как нетрудно предположить, не имеет никакого отношения к двум десяткам хоткеев, которые я назначил на свои макросы.

Вот я к тому и клонил, что не все так ладно в датском королевстве :(
У меня-то этих хоткеев нет, слава Всевышнему.
Надо разбираться-погружаться... Может AndVGri что-то скажет...
Автор: AndVGri
Дата сообщения: 17.10.2012 15:04
oshizelly
Поглядите здесь

Код:
Private Function GetKey(ByVal this As Name) As String
On Error GoTo errHandle
GetKey = this.ShortcutKey
Exit Function
errHandle:
GetKey = ""
End Function

Public Sub NameL()
Dim pName As Name
For Each pName In Application.Names
If pName.MacroType Then
Debug.Print pName.Name & " = " & GetKey(pName)
End If
Next pName
End Sub
Автор: koyusi
Дата сообщения: 17.10.2012 15:23
AndVGri
У меня вообще ни одного Name не видит...
? Application.Names.Count
0

Я эти ShortcutKey видел, но ни как воедино логику не мог связать :( Как увязать эти Names с юзерскими кнопками на панели?

И меня смутило:

Цитата:
Returns or sets the shortcut key for a name defined as a custom Microsoft Excel 4.0 macro command. Read/write String

Там ведь была какая-то книга личных макросов, которую нынче заменили надстройки.
Автор: AndVGri
Дата сообщения: 17.10.2012 16:37
koyusi
Вы правы. нашёл надстройку, которая вроде как ищет Getting Macro Short cut keys ковыряет, судя по беглому просмотру кода, на бинарном уровне файлы. Версии 97, 2000 тестированы, XP и 2003 под вопросом. Если есть желание, можете разобрать код. Защита там парольная. С учётом возможностей этого форума - решаемая.
Автор: koyusi
Дата сообщения: 17.10.2012 17:18
AndVGri
Ага. Спасибо за наводку.
И все-таки (судя по описанию) - все привязано лишь к процедурам, не к кнопкам :)
Скачал ,чуть попозжа посмотрю - щаз занят плотно.
Автор: AndVGri
Дата сообщения: 17.10.2012 17:27
koyusi
Судя по всему исходный вопрос был
есть ли способ посмотреть список хоткев, назначенных на макросы
А остальное возникло по наводке
Автор: koyusi
Дата сообщения: 17.10.2012 17:50
[more] [more]Newbie more[/more]
.
.
AndVGri
Да... что же это, получается, я всех на кнопки сбил?...



Добавлено:
Познакомился я поверхностно и с этой надстройкой, и с темой хоткеев. Главный вывод - хоткеи зло и эффективного метода работы с ними нет.

Фактически, пруф от AndVGri на Ванину (Ivan F Moala) надстройку - единственное полноценное, доведенное до конца решение. Другого не нашел.

Я бегло посмотрел ее код. Все делается через экспорт модулей в текстовые файлы и дальнейшее их распарсивание. Очень "изящно". В смысле - не реализация изящна (автору по любому респект), а жопа, через которую приходится все это делать. За это отдельное спасибо БГ.

Где-то у буржуев встретилось еще подтверждающее утверждение, что из VBA доступа к хоткеям нет, а они пишутся в код экспортируемых модулей.

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

Попутно нарыл еще пару ссылок в тему:
http://www.planetaexcel.ru/forum.php?thread_id=12742
http://www.planetaexcel.ru/forum.php?thread_id=39320
.
. [/more]
Автор: oshizelly
Дата сообщения: 18.10.2012 09:52
AndVGri 15:04 17-10-2012
Цитата:
Поглядите здесь

Возможно, я опять туплю, но всё же попрошу дополнительных инструкций: что с этим кодом делать? Тоже запускать по F5 и смотреть в окне Immediate? Или как обычный макрос?
Пробовал вставит в окно модуля, но при этом автоматически вставляется горизонтальная линия - разделитель между строками
End Function
и
Public Sub NameL()

Это так и должно быть? То есть, это два разных макроса
Автор: AndVGri
Дата сообщения: 18.10.2012 13:45
oshizelly
Вопрос с Names, если вы заметили, закрыт - не подходят, это моя ошибка. Есть расширение под Excel для поиска горячих клавиш макросов или по ссылкам на planetaexcel код для интересующихся программистов.
Я прекрасно понимаю, что вы далеки от программирования, но может вам для начала прочитать "шапку" ветки, прежде чем задавать в ней вопросы? Вы же не приходите просто за вот так в юридическую контору со своими вопросами?
Автор: oshizelly
Дата сообщения: 18.10.2012 15:59
AndVGri 13:45 18-10-2012
Цитата:
Вопрос с Names, если вы заметили, закрыт - не подходят, это моя ошибка.

Из вашего последующего обсуждения с koyusi прямо не следовало, что предложенное в том посте решение не работает. Я понял так, что http://www.xcelfiles.com/GetShortCutKeys.html - это альтернативное решение (кстати, прочёл внимательно обсуждения по ссылкам, но, увы, понял не слишком много).
Тогда, может, имело бы смысл подправить этот пост, ну, там зачеркнуть его и приписать, что решение оказалось нерабочее и т.п.? Чтобы не создавать лишней путаницы? Полное удаление своих постов правилами форума не приветствуется, даже если мнение автора поста потом поменялось. А на правку запрет не распространяется.
Автор: koyusi
Дата сообщения: 19.10.2012 08:53
oshizelly
Цитата:
Тогда, может, имело бы смысл подправить этот пост, ну, там зачеркнуть его и приписать, что решение оказалось нерабочее и т.п.? Чтобы не создавать лишней путаницы?

Может лучше самому внимательно следить за ходом обсуждения? Чтобы не получалось так:

Цитата:
Я понял так, что http://www.xcelfiles.com/GetShortCutKeys.html - это альтернативное решение
Хотя я выше писал:

Цитата:
Фактически, пруф от AndVGri на Ванину (Ivan F Moala) надстройку - единственное полноценное, доведенное до конца решение. Другого не нашел.


Кстати, ты попробовал его? Судя по всему - нет. Странно, что два человека погружаются в тему твоего интереса глубже тебя самого...
Автор: oshizelly
Дата сообщения: 19.10.2012 12:17
AndVGri
koyusi

Ясно. Решений через макросы нет, зато есть готовая утилита. Однако её использование связано с некоторыми рисками для безопасности.
Картина ясна, мой вопрос и ваше погружение в тему не пропали впустую, а останутся в качестве полезной информации всем посетителям этого топика. Спасибо обоим за помощь!


koyusi 08:53 19-10-2012
Цитата:
Хотя я выше писал: Фактически, пруф от  AndVGri на Ванину (Ivan F Moala) надстройку  - единственное полноценное, доведенное до конца решение. Другого не нашел.  

Просто для ясности, а не из стремления оставить за собой предпоследнее слово. Из утверждения про "единственное полноценное, доведенное до конца решение" можно сделать вывод, что предложенный выше макрос не является (по каким-то причинам) полноценным, доведённым до конца решением. Но нельзя сделать вывод, что этот (или какой-то другой) макрос вообще не будет работать.
Кстати, сам уважаемый AndVGri как автор макроса подтвердил это мнение только после моего вопроса.


Цитата:
Кстати, ты попробовал его? Судя по всему - нет.

Нет, не попробовал, хотя и отложил в копилку для лучших времён. Причина вот какая:
koyusi 17:50 17-10-2012
Цитата:
имей ввиду, она просит снизить уровень безопасности до минимума. Я не стал, хотя код с виду безопасный. Но, все равно, чужие дисковые операции на моем диске - ну нафиг.  
Автор: koyusi
Дата сообщения: 19.10.2012 12:32
oshizelly

Цитата:
Нет, не попробовал, хотя и отложил в копилку для лучших времён. Причина вот какая:
koyusi 17:50 17-10-2012
Цитата: имей ввиду, она просит снизить уровень безопасности до минимума. Я не стал, хотя код с виду безопасный. Но, все равно, чужие дисковые операции на моем диске - ну нафиг.
Автор: sas1984
Дата сообщения: 29.10.2012 11:16
Столкнулся со сложным случаем. никак не могу подобрать решение.
Есть.
25 папок. В каждую папку с почты сортируется excel файл с сегодняшней датой (01.10, 02.10, 03.10 и т.д.)
в каждом excel файле разной длины таблицы, но везде есть подпись:
сдал фамилия
принял фамилия

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

Также по мимо эксель файлов есть 25 папок, в которые приходят документы в ворде, имя файла - сегодняшняя дата.
Там также есть фамилия в таблице. проблема забрать состоит в том что в документах разные шапки, разная высота.
в ворде есть шапка + таблица в 5 колонок (дата, время, фамилия, еще что-то, еще что-то)

Попробывал написать макрос, копируя все из ворда и вставляя из буфера в чистый документ эксель, а затем выделяя во всем документе 3 колонку (с фамилией) копировать ее в чистовой документ ексель.
в чистовой вставляется таблица с фамилиями, но через большое колличество пустых строк. Нашел код для удаления устых строк, но не пробывал в действии (http://www.planetaexcel.ru/tip.php?aid=31)
столкнулся с проблемой. не знаю как сделать так чтобы макрос работал с сегодняшним файлом. что будет если файла одного из 25 нет.

Подскажите решение? нужны фамилии из всех 25 документов. Не принципиально будет фамилия браться из ворда или экселя. Может есть более легкий способ? Например из ворда можно найти объект - таблицу и забирать ее без лишних букв.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.