Подтвердить что ты не робот

Excel VBA, получая диапазон от неактивного листа

Этот script отлично работает, когда я просматриваю лист "Temp". Но когда я нахожусь на другом листе, команда копирования не работает. Она дает "Определенную приложением или объектную ошибку"

Sheets("Temp").Range(Cells(1), Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

Я могу использовать этот script вместо этого, но потом у меня проблемы с вставкой

Sheets("Temp").Columns(1).Copy
Sheets("Overview").Range("C40").PasteSpecial
  • Я не хочу активировать лист "Temp", чтобы получить этот

Что еще я могу сделать

4b9b3361

Ответ 1

Ваша проблема заключается в том, что, поскольку ссылки сотовой Cell внутри Range являются неквалифицированными, они относятся к листу по умолчанию, который не может быть листом, который вы планируете использовать. Для стандартных модулей, модуля ThisWorkbook, пользовательских классов и модулей пользовательской формы, defeault - это ActiveSheet. Для Worksheet кода позади модулей, это то, что лист.

Для модулей, отличных от кода рабочего листа за модулями, ваш код на самом деле говорит

Sheets("Temp").Range(ActiveSheet.Cells(1), ActiveSheet.Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

Для кода рабочего листа за модулями ваш код на самом деле говорит

Sheets("Temp").Range(Me.Cells(1), Me.Cells(1).End(xlDown)).Copy
Sheets("Overview").Range("C40").PasteSpecial

В любом случае решение одно и то же: полностью квалифицируйте ссылки диапазона с требуемой книгой:

Dim sh1 As Worksheet
Dim sh2 As Worksheet

Set sh1 = ActiveWorkbook.Sheets("Temp")
Set sh2 = ActiveWorkbook.Sheets("Overview")

With sh1
    .Range(.Cells(1,1), .Cells(1,1).End(xlDown)).Copy
End With
sh2.Range("C40").PasteSpecial

Ответ 2

Я сам столкнулся с такой проблемой: я пытался выполнить поиск по отдельному листу, чтобы узнать, соответствует ли цвет элемента ячейке цвета ячейки в списке и возвращает строковое значение: если вы используете .Cells( строка, столбец), вам нужно только следующее: Листы ( "имя листа" ). Ячейки (строка, столбец) для ссылки на этот диапазон ячеек.

Я перебирал блок из 500 ячеек, и он работает для меня неожиданно быстро.

Я не пробовал это с помощью .Copy, но я бы предположил, что он будет работать одинаково.

Ответ 3

Это будет сделано, я не люблю использовать (xlDown) в случае, если ячейка пуста.

Dim lRow As Long
lRow = Sheets("Temp").Cells(Cells.Rows.Count, "A").End(xlUp).Row

With Sheets("Temp")
     .Range("A1:A" & lRow).Copy Sheets("Overview").Range("C40")
End With

Или, если вы хотите просто использовать столбцы...

Sheets("Temp").Columns(1).SpecialCells(xlCellTypeConstants).Copy Destination:=Sheets("Overview").Range("C40")