2016-03-22 3 views
1

Во время запуска сценария, если вручную удалить фокус из рабочей книги, содержащей макрос, я получаю указанную ошибку. Если я не нажму на что-нибудь, это будет работать без проблем. Ошибки скрипта возникают только тогда, когда я пытаюсь вернуть выбор на A1 с листа «Вход». Точка Перерыв на следующей строке:Ошибка времени выполнения '1004': выбор метода класса диапазона не удался с помощью ThisWorkbook

ThisWorkbook.Sheets("Input").Range("A1").Select 

Если я отлаживать и место фокус назад на макро рабочем листе скрипт завершает без проблем. Предыдущая строка:

ThisWorkbook.Sheets("Input").Cells.Delete 

работает без ошибок, так что я угадал его диапазон, который выпадает из сферы, но не совсем понимаю, почему, как это должно быть определено в предыдущих области видимости нотации. Может кто-нибудь объяснить, почему эта линия выходит из сферы действия? Должно ли ThisWorkbook достаточно четко определить Рабочую книгу, на которую ссылается мой код? Любые рекомендации приветствуются.

+0

Интересно. Не могли бы вы оказать мне услугу и проверить одно? Замените «ThisWorkbook.Sheets» («Вход»). Диапазон («A1»). Выберите 'с' shtInputSheetCodeName.Range («A1»). Выберите' и повторите попытку. Конечно, вам придется обмениваться CodeName для реального? ThisWorkbook.Sheets («Input»). CodeName «Другое дело было бы« Активировать »лист перед' .Выберите что-нибудь на листе. Итак, попробуйте поместить 'ThisWorkbook.Sheets (« Вход »). Активируйте' непосредственно перед тем, как вы выберите «Выбрать». – Ralph

+0

Также см. [Как избежать использования Select в Excel VBA macros] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) –

+0

Такая же проблема с использованием CodeName , Обратите внимание, что у него есть общее имя_колонка 'Sheet1', которое идентично единственному листу из другой открытой книги. Любые другие идеи будут приветствоваться. – nbayly

ответ

3

Это не имеет никакого отношения к ссылке на ThisWorkbook. Вы просто не можете выбрать диапазон в объекте, который неактивен. Рассмотрим этот код, который демонстрирует ту же ошибку:

Private Sub OneOhOhFour() 

    'Executing with Book1.xlsm active and Book2.xlsx open. 
    Dim wb As Workbook 
    Set wb = Application.Workbooks("Book2.xlsx") 
    Debug.Print ThisWorkbook.Name 
    'Outputs 'Book1.xlsm' to Immediate window. 
    wb.Sheets("Sheet1").Range("A1").Select 'Error 1004 

End Sub 

То же самое и с Таблицах:

Private Sub OneOhOhFourVTwo() 
    'Starting on anywhere but Sheet2 gives an error. 
    Dim ws As Worksheet 
    Set ws = ThisWorkbook.Worksheets("Sheet2") 
    ws.Range("A1").Select 'Error 1004. 
End Sub 

Самое простое решение для активации объекта, прежде чем выбрать в нем:

Private Sub NoOneOhOhFour() 

    Dim wb As Workbook 
    Set wb = Application.Workbooks("Book2.xlsx") 
    wb.Activate 
    wb.Sheets("Sheet1").Range("A1").Select 'No error. 

End Sub 

Еще лучше использовать ссылки и стараться полностью не использовать объекты Selection и Active *.

+0

Отличное объяснение и разрешение моей проблемы. Как я уже упоминал в своем комментарии выше, я не делаю никаких манипуляций с данными с помощью '.Select', а просто перезагружает рабочий лист в исходное состояние с фокусом, установленным в верхнюю правую ячейку. С уважением и благодарю вас. – nbayly

+1

Я бы порекомендовал добавить еще одну строку, чтобы убедиться, что вы не получите ошибку, если рабочий лист скрыт. 'wb.Visible = xlSheetVisible' перед строкой' wb.Sheets («Sheet1»). Range («A1»). Select' –

+0

@SiddharthRout нравится, как ваше мышление о всех возможных ситуациях. Поскольку пользователи должны активировать лист для запуска сценария, хотя я не думаю, что это будет ситуация, в которой мы будем работать в оперативном режиме. Спасибо, хотя за идею :) – nbayly