2013-08-28 2 views
0

Я пытаюсь найти это, но я не могу! Можно ли перемещать/копировать и VBA массив в Range Переменная, я не говорю, что целый ряд клеток, это диапазон, который вы заявляете (например: DIM побежал, как Range)Перемещение массива в диапазон VARIABLE

Я хочу что-то вроде этого :

Public Function test() 

Dim ran As Range 
Dim myArray(4) As Integer 

myArray(1) = 1 
myArray(2) = 2 
myArray(3) = 3 
myArray(4) = 4 

'If I do this, it works! 
Range("A1:A4") = myArray 

'But I want this and it does not work! 
ran = myArray 

End Function 

Спасибо!

+0

Что находится в массиве? –

+1

Я не думаю, что это возможно.Диапазон - это объект рабочего листа, а массив - индексированная серия значений данных с одинаковым типом. Вы можете устанавливать только объекты диапазона объектов = объекты диапазона рабочего листа. – tigeravatar

+0

Однако стоит отметить, что у вас может быть массив объектов диапазона: 'Set myArray (0) = Range (" A1: A10 ")' и 'Set myArray (1) = Range (" C1: C10 ")' – tigeravatar

ответ

2

Даже если диапазон объявлен в коде, он по-прежнему Range, а не массив. Если myArray на самом деле является объектом Range (в этом случае вы должны пересмотреть свои соглашения об именах), вы сможете сделать то, что показал ваш пример.

Однако, если ваша переменная myArray - это другой тип объекта (например, массив), вы не можете просто установить его таким образом, вам придется написать метод, который преобразует myArray в диапазон.

EDIT:

Я предполагаю, что причина, что Range("A1:A4") = myArray работы происходит потому, что оператор присваивания перегружена, чтобы поддержать его как стенография для Range("A1:A4").Value = myArray.

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

Когда вы объявляете Dim ran As Range вы на самом деле не инициализирован ваш объект Range пока. Я предполагаю, что если бы вы сделали следующее, это сработало бы:

Dim ran As Range("A1:A4") 
Dim myArray(4) As Integer 

myArray(1) = 1 
myArray(2) = 2 
myArray(3) = 3 
myArray(4) = 4 

ran = myArray 
+0

Это правильно, так как диапазон относится к диапазону в офисном документе (ячейки в Excel, часть документа в Word.) В обоих случаях он всегда ссылается на что-то в документе (а не только на адрес adhoc class/memory.) –

+0

Кроме того, я понимаю, что Range является массивом, но я вижу, что Range имеет некоторую внутреннюю структуру, или я ошибаюсь? – Braulio

+0

@Braulio - да и нет (в указанном порядке). Диапазон не является массивом, это объект с свойствами и методами. В некоторых случаях он может * вести себя * или * смотреть * как массив: например, вы можете ссылаться на 'MyRange (3)', но это просто сокращение для 'myRange.Cells (3)', и вы можете назначить значение диапазона быть содержимым массива, но Range все еще является отдельным классом объекта. –

0

Если вы задаете вариант для диапазона рабочих листов, вы получаете двумерный массив. Тест

Sub MoveArray() 

Dim myArray 

myArray = Range("A1:B3").Value 

Range("A6:B8").Value = myArray 


End Sub 

Или этот

Sub MoveArray2() 

Dim myArray 
Dim myArray2 
Dim myRange 
Dim i As Integer 
Dim j As Integer 

myArray = Range("A1:B3").Value 

Set myRange = Range("A6:B8") 
For i = 1 To myRange.Rows.Count 
    For j = 1 To myRange.Columns.Count 
     myRange.Cells(i, j) = myArray(i, j) 
    Next j 
Next i 

myArray2 = myRange 

End Sub 

В любом случае вариант становится массивом, а не объект диапазона и петля установить значение в диапазоне от массива.

Редактировать

Как вы можете видеть из комментариев в вопросы/ответы в этой теме диапазон не является массивом, это сложный объект, который имеет много свойств и методов. Одно из свойств (я думаю, свойство по умолчанию) - значение. Это свойство фактически представляет собой двумерный массив (или, по крайней мере, ведет себя как один) значений ячеек в диапазоне. Таким образом, если myArray также является 2-мерным aray, выполняется код myRange = myArray. Что произойдет, так это значение ячеек, на которые ссылается диапазон, будет установлено в значениях в массиве. Диапазон относится к этим ячейкам, но это значения в ячейках, которые изменяются, а не объект диапазона.

Таким образом, если при передаче диапазона в различный набор ячеек новый набор ячеек сохраняет его значения.

С практической стороны, если вы хотите изменить значение ячеек, что диапазон referes вам может сделать это, как показано ниже:

Sub Test1() 

Dim myArray(1 To 4, 1 To 1) 
Dim myRange As Range 

myArray(1, 1) = 1 
myArray(2, 1) = 2 
myArray(3, 1) = 3 
myArray(4, 1) = 4 

Set myRange = Range("A1:A4") 
myRange = myArray 

End Sub 
+0

, не связанный с вопросом, но также довольно аккуратный, заключается в том, что метод по умолчанию .Value можно даже использовать для копирования данных между многоядерными диапазонами, а не с промежуточным шагом, например, в примере MoveArray, например, «Range (« A1: A5 "). Value = Range (" A6: A10 "). Value' (хотя я понятия не имею, будет ли VBA внутренне использовать временный массив, и в этом случае он не сохраняет пробел по сравнению с примером - он сохраняет набрав хотя бы!) –

+0

@Cor_Blimey на нижней стороне, если вы пытаетесь изменить ячейки, на которые ссылается диапазон, но забудьте, что ключевое слово set копирует значения в исходный диапазон. –

+0

@GrahamAnderson aye, мы все это сделали! –