Страницы: 1
RSS
VBA - присвоение значений ячеек с другого листа
 
Имеется следующий фрагмент:

h = Sheets("дд").Range("A62000").End(xlUp).Row
d = Sheets("дд").Range(Cells(2, 1), Cells(h, 2)).Value

Собственно говоря, необходимо присвоить в переменную значения некоторого диапазона с другого листа. Почему-то на 2 строке выдает ошибку "Run-time error 1004"
Если же мы находимся на этом самом листе или добавляем перед этим
Sheets("дд").select
то все нормально работает.
Может, кто-нибудь знает, в чем причина?..
 
Код
d = Sheets("дд").resize(h-1, 2).Value
Учимся сами и помогаем другим...
 
Попробуйте так
Код
With Sheets("дд")
h = .Range("A62000").End(xlUp).Row 
d = .Range(.Cells(2, 1), .Cells(h, 2)).Value
End With
 
Тоже самое, на 2-й строке ошибка выдается...
Excel 2007, если чего...
 
dx01 = Sheets("дд";).Range("A2";).Resize(h - 1, 2).Value

ber$erk, так - да, работает... Спасибо...

Все равно вопрос-то остается в причине ошибки, т.к не особенно понятно, откуда она возникает-то...
Относительно исходного варианта интересно - это у меня excel кривой стоит, или так на самом деле нельзя писать (почему???)...
 
Файл приложите в формате .xls
 
Цитата
denis76 пишет:

Все равно вопрос-то остается в причине ошибки, т.к не особенно понятно, откуда она возникает-то...
Относительно исходного варианта интересно - это у меня excel кривой стоит, или так на самом деле нельзя писать (почему???)

Меня смущает, что код Кузьмича выдает у Вас ошибку, а он ее выдавать не должен (у меня его код отрабатывает нормально). А по поводу ситуации в целом:
изначально в коде
Код
d = Sheets("дд").Range(Cells(2, 1), Cells(h, 2)).Value

Cells(2, 1) и Cells(h, 2) ссылаются на ячейки другого (отличного от "дд") листа. Поэтому и вылезает ошибка пока напрямую не указать нужный лист (ну или не перейти на него).
Учимся сами и помогаем другим...
 
Цитата
ber$erk пишет:

Cells(2, 1) и Cells(h, 2) ссылаются на ячейки другого (отличного от "дд") листа. Поэтому и вылезает ошибка пока напрямую не указать нужный лист (ну или не перейти на него).

Ну как бы мне кажется, что мы тут ведь и пишем явным образом указание на нужный лист -  
Sheets("дд").Range(Cells...
или, аналогично,
With Sheets("дд")...
,однако не работает...
Тогда как в 1-й строке у нас тоже указание на другой лист
h = Sheets("дд").Range("A62000").End(xlUp).Row
,однако работает...

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

Sub p40()

  hd = Sheets("дд").Cells(62000, 1).End(xlUp).Row
  dx01 = Sheets("дд").Range(Cells(2, 1), Cells(hd, 2)).Value

End Sub

ну и запускаем, находясь на другом листе... и пишет ошибку...

Resize работает нормально...
 
Цитата
denis76 пишет:
Насчет вставить файл - не знаю, как его сюда вставлять
А что тут непонятного? См. файл.
 
denis76, из своего опыта могу сказать, что многие свойства и методы объекта Range (например, Find) не работают, если лист не является активным. IMHO это следует воспринимать как данность и при обращениях к Range сначала использовать Sheets(имя листа).Select или Activate.
 
Цитата
denis76 пишет:
Ну как бы мне кажется, что мы тут ведь и пишем явным образом указание на нужный лист -
Sheets("дд").Range(Cells...

явно Вы указываете только Sheets("дд").Range, а вот Cells(2, 1) и Cells(h, 2) это уже ячейки ТЕКУЩЕГО листа. т.е. явно заданное будет выгляеть так:
Код
Sheets("дд").Range(Sheets("дд").Cells(2, 1), Sheets("дд").Cells(h, 2)).Value
Учимся сами и помогаем другим...
 
Пример.
Вот такой код выдаст ошибку:
Sheets("Лист1").Activate
Set h = Sheets("Лист2").Range(Cells(1, 1), Cells(10, 10)).Find(What:="something")

А вот такой будет работать:
Sheets("Лист2").Activate
Set h = Sheets("Лист2").Range(Cells(1, 1), Cells(10, 10)).Find(What:="something")
 
Не нужны для Find Select'ы:

Sub tt()
   Sheets("Лист1").Activate 'это для демонстрации! Не нужно для работы.
   With Sheets("Лист2")
       Set h = Range(.Cells(1, 1), .Cells(10, 10)).Find(What:="something")
   End With
   If Not h Is Nothing Then MsgBox h.Address
End Sub
 
Цитата
ber$erk пишет:
явно Вы указываете только Sheets("дд").Range, а вот Cells(2, 1) и Cells(h, 2) это уже ячейки ТЕКУЩЕГО листа

Понятно... хотя на мой взгляд нелогично это... да и то, что With даже не помогает...
Ну ладно, а то думал, может я чего-то элементарного не понимаю, а раз так сделано, то вопросы к разработчикам... будем
Цитата
Alex K пишет:
воспринимать как данность...



Всем спасибо за пояснения...
 
Цитата
denis76 пишет:
что With даже не помогает..
Поможет, если код не в модуле листа. Иначе всё равно придётся указывать для каждой ячейки ещё и лист.
 
Код кстати не в модуле листа, в обычном модуле...
 
Тогда with-end with поможет. Ведь специально для этого сделано. Только точки не забывайте ставить  :)
Страницы: 1
Читают тему
Наверх