У меня есть несколько проблем с некоторыми ОЧЕНЬ простыми строками кода. Позвольте мне подробно изложить факты и посмотреть, сможет ли кто-нибудь еще воспроизвести это поведение. Если кто-то может реплицировать, я хотел бы получить объяснение, почему это происходит.
Итак, давайте начнем с очень простой строки кода, КОТОРЫЙ РАБОТАЕТ:
Dim arr() As Variant
arr = Range("A1:A10")
выполняется так, как ожидалось, arr
присваивается значения A1:A10
теперь почему не будет работать следующая строка кода?
Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")
Я получаю несоответствие типа "13" времени выполнения, хотя тот же диапазон был успешно присвоен массиву, без значения рабочего листа.
Но
Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")
И
Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))
РАБОТАЕТ
Теперь, прежде чем ответить, позвольте мне дать вам еще несколько фактов.
Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")
Не работает
и использование Sheets
вместо Worksheets
также дает одну и ту же ошибку.
Я убедился, что это тот же лист, что и активный ссылочный лист, используя Range("A1:A10").Worksheet.Name
. После рабочего кода он действительно говорит Sheet1
на выходе.
Никакие другие книги не открыты, поэтому они не могут ссылаться на другую книгу.
Теперь этот последний бит кода добавляет к моей путанице, поскольку он полностью работает!
Dim arr() As Variant
Dim SampleRange As Range
Set SampleRange = Worksheets("Sheet1").Range("A1:A10")
arr = SampleRange
Таким образом, использование SAME RANGE, определенного таким же образом на том же листе, теперь работает, когда я назначаю его переменной диапазона. и использовать это! И, как и ожидалось, это работает как с функциями Worksheets
, так и Sheets
независимо от того, как я определяю лист (я могу использовать индекс или имя рабочего листа и все нормально работать)
Если это кому-то помогает, я тестирую это с помощью Excel 2007 на компьютере под управлением Windows XP. Я еще не тестировал его на каких-либо других машинах, но я планирую протестировать в 2003 и 2010 годах на Windows 7 и 8, просто еще не было возможности.
ОБНОВЛЕНИЕ: Не 100% уверены, что это то же самое, что и в случае с массивом, но из мелкого представления это выглядит как:
Range("B1:B3") = Range("A1:A3")
Вышеприведенный код не будет работать, даже если заполняется A1: A3, даты, числовые значения, строки, формула, он будет записывать пробелы в B1: B3
Но
Range("B1:B3").Value = Range("A1:A3").Value
И
Range("B1") = Range("A1")
работает!
Также работает:
Range("B1:B3") = Application.Transpose(Application.Transpose(Range("A1:A3")))