Страницы: 1
RSS
Значения переменных типа Range
 
Всем привет,  
 
Не могу понять как работает переменная типа Range.    
Присваиваю двум глобальным переменным типа Range помеченный диапазон:  
 
Set rngTempRange = ThisWorkBook.ActiveSheet.Range(Selection.Address)  
Set rngUndoRange = ThisWorkbook.ActiveSheet.Range(Selection.Address)  
 
в надежде, что сохраню диапазон до окончания преобразований в переменной rngUndoRange.  
Но не тут то было, при изменении значений в rngTempRange, значения изменяются на листе и в переменной rngUndoRange. Есть ли какой способ сохранять значения неизменными до окончания преобразования?  
 
Спасибо,  
Владимир.
 
А если так (как пример)  
 
Dim sAddress as String  
Dim lngValue as Long 'если число в ячейке  
 
sAddress = "A1" 'тут запоминаете адрес ячейки  
lngValue = Range("A1").Value 'тут запоминаете значение ячейки (если это число)  
 
т.е. не определять объектную переменную и присваивать ей ячейку, а просто использовать переменные типа String для запоминания адреса ячейки и ещё одну переменную для запоминания значения ячейки
 
Во-первых, строка  Set rngTempRange = ThisWorkBook.ActiveSheet.Range(Selection.Address)  
в Вашем случае аналогична строке Set rngTempRange = Selection  
 
 
Во-вторых, если сохранять ФОРМАТИРОВАНИЕ ячеек на время работы макроса не требуется, то можно поступить проще: записать в переменную не ССЫЛКУ на изменяемый диапазон (как Вы это пытались сделать), а МААСИВ ЗНАЧЕНИЙ.  
 
Получится что-то вроде этого:  
 
' запоминаем до запуска макроса:  
UndoAddress = Selection.Address  
UndoValue = Selection.value  
 
 
' восстанавливаем в случае необходимости:  
Range(UndoAddress).value = UndoValue
 
{quote}{login=EducatedFool}{date=26.10.2009 03:07}{thema=}{post}Во-первых, строка  Set rngTempRange = ThisWorkBook.ActiveSheet.Range(Selection.Address)  
в Вашем случае аналогична строке Set rngTempRange = Selection  
 
 
Во-вторых, если сохранять ФОРМАТИРОВАНИЕ ячеек на время работы макроса не требуется, то можно поступить проще: записать в переменную не ССЫЛКУ на изменяемый диапазон (как Вы это пытались сделать), а МААСИВ ЗНАЧЕНИЙ.  
 
Получится что-то вроде этого:  
 
' запоминаем до запуска макроса:  
UndoAddress = Selection.Address  
UndoValue = Selection.value  
 
 
' восстанавливаем в случае необходимости:  
Range(UndoAddress).value = UndoValue{/post}{/quote}  
 
Спасибо Игорь,  
 
Касательно Set rngTempRange = Selection - так и пытался по началу, но почему-то выпадала ошибка (потому и явно указал).
 
{quote}{login=VovaK}{date=26.10.2009 06:14}{thema=Re: }{post}  
Касательно Set rngTempRange = Selection - так и пытался по началу, но почему-то выпадала ошибка (потому и явно указал).{/post}{/quote}Я так понимаю, что rngTempRange была объявлена  As Range, а в какой-то момент Selection рангом не являлось. Отсюда и ошибка.
Bite my shiny metal ass!      
 
Игорь, мне как раз нужно форматирование. Как посоветуешь покороче записать сохранение UndoRange на временном скрытом листе с последующим удалением оного.  
 
Спасибо.
 
Во-первых, строка Set rngTempRange = ThisWorkBook.ActiveSheet.Range(Selection.Address)  
в Вашем случае аналогична строке Set rngTempRange = Selection  
 
 
- как узнали? selection подразумевает activeworkbook, а оно не всегда ThisWorkBook..
Живи и дай жить..
 
{quote}{login=слэн}{date=26.10.2009 10:17}{thema=}{post}как узнали?    
selection подразумевает activeworkbook, а оно не всегда ThisWorkBook..{/post}{/quote}  
Да знаю я это...  
 
Мне показалось, что в данном случае крайне маловеротна ситуация с activeworkbook <> ThisWorkBook.  
 
 
> Как посоветуешь покороче записать сохранение UndoRange на временном скрытом листе с последующим удалением оного.  
 
Да просто создай копию обрабатываемого листа:  
activesheet.copy activesheet  
activesheet.visible=0  
 
Как-то так...
 
Спасибо
Страницы: 1
Читают тему
Наверх