2015-10-29 5 views
0

Я создал макрос с целью переключения содержимого между двумя ячейками. Хотя это работает, я думаю, что это можно было бы написать более элегантным способом.Коммутационные ячейки Макро - Странное поведение

Рассмотрим на следующие пример:

enter image description here

Supose, что в предыдущей картине вы выбрали первые две ячейки ("Джек" и "The"). После запуска макроса содержимое выбранных ячеек переключается.

Рабочий код заключается в следующем:

Sub SwitchCells() 

    Dim R As Range 
    Set R = Range(Selection.Address) 

    Dim Temp As String 

    If R.Count = 2 Then 
     Temp = R(1).Value 
     R(1) = R(2) 
     R(2) = Temp 
    End If 

End Sub 

Хотя это работает, я хотел бы, что временная переменная будет также Range Object (а не строка, как и в предыдущем примере), так что макрос будет просто переключаться между объектами. Я хотел бы сделать что-то вроде этого

Sub SwitchCells() 

    Dim R As Range 
    Set R = Range(Selection.Address) 

    Dim Temp As Range 

    If R.Count = 2 Then 
     Set Temp = R(1) 
     R(1) = R(2) 
     R(2) = Temp 
    End If 

End Sub 

Проблемы в этой второй версии макроса является то, что, когда R(1) получает значение R(2), так же временное переменную Temp

Кажется, что Temp не является переменная, но указатель на адрес переменной.

Я не совсем понимаю, почему это происходит. Не могли бы вы объяснить или указать какое-то направление по причине этого поведения?

Спасибо за ваше время.

Eduardo.

+0

Я думаю, что поскольку «Range.Value» является «Variant», он считается типом значения и поэтому передается значением в «Temp» в вашем первом случае. 'Range' является ссылочным типом и поэтому передается ref в вашем втором случае (или, другими словами, как указатель, как вы упомянули). Прочтите [эту статью] (https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx) для дальнейшего объяснения. – Mike

ответ

0

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

Обычный способ обойти это можно было бы создать новый объект и скопировать соответствующие значения на него. К сожалению, объекты Range не могут быть непосредственно созданы и существуют только как часть рабочего листа объекта:

Dim r As Range 
' This line won't compile because we can't create a new Range 
Set r = New Range 
' This line will trigger a runtime error 
Set r = CreateObject("Excel.Range") 

Для конкретного случая двух клеток, которые находятся в том же столбце и рядом друг с другом, есть простой обходной путь:

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