Страницы: 1
RSS
Массив диапазонов
 
В одной случае  не работает, во втором работает почему ?  
Sub test1()'Не работает  
Dim rng As Range, rng1 As Range, rng2 As Range, arr, i&  
ReDim arr(2)  
For i = 0 To 2  
Set rng = Range("A" & 1 + i & ":C" & i + 1)  
arr(i) = rng  
Next i  
arr(2).Interior.Color = 65535  
End Sub  
 
Sub test2()'Работает  
Dim rng As Range, rng1 As Range, rng2 As Range, arr, i&  
Set rng = Range("A1:C1")  
Set rng1 = Range("A2:C2")  
Set rng2 = Range("A3:C3")  
arr = Array(rng, rng1, rng2)  
arr(2).Interior.Color = 65535  
End Sub  
 
 
*22757*
Спасибо
 
Sub test1()    
Dim rng As Range, i&  
For i = 0 To 2  
Set rng = Range("A" & 1 + i & ":C" & i + 1)  
rng.Interior.Color = 65535  
Next i  
End Sub  
чувствуете разницу?  
как можно назначить заливку тому, что не range  
75755
 
Потому, что во втором случае arr - массив диапазонов, а в первом - массив значений(у них нет свойства интерьер).
Я сам - дурнее всякого примера! ...
 
теперь въезжаю спасибо Сергей  
т.е. правильней в массив записать адреса диапазонов, а затем уже range(arr(i))  
 
можно закрывать :)
Спасибо
 
В первом случае тоже работает, если вместо arr(i) = rng написать  
Set arr(i) = rng  
Будет массив диапазонов.
 
{quote}{login=Казанский}{date=02.11.2010 09:23}{thema=}{post}В первом случае тоже работает, если вместо arr(i) = rng написать  
Set arr(i) = rng  
Будет массив диапазонов.{/post}{/quote}  
Вот за это спасибо огромное!  
Алексей еще вопросик...  
а можно как нибудь обратиться к сформированному массиву  
т.е. смысл такой -  формируется массив диапазонов из соответствующих, каким то критериям диапазонам, а затем им одним "чохом" присваивается какое нибудь свойство, если диапазонов немного то это просто сделать так range("A1,....,A10")  
при этом длинна строки не должна превысить 255 символов, если больше то через union.  
Подозреваю что ни как, но мало ли :)  
вау *42356*
Спасибо
 
Пример группового пожелтения чисел-констант:  
 
Sub ЖелтыеЧисла()  
 Dim Rng As Range  
 Set Rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, xlNumbers)  
 Rng.Interior.Color = 65535  
End Sub  
 
Аналогично в диапазон можно в цикле собрать, например, с помощью Union ячейки по какому-либо критерию, а затем всем им чохом поменяыть формат.
 
{quote}{login=R Dmitry}{date=02.11.2010 09:03}{thema=Re: }{post}теперь въезжаю спасибо Сергей  
т.е. правильней в массив записать адреса диапазонов, а затем уже range(arr(i))  
 
можно закрывать :){/post}{/quote}  
 
 
в массив, а потом join или сразу в строку..так будет быстрее всего  
 
если же у вас относительно немного диапазонов, то можно просто в цикле такой массив обойти
Живи и дай жить..
 
> а можно как нибудь обратиться к сформированному массиву  
Никак. Даже если это не массив, а коллекция.  
Можно использовать такие приемы:  
1. По мере формирования массива диапазонов формировать диапазон, содержащий все    
элементы массива;  
2. Создать подпрограмму, которая будет устанавливать нужное свойство для всех элементов массива;  
3. Создать класс "массив диапазонов" и написать для него нужные свойства и методы.  
Ниже пример использования приемев 1,2.  
 
Sub test1()  
Dim rng As Range, rng1 As Range, rng2 As Range, arr, i&, BigRange As Range  
ReDim arr(2)  
For i = 0 To 2  
   Set rng = Range(Cells(i + 1, 1), Cells(i + 1, 2 * i + 1))  
   Set rng = Union(rng, Cells(i + 1, 2 * i + 3))  
   Set arr(i) = rng  
   If BigRange Is Nothing Then Set BigRange = rng Else Set BigRange = Union(BigRange, rng)  
Next i  
BigRange.Interior.Color = vbYellow  
ApplyToArr arr, "value", 20  
End Sub  
 
Sub ApplyToArr(arr, Command As String, Value)  
Dim x  
For Each x In arr  
   CallByName x, Command, VbLet, Value  
Next  
End Sub
 
Всем спасибо, закрывать все таки рановато  
буду пока переваривать :)))
Спасибо
 
потестил немного  
Sub test2()  
Dim rng As Range, rng1 As Range, i&, BigRange As Range  
For j = 0 To 9  
x = (j * 1000) + 1  
For i = 0 To 1000 Step 2  
Set rng = Range("A" & i + x)  
If BigRange Is Nothing Then Set BigRange = rng Else Set BigRange = Union(BigRange, rng)  
Next i  
BigRange.Interior.Color = vbYellow  
BigRange = 2  
Set BigRange = Nothing  
Next j  
End Sub  
Sub test22()  
For i = 0 To 10000 Step 2  
Range("A" & i + 1).Interior.Color = vbYellow  
Range("A" & i + 1) = 2  
Next i  
End Sub  
 
