Страницы: 1 2 След.
RSS
Массив из Selection
 
Приветствую!  
Не могу понять, что неправильно.  
Написал код  
Sub wwww()  
Dim aa, a  
With Selection  
aa = .Address  
a = .Range(.Address).Value  
End With  
End Sub  
 
При выделении столбца А массив формируеся правильно, а дальше...  
При выделении столбца В - массив формируется из столбца С?  
При выделении столбца С- массив формируется из столбца Е?  
При выделении столбца D- массив формируется из столбца G?
 
точка перед Range не нужна
 
Спасибо!  
Попробовал  
a = Range(.Address).Value  
.Range(.Address).Offset(15) = a  
Формируется правильно, а выгружается со смещением.  
Остался вопрос - почему в данном случае точка не нужна, и почему возникает смещение, причем различное?
 
потому что при записи .Range(.Address) адрес отсчитывается не от "начала координат" (первой ячейки листа), а от объекта Selection,  
который начинается правее.  
Оттуда и смещение.  
 
Это равносильно записи Range("d5").Range("b2")  
проверьте: Range("d5").Range("b2").Address  = $E$6
 
Вот теперь вроде все по местам улеглось!  
Спасибо!
 
Я тут на днях всю голову сломал с этим .Selection  
 
Мне необходимо было увязать .Selection и .ActiveSheet.UsedRange, с целью ускорить проход цикла по ячейкам.  
 
Могу ошибаться, но попробуйте следующее удерживая Ctrl: выделите ячейку, замтем, выделите любую другую, не смежную с ней ячейку. Код приведенный ниже, если я не ошибаюсь, будет давать только адрес первой (если вообще будет работать)  
 
 
Sub wwww()  
Dim aa, a  
With Selection  
aa = .Address  
a = .Range(.Address).Value  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
to nerv  
Адрес selection (aa) определяется правильно и полностью, хоть с Ctrl, хоть без.  
А вот значения в массив (из массива), при наличии точки идут со смещением.
 
может я чего то не понимаю? В архиве три файла. Просьба просмотреть примеры с окнами Locals & Immadiate.  
 
 
p.s.: звеняйте, у нас ОЧЕНЬ жарко, я перегрелся : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Точно перегрев!  
Все адреса выводятся полностью, а вот в массив заносятся значения только из первй части выделенного несвязанного диапазона.
 
Все верно. В массив попадут только значения первой прямоугольной области(area).  
А адрес сформируется для всех областей.
Я сам - дурнее всякого примера! ...
 
Я об этом и толкую) Тема ведь называется: "Массив из Selection", следовательно, при выделении более 1-ой не смежных областей, массив будет сформирован только из первой. Лично меня, как пользователя, это могло бы немного смущать). Впрочем, надо ориентироваться по конкретной задаче : )  
 
Тогда уж так:  
Sub io()  
Dim x  
OnError Goto L1  
For Each x in Application.Selection.Areas  
next  
L1:  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
и еще немного "танцы с бубном":  
 
Dim x, objRange as object  
with application  
For Each x In .Selection.Areas  
If x.Address = .Rows.Address Then Set objRange = .ActiveSheet.UsedRange Else Set objRange = x  
Next  
end with
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=28.07.2011 08:35}{thema=}{post}Я об этом и толкую) при выделении более 1-ой не смежных областей, массив будет сформирован только из первой{/post}{/quote} Уточнение: не обязательно несмежных. Прямоугольные области могут и пересекаться, а "массив будет сформирован только из первой".
Я сам - дурнее всякого примера! ...
 
Я не очень понял танцы с бубнами, а несколько несвязанных диапазонов в массив можно загнать так  
Sub ww()  
   Dim arr, i&, d&, cell As Range  
   With Selection  
       If .Areas.Count > 1 Then  
           For i = 1 To .Areas.Count  
               d = d + .Areas(i).Cells.Count  
           Next: i = 0  
           ReDim arr(1 To d, 1 To 1)  
           For Each cell In Selection  
               i = i + 1  
               arr(i, 1) = cell.Value  
           Next  
       End If  
   End With  
   [a20].Resize(d) = arr
