2016-02-09 5 views
0

Я написал VBA-код в этой статье, так что код будет запускаться автоматически при открытии файла Excel. Код выбирает динамический диапазон, используя xlDown, затем он будет добавлять имя в книгу в зависимости от выбора. Проверьте код ниже:Ошибка выбора диапазона в VBA

Private Sub Workbook_Open() 
    Sheets("sheet1").Range("E2", Sheets("sheet1").Range("E2").End(xlDown)).Select 
    ActiveWorkbook.Names.Add Name:="DateList", RefersTo:=Selection 
End Sub 

Я уверен, что я правильно пишу, но я получаю сообщение об ошибке, как это:

Время работы ошибка «1004»: Выберите метод Range Class не удалось

Это сообщение об ошибке выдвигает на первый план второй линии:

Sheets("sheet1").Range("E2", Sheets("sheet1").Range("E2").End(xlDown)).Select 

И когда я использую тот же метод выбора, чтобы очистить тот же диапазон, он работает без ошибок, как показано ниже:

Sheets("sheet1").Range("E2", Sheets("sheet1").Range("E2").End(xlDown)).Clear 
+0

Что именно вы пытаетесь выбрать в первой строке? – Kathara

+0

@ Kathara диапазон начинается с 'E2', и он может заканчиваться где угодно в том же столбце, что и' E15' или 'E20', поэтому он должен быть динамическим. И содержимое просто число, 6 цифр номер – user3714330

+0

. Процесс '.Clear', вероятно, запущен, потому что' sheet1' на самом деле является активным листом в этот момент времени, поэтому вы можете уйти, не уточнив ссылки на диапазон. –

ответ

1

Если нет данных под которые вы дона» т хочу - я бы с xlUp вместо того, чтобы предотвратить ошибку, когда есть только значение в Е2:

With Sheets("sheet1") 
    ActiveWorkbook.Names.Add "DateList", .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)) 
End With 
+0

Я предполагаю, что ваш метод сначала подсчитывает полные строки внутри всего листа '.Rows.Count,', если есть 7 строк с данными, тогда он становится '.Cells (7, 5) .End (xlUp)'. Тогда 'xlUp' находит первое значение вверх, которое имеет значение? В этом случае, если в других столбцах есть другие данные, тогда я должен указать '.Rows.Count' для столбца 5, правильно? – user3714330

+1

«Ячейки (.Rows.Count, 5) .End (xlUp)» - это то же самое, что и переход к последней строке в столбце E и нажатие клавиши «Ctrl + Up», которая «перескакивает» в следующую ячейку с данными в _ (который теоретически является концом вашего списка) _ и возвращает эту ячейку. Если бы у вас было только значение в E2, тогда 'xlDown' приведет к тому, что весь столбец E будет установлен как именованный диапазон, тогда как с' xlUp' просто E2 будет именованным диапазоном –

+0

да, я его протестировал, и это происходит как вы сказали, что если есть только одна строка данных, и если я использую 'xlDown'. благодаря – user3714330

1

используют это:

With Sheets("sheet1") 
    ActiveWorkbook.Names.Add "DateList", .Range("E2:E" & .[E:E].Find("*", , , , , xlPrevious).Row) 
End With 
+1

вы все равно нужно квалифицировать '[E2]' с объектом листа, поэтому с точкой перед ними –

+0

@vasily большое спасибо. это сработало. У вас есть какие-либо объяснения, почему мой метод не работал для процесса 'select', но он работал для' clear'-процесса? – user3714330

+1

Ваш код также будет работать нормально, если ранее вы активируете sheet1, метод выбора не работает, если лист не активирован. – Vasily

Смежные вопросы