в первом случае с union медленно красит, но быстро вставляет значения ускорил за счет уменьшения цикла с union  
во втором быстро красит но медленно вставляет значения  
 
какие еще есть варианты  и мнения быстро раскрасить и присвоить значения?
Спасибо
 
Вот, например:  
 
Sub test33()  
Dim rr As Range  
Set rr = Range("A1")  
rr.Value = 2: rr.Interior.Color = vbYellow  
Range(rr, rr.Offset(1)).AutoFill Range("A1:A10000"), xlFillCopy  
End Sub  
 
Правда, не уверен, что будет работать в 2003.
 
{quote}{login=nilem}{date=04.11.2010 10:42}{thema=}{post}Вот, например:  
 
Sub test33()  
Dim rr As Range  
Set rr = Range("A1")  
rr.Value = 2: rr.Interior.Color = vbYellow  
Range(rr, rr.Offset(1)).AutoFill Range("A1:A10000"), xlFillCopy  
End Sub  
 
Правда, не уверен, что будет работать в 2003.{/post}{/quote}  
nilem спасибо, но это немного не то, Вы конечно сделали макрос под этот вариант вопроса, мне больше надо просто раскрасить и заполнить диапазон получаемый в результате проверки каких то условий и не обязательно в один столбец, т.е. мне нужна теория  
тем не менее все равно спасибо :)
Спасибо
 
в обоих примерах от 4.11 20:01  
 
и красит и вставляет в одном и том же цикле - какая может быть разница по скорости?  
 
 
по теории:  
 
не надо в цикле делать лишнии операции..  
 
присвоив один раз set Set BigRange = range("a1")  (или range("a"&(j * 1000) + 1)  
 
вы из бавляетесь  от  
 
проверки If BigRange Is Nothing  
 
и Set BigRange = Nothing становится ненужным( его и заменяет выше приведенное выражение)  
 
 
ну и я советовал уже, но вы не прислушались..  
 
можно накапливать не с помощью юнион, а в строке:  
 
s=s & ","& range(..).address(0,0) ( или накапливать в массиве, потом объединять в строку с помощью join)  
 
а в конце with range(s)  
..  
end with
Живи и дай жить..
 
{quote}{login=слэн}{date=05.11.2010 09:48}{thema=}{post}в обоих примерах от 4.11 20:01  
 
и красит и вставляет в одном и том же цикле - какая может быть разница по скорости?  
 
 
по теории:  
 
не надо в цикле делать лишнии операции..  
 
присвоив один раз set Set BigRange = range("a1")  (или range("a"&(j * 1000) + 1)  
 
вы из бавляетесь  от  
 
проверки If BigRange Is Nothing  
 
и Set BigRange = Nothing становится ненужным( его и заменяет выше приведенное выражение)  
 
 
ну и я советовал уже, но вы не прислушались..  
 
можно накапливать не с помощью юнион, а в строке:  
 
s=s & ","& range(..).address(0,0) ( или накапливать в массиве, потом объединять в строку с помощью join)  
 
а в конце with range(s)  
..  
end with{/post}{/quote}  
 
s=s & ","& range(..).address(0,0)  
 
Слэн я так делал (ограничение 255 символов по накоплению в строке затем вылетает в ошибку),  
без дополнительного цикла при больших количествах диапазонов очень медленно получается, поэтому и использовал второй цикл  
я для себя уже сделал вывод что красить надо прямо в цикле, а значения присваивать одним чохом если они одинаковые, если разные то через массив значений  
как то так.. :)
Спасибо
 
R Dmitry, зайдите по ссылочкам. там лежат надстройки от ZVI, которые "махом" обрабатывают ячейки, которые формируются набором текстов в массив:) Так, как лень смотреть код, даю ссылки. <BR>http://www.planetaexcel.ru/forum.php?thread_id=3350 - версия 1 (код рабочий, но не работало меню) <BR>http://www.planetaexcel.ru/forum.php?thread_id=3369 - версия 2 (полностью рабочая) <BR>http://www.planetaexcel.ru/forum.php?thread_id=3852 - версия 3 (быстрая) <BR>или эта http://www.planetaexcel.ru/forum.php?thread_id=3620
 
{quote}{login=Igor67}{date=05.11.2010 02:55}{thema=}{post}R Dmitry, зайдите по ссылочкам. там лежат надстройки от ZVI, которые "махом" обрабатывают ячейки, которые формируются набором текстов в массив:) Так, как лень смотреть код, даю ссылки. <BR>http://www.planetaexcel.ru/forum.php?thread_id=3350 - версия 1 (код рабочий, но не работало меню) <BR>http://www.planetaexcel.ru/forum.php?thread_id=3369 - версия 2 (полностью рабочая) <BR>http://www.planetaexcel.ru/forum.php?thread_id=3852 - версия 3 (быстрая) <BR>или эта http://www.planetaexcel.ru/forum.php?thread_id=3620{/post}{/quote}  
Спасибо Игорь! очень познавательно.
Спасибо
Страницы: 1
Наверх