2015-06-17 8 views
0

У меня есть некоторые данные результата в листе Извлечение, что мне нужно активировать ячейку по ячейке и нажать enter. Это нормально для 10 ячеек, но у меня более 40 000. Так что я написал несколько макросовVBA Excel SendKeys Macro

Sub Refresh() 
    Dim lastrow As Long 
    lastrow = ActiveWorkbook.Worksheets("Extract").Range("Q" & rows.Count).End(xlUp).Row 
     For j = 2 To lastrow 
      Sheets("Extract").Activate 
      Sheets("Extract").Range("Q" & j).Select 
      Application.SendKeys "{F2}" 
      Application.SendKeys "{ENTER}" 
      DoEvents 
     Next j 
End Sub 

И это не работает. Я получаю ошибку gettin 1004 Определяемую приложением или Object-defined ошибку.

Что я делаю неправильно?

Спасибо за помощь

EDIT: Решение было простым. Я не активировал Sheet Extract. У меня есть новая строка в коде, и все работает нормально.

Благодарим за помощь.

+0

В какую строку вы принимаете ошибку? – TMH8885

+0

Вы хотите (или должны) соблюдать ту же процедуру? Можем ли мы полностью удалить вход и просто пропустить его через ваши события? Почему необходимо нажать клавишу ввода для того, чтобы события работали? –

+0

Что я читаю здесь: http://www.mrexcel.com/forum/excel-questions/697548-help-sendkeys-only-first-sendkey-command-works.html - это то, что приложения application.sendkey могут помочь, добавив небольшая задержка, когда они используются один за другим. Может быть, вы могли бы попробовать? Без контекста трудно помочь! –

ответ

1

Дайте этому попытку:

Sub Refresh() 
    Dim lastrow As Long 
    Worksheets("Extract").Activate 
    lastrow = Range("Q" & Rows.Count).End(xlUp).Row 
    For j = 2 To lastrow 
     Range("Q" & j).Select 
     Application.SendKeys "{F2}" 
     Application.SendKeys "{ENTER}" 
     DoEvents 
    Next j 
End Sub 

EDIT # 1:

Эта версия будет удалить «болтовня: **

Sub Refresh() 
    Dim sOLD As Worksheet 
    Set sOLD = ActiveSheet 
    Application.ScreenUpdating = False 
     Dim lastrow As Long 
     Worksheets("Extract").Activate 
     lastrow = Range("Q" & Rows.Count).End(xlUp).Row 
     For j = 2 To lastrow 
      Range("Q" & j).Select 
      Application.SendKeys "{F2}" 
      Application.SendKeys "{ENTER}" 
      DoEvents 
     Next j 
     sOLD.Activate 
    Application.ScreenUpdating = True 
End Sub 
+0

Спасибо :) Да, это прекрасно работает. Только быстрый вопрос.Когда я запускаю макрос, все изменения видны мне (я вижу извлечение листа и все действия, которые происходят там). Как настроить этот макрос для запуска более невидимого? Я не хочу видеть, что происходит в листе Extract. – LukeJ

+0

@LukeJ Посмотри мой ** ИЗМЕНИТЬ # 1 ** –

+0

Получил это. Прекрасно работает. Большое вам спасибо :)) – LukeJ

0

Похоже, вы перебираете j, но в своем коде ссылаетесь на ячейку в строке i.

For j = 2 To lastrow 
    Sheets("Extract").Range("Q" & i).Select 

Они должны быть изменены, чтобы соответствовать, то есть изменить i к j.

+0

Да, новичок, но все же: Выбирать метод класса диапазона не удалось – LukeJ

+0

У вас есть активная листка «Извлечь»? Если нет, вам нужно либо активировать его, либо использовать команду «Application.GoTo». – TMH8885

+0

Если вы закомментируете события после диапазона, все равно отправляет ошибку диапазона? Если нет, что заставляет его отправлять сообщение об ошибке? –

0

На следующий день пришел, когда я решил использовать макрос, предоставленный студентом Гэри (до сих пор я использовал мой метод). Так что я снова запускаю макрос, и я был удивлен, но макрос был только для первых 39 строк.

Когда я ставлю на комментарий эту строку

'Application.ScreenUpdating = False 

Он отлично работает, но я вижу, как макрос выполняется строка за строкой (я не хочу видеть, что)

Что может вызвать проблемы ?