End Sub
 
С этим вспылил, был не прав!  
If .Areas.Count > 1 Then
 
Андрей, а если диапазоны пересекаются?:-)
Я сам - дурнее всякого примера! ...
 
Проверил.  
Фиолетово!
 
Самый короткий вариант, кажется:  
for each c in selection.cells с предварительным  
redim a(1 to selection.cells.count)
Я сам - дурнее всякого примера! ...
 
{quote}{login=RAN}{date=28.07.2011 11:07}{thema=}{post}Проверил.  
Фиолетово!{/post}{/quote}Что фиолетово? intersect попадет в массив 2 раза.
Я сам - дурнее всякого примера! ...
 
На мой взгляд и должно было попасть столько раз, сколько выделяли.  
Я просто в настояший момент не представляю, где могло бы потребоваться это решение.  
Это уже чисто спортивный интерес.  
Можно подумать.-:)
 
Попытаюсь объяснить "танцы с бубном"  
 
Sub io()  
Dim x, objRange as object  
OnError Goto L1 ' На слечай, если выделен (к примеру) объект автофигуры и т.п.  
with application  
For Each x In .Selection.Areas ' По выделенным областям  
If x.Address = .Rows.Address Then Set objRange = .ActiveSheet.UsedRange Else Set objRange = x  
' Если выделен ВЕСЬ лит 1:65356 строк (для MS Offise 2003), ограничить диапазон Рабочей областью  
Next  
end with  
L1:End sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
про кол-во строк очепятка - 1:65536  
 
и это  
If x.Address = .Rows.Address Then Set objRange = .ActiveSheet.UsedRange Else Set objRange = x  
 
можно заменить на это  
 
Set objRange = Iif(x.Address = .Rows.Address,ActiveSheet.UsedRange,x)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=KukLP}{date=28.07.2011 08:50}{thema=Re: }{post}{quote}{login=nerv}{date=28.07.2011 08:35}{thema=}{post}Я об этом и толкую) при выделении более 1-ой не смежных областей, массив будет сформирован только из первой{/post}{/quote} Уточнение: не обязательно несмежных. Прямоугольные области могут и пересекаться, а "массив будет сформирован только из первой".{/post}{/quote}Вы, как обычно, правы : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=RAN}{date=28.07.2011 10:51}{thema=}{post}Я не очень понял танцы с бубнами {/post}{/quote}  
Т.е. что, я понял, не понял - зачем.
 
"Т.е. что, я понял, не понял - зачем."  
 
Попытаюсь объяснить на примере:  
 
Пользователь выделил весь лист, а его рабочая область составляет A1:C20. В вашем случае в массив будет содержать 65536 строк и 256 столбцов (2003 Excel). В моем только UsedRange, т.е. A1:C20.  
Зачем?  
1) уменьшение объема памяти, выделяемой под массив  
2) ускорение обработки массива
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
А если выделен не весь лист, а несколько Areas , заносим в массив значения последнего?
 
не совсем Вас понял. Можно пример (не обязательно в файле)?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Sub io()  
...................  
 
L1  
objRange  copy [a10]
End sub  
Выделяем несколько Areas , запускаем io, смотрим
 
Мы с Вами просто немного недопонимаем друг друга) Я говорю о том, что ВСЕ выбранные пользователем диапазоны будут перебираться в цикле  
 
Sub io()  
Dim x, objRange As Object  
On Error GoTo L1  
With Application  
   For Each x In .Selection.Areas ' Ïî âûäåëåííûì îáëàñòÿì  
       Set objRange = IIf(x.Address = .Rows.Address, ActiveSheet.UsedRange, x)  
       MsgBox (objRange.Address)  
objRange copy [a10] ' Если я правильно понял суть Вашего вопроса, то эта строка должна быть здесь
   Next  
End With  
L1: End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Sub io()  
Dim x, vArr  
On Error GoTo L1  
With Application  
For Each x In .Selection.Areas  
vArr = IIf(x.Address = .Rows.Address, ActiveSheet.UsedRange, x)  
' Далее работа с массивом    
Next  
End With  
L1: End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1 2 След.
Читают тему
Наверх
Loading...