2016-12-29 2 views
1

Я копирую некоторые диапазоны между листами, и я не знаю, почему это работает, только когда я активирую лист, прежде чем копировать или вставлять их. Это работает:VBA копировать и вставлять только работу, если я активирую лист

s.Activate 
s.Range(Cells(2, 8), Cells(lrow, 8)).Copy 
d.Activate 
d.Range(Cells(2, 3), Cells(lrow, 3)).PasteSpecial xlPasteValues 

Это не:

s.Range(Cells(2, 8), Cells(lrow, 8)).Copy 
d.Range(Cells(2, 3), Cells(lrow, 3)).PasteSpecial xlPasteValues 

Почему нужно VBA листы, которые будут активированы, если я уже определили их с переменными «S» и «д»? Спасибо

+0

Вам необходимо квалифицировать *** ВСЕ объекты диапазона ***: 's.Range (s.Cells (2, 8), s.Cells (lrow, 8)). Copy' –

+0

Также как примечание, пропустите в буфер обмена и назначьте значения напрямую. 'd.Range (d.Cells (2, 3), d.Cells (lrow, 3)). Значение = s.Range (s.Cells (2, 8), s.Cells (lrow, 8)). ' –

+0

Спасибо Скотту. Это действительно полезно! – uttuck

ответ

1

Это потому что, когда методы Range(...) и Cells(...) не квалифицированы, они работают на рабочем листе .

s.Activate

s.Range (Клетки (2, 8), Клетки (lrow, 8)). Copy

Если s не активный лист, вы бы запросив от s диапазон ячеек, которые не относятся к нему, но к другому, active лист. Поскольку

 Cells(2, 8)  <==> ActiveSheet.Cells(2, 8) 
     Cells(lrow, 8) <==> ActiveSheet.Cells(lrow, 8) 

Чтобы избежать этой проблемы, всегда квалифицировать ваши диапазоны и клетки:

s.Range(s.Cells(2, 8), s.Cells(lrow, 8)).Copy 

Это правильный подход; поймите, что вы используете такие вещи, как Activate и Select, понимаете, что вы, скорее всего, делаете что-то неправильно. В хорошей практике вам почти никогда не придется использовать этот материал.

+1

Удивительный. Раньше я сталкивался с этой проблемой, но никогда не знал почему. Благодаря! – uttuck

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