Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Эмуляция F2 в VBA
 
Помогите настроить этот код, для того чтобы он переходил к следующей ячейке.
То есть, в столбце "А", чтоб он каждую перекликал.

Код
Option Explicit
Private Declare Sub keybd_event Lib "user32.dll" ( _
                    ByVal bVk As Byte, _
                    ByVal bScan As Byte, _
                    ByVal dwFlags As Long, _
                    ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2
Const VK_F2 = 113

Sub Click_F2()
    keybd_event VK_F2, 0, 0, 0
    keybd_event VK_F2, 0, KEYEVENTF_KEYUP, 0
End Sub


Спасибо.
 
Можно поинтересоваться, зачем такой изврат? Вопрос не праздный. Я подозреваю, что Вы занимаетесь ерундой и есть гораздо более простое и эффективное решение.
Я сам - дурнее всякого примера! ...
 
Linkmar, а вообще это свинство! Вам дали этот код на форуме Сержа в теме: http://www.excelworld.ru/forum/10-5309-1
Там же Сергей задал Вам тот же вопрос, что и я. И Вы даже не поблагодарив Саню, за потраченное на Вас время поперлись на другой форум попрошайничать. Отвратительно!
Я сам - дурнее всякого примера! ...
 
В принципе все можно сделать без API
Код
Sub Emul_F2()
    Application.SendKeys "{F2}"
    Application.SendKeys "{ENTER}"
End Sub

запускаем с листа(через Al+F 8)

или можно циклом(показано до 100-ой строки)
Код
Sub Emul_F2()
    Dim lCnt As Long
    Do While lCnt < 100
        Application.SendKeys "{F2}"
        Application.SendKeys "{ENTER}"
        lCnt = lCnt + 1
    Loop
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо за помощь
 
Что нужно изменить в макросе, если нужно для каждой ячейки диапазона
программно сэмулировать нажатие на F2 и Enter (excel 2003)?
Если не можешь победить беспорядок, возглавь его
 
Сомневаюсь что нужно именно это.
 
Только при изменении значения в ячейке (их много) происходит активация макроса (Private Sub Worksheet_Change(ByVal Target As Range), который соотносит значение с другой ячейкой и закрашивает диапазон.

Если изменяю значение в сопоставляемой ячейке то макрос не выполняется. Если F2 + Enter то выполняется.
Изменено: MedvedevAV - 4 Дек 2014 11:54:28
Если не можешь победить беспорядок, возглавь его
 
Можно макрос вызвать принудительно другим макросом. Так что необязательно прокликивать ячейки.
 
MedvedevAV, в вашем случае простой способ - берете макрос  Worksheet_Change, переименовываете, например, в  avada_kedavra. Создаете еще раз макрос Worksheet_Change, в нем ставите вызов в таком виде примерно:
Код
Call avada_kedavra(Target) ' это для одной ячейки, только убедитесь, что она одна, заранее

создаете еще один макрос, например, Voldemort
Код
Sub Voldemort()
Dim cell as Range
For Each cell in Selection
   Call avada_kedavra(cell)
Next
Exit Sub

ну и добавляете всякие проверки на правильность выбранных ячеек и пр.
F1 творит чудеса
 
Максим, можно не переименовывать.
 
Hugo, согласен :)
ну я просто знаю, о каком макросе идет речь  :)  там много строк, , уже имеющих данные, которые надо обработать, и также нужно оставить возможность срабатывать на изменения. Вопрошающему так будет нагляднее - есть процедура, может запускаться по изменению, а может - по вызову.
F1 творит чудеса
 
Как вы у меня к сожалению не получилось.

Может проще есть вариант. Достаточно будет выполнить отдельный макрос по кнопке (всего 1 раз в год надо).
Пробовал через копирование-спец.вставка со сложением, но в результате это влияет только на первую ячейку диапазона.
То есть вычисление происходит, а влияние на только изменение первой колонки
Если не можешь победить беспорядок, возглавь его
 
Цитата
MedvedevAV пишет: у меня к сожалению не получилось.
покажите, как выглядят в итоге ваши макросы (лучше в файле), и опишите, как вы их запускаете. макрос из #10 нужно запустить, выделив мышкой диапазон, например, дат, зацепив все нужные строки - он отправляет на переработку выделенные ячейки, по одной.
F1 творит чудеса
 
Максим Зеленский, Свой файл, вернее один лист из него, выложил в примере.
Ваши предложения из #10 пробовал по разному, но так и не вышло ничего путного.
Гляньте "своим глазом", что можно сделать.

Заранее благодарю, вы и так уже много для решения моего вопроса сделали.
Если не можешь победить беспорядок, возглавь его
 
Цитата
MedvedevAV пишет: Ваши предложения из #10 пробовал по разному
не увидел ваших проб в файле.  :)

В любом случае, решений минимум два.
Первое - полукустарное. Создаете в модуле того же листа вот такой макрос:
Код
Sub Voldemort()
Dim cell
For Each cell In Selection
    Call Worksheet_Change(cell)
Next
End Sub
Выделяете на листе столбик с желтыми ячейками, которые хотите обновить, например, вот так

Запускаете вышеупомянутый макрос. Он пройдется по всем выделенным ячейкам, запуская макрос обработки так, как-будто в них произошло желаемое F2+Enter

Второй способ сложнее, но правильнее. смотрите его реализацию в файле.
1) В текущем макросе Worksheet_Change всю основную часть начиная со строки 16 (начинается с With Application) выносите в отдельный макрос, называете его как хотите, (пусть будет Avada_Kedavra), но у него должен быть аргумент "Target", так же, как и у Worksheet_Change. Внутри у нового макроса надо будет удалить/закомментировать три строчки.

2) в макросе Worksheet_Change делаете два варианта запуска обработки: для всех строк с 8 по последнюю (например, по последнюю заполненную в списке групп), если изменена ячейка AZ7, и для одной строки, если ячейка в "желтом" столбце в строках c 8 и далее.

PS
так и не понял, зачем вы сделали такую громоздкую реализацию перебора. Выражение For c=17 To 17 - бессмысленное, в общем-то, я вам показывал, как это лучше сделать
F1 творит чудеса
 
Все получилось как надо.
Буду разбираться и использовать это в работе.

Спасибо за помощь!!!  
Если не можешь победить беспорядок, возглавь его
Страницы: 1
Читают тему (гостей: 1)