Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Действия с диапазонами ячеек / 22 сообщений из 22, страница 1 из 1
09.07.2007, 22:26:58
    #34648890
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Раз у нас на форуме так мало новых тем (лето) - буду подливать вопросы которые у меня периодически всплывают. Всё же веселей будет!

Основные действия, которые я использую с Диапазонами наверное 2:
1) Union - объединение диапазонов
2) Intersect - найти пересечение диапазонов
3) ... может что-то забыл но это не так важно

Может кто-то поделится ещё какими нибуть интересными возможностями на его взгляд.

Мне например интересно можно ли исключить Range их Range.
Например Есть Range("A1:D10") . Я хочу исключить из него Range("C3:B5").
и Получить Range("A1:D2, A3:A5, D3:D5, A6:D10") или
Range("A1:A10,D1:D10,B1:C2,B6:C10")
Что-нибуть в этом роде!
...
Рейтинг: 0 / 0
09.07.2007, 22:40:54
    #34648907
хрыч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
обычно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub test()

    Dim curCell As Range
    Dim rngResult As Range
    
    If Not tr3 Is Nothing Then
        For Each curCell In Intersect(Range("A1:D10"), Range("C3:B5"))
            If (Intersect(curCell, tr3) Is Nothing) Then
                If Not (rngResult Is Nothing) Then
                Set rngResult = Union(rngResult, curCell)
                Else
                Set rngResult = curCell
                End If
            End If
        Next
    Else
        Set rngResult = tr1
    End If
    rngResult.Select
    
End Sub
...
Рейтинг: 0 / 0
09.07.2007, 22:42:41
    #34648910
хрыч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
пардон - там сопли не вытерты оказались

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub test()

    Dim curCell As Range
    Dim rngResult As Range
    
        For Each curCell In Intersect(Range("A1:D10"), Range("C3:B5"))
            If (Intersect(curCell, tr3) Is Nothing) Then
                If Not (rngResult Is Nothing) Then
                Set rngResult = Union(rngResult, curCell)
                Else
                Set rngResult = curCell
                End If
            End If
        Next
    rngResult.Select
    
End Sub
...
Рейтинг: 0 / 0
09.07.2007, 22:48:03
    #34648918
хрыч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
сорри опять

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub test()

    Dim curCell As Range
    Dim rngResult As Range
    
    
        For Each curCell In Range("A1:D10") 
            If (Intersect(curCell, Range("C3:B5")) Is Nothing) Then
                If Not (rngResult Is Nothing) Then
                Set rngResult = Union(rngResult, curCell)
                Else
                Set rngResult = curCell
                End If
            End If
        Next
    
    rngResult.Select
    Debug.Print rngResult.Address
    
End Sub
...
Рейтинг: 0 / 0
09.07.2007, 23:31:28
    #34648964
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Перебором по ячейкам я делал, но думал может можно как то проще.
...
Рейтинг: 0 / 0
10.07.2007, 01:13:08
    #34649022
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
DeggasadПеребором по ячейкам я делал, но думал может можно как то проще.С одной стороны, проще нельзя. С другой стороны, цикл хрыча можно сократить до:
Код: plaintext
1.
2.
3.
4.
for each c in BigRange.Cells
   if intersect(ExcludedCells, c) is nothing then 
       ' делаешь с ячейкой что надо
   end if
next
Тот же самый перебор всех ячеек, только записан короче
...
Рейтинг: 0 / 0
10.07.2007, 08:15:57
    #34649138
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
White Owl DeggasadПеребором по ячейкам я делал, но думал может можно как то проще.С одной стороны, проще нельзя. С другой стороны, цикл хрыча можно сократить до:
Код: plaintext
1.
2.
3.
4.
for each c in BigRange.Cells
   if intersect(ExcludedCells, c) is nothing then 
       ' делаешь с ячейкой что надо
   end if
next
Тот же самый перебор всех ячеек, только записан короче

Так как нужно получить диапазон, то тут нет никакого сокращения
...
Рейтинг: 0 / 0
10.07.2007, 08:24:41
    #34649146
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Пока получается такой инструмент

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Function ExcludRngFromRng(BigRange As Range, ExcludedCells As Range) As Range
Dim iCel As Range
Dim rngResult As Range
    
    For Each iCel In BigRange.Cells
       
       If Intersect(ExcludedCells, iCel) Is Nothing Then
            
            If Not (rngResult Is Nothing) Then
              Set rngResult = Union(rngResult, iCel)
             Else
              Set rngResult = iCel
            End If
            
       End If
       
    Next

Set ExcludRngFromRng = rngResult

End Function
...
Рейтинг: 0 / 0
10.07.2007, 09:03:34
    #34649207
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Deggasad
3) ... может что-то забыл но это не так важно

Посмотри
Код: plaintext
Range.Resize
Очень часто полезно использовать
Deggasad
Мне например интересно можно ли исключить Range из Range.
Например Есть Range("A1:D10") . Я хочу исключить из него Range("C3:B5").
и Получить Range("A1:D2, A3:A5, D3:D5, A6:D10") или
Range("A1:A10,D1:D10,B1:C2,B6:C10")
Что-нибуть в этом роде!
Код: plaintext
1.
2.
3.
4.
5.
Sub r()
Dim rngOld As Range, rng As Range
Set rngOld = Range("A1:D10")
Set rng = Union(rngOld.Resize(,  1 ), rngOld.Columns( 4 ).Resize(,  1 ), rngOld.Columns( 2 ).Resize( 2 ,  2 ), rngOld.Cells( 6 ,  2 ).Resize( 5 ,  2 ))
MsgBox rng.Address(False, False)
End Sub
...
Рейтинг: 0 / 0
10.07.2007, 09:16:57
    #34649228
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
vkodor
Посмотри
Код: plaintext
Range.Resize
Очень часто полезно использовать


Согласен
Resize => в список полезностей!
Ну раз проперти считать, то и
Offset => туда же
...
Рейтинг: 0 / 0
10.07.2007, 12:16:15
    #34649841
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Варианты Offset/Resize:

Код: plaintext
1.
2.
3.
Sub test()
    MsgBox Range("D10")( 5 , - 1 ).Address
    MsgBox Range("OFFSET(A1,2,1,10,3)").Address
End Sub

Вообще, мало кто знает, что свойство Range позволяет использовать в качестве аргумента формулы возвращающие объект Range, сравни:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub test()
    MsgBox Range("OFFSET(A1,2,1,10,3)").Address
    MsgBox [OFFSET(A1, 2 , 1 , 10 , 3 )].Address
    
    MsgBox Range("INDEX(A:A,MATCH(9e307,B:B))").Address
    MsgBox [INDEX(A:A,MATCH(9e307,B:B))].Address
    
    MsgBox Range("INDIRECT(""D""&MATCH(9e307,B:B))").Address
    MsgBox [INDIRECT("D"&MATCH(9e307,B:B))].Address
    
    MsgBox Range("IF(B27>0,K5,C2)").Address
    MsgBox [IF(B27> 0 ,K5,C2)].Address
End Sub

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
10.07.2007, 13:17:05
    #34650104
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
о, завеяло новыми знаниями.
...
Рейтинг: 0 / 0
10.07.2007, 13:47:16
    #34650250
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range
...
Рейтинг: 0 / 0
10.07.2007, 14:01:29
    #34650302
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
vbapro Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range

Да вот это прикольно!


Код: plaintext
Sub Test2()\n  Debug.Print RMinusR(Range("A1:D10"), Range("C3:B5")).Address\nEnd Sub\n\nFunction RMinusR(WP As Range, WM As Range) As Range\n  WP.FormatConditions.Delete\n  Call WP.FormatConditions.Add(xlCellValue, xlEqual,  1 )\n  WM.FormatConditions.Delete\n  Set RMinusR = WP.SpecialCells(xlCellTypeAllFormatConditions)\n  WP.FormatConditions.Delete\nEnd Function \'RMinusR
...
Рейтинг: 0 / 0
10.07.2007, 14:07:41
    #34650328
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
vbapro Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range

Если не ошибаюсь, это решение зародилось вот здесь: http://tinyurl.com/bzohw (тут много интересных идей, а главное описаний проблем и ограничений)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
10.07.2007, 14:16:00
    #34650372
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
KL (XL) vbapro Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range

Если не ошибаюсь, это решение зародилось вот здесь: http://tinyurl.com/bzohw (тут много интересных идей, а главное описаний проблем и ограничений)

KL
[MVP - Microsoft Excel]да, интересно, спасибо! :)
...
Рейтинг: 0 / 0
10.07.2007, 14:16:08
    #34650374
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
KL (XL) vbapro Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range

Если не ошибаюсь, это решение зародилось вот здесь: http://tinyurl.com/bzohw (тут много интересных идей, а главное описаний проблем и ограничений)

KL
[MVP - Microsoft Excel]да, интересно, спасибо! :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.06.2009, 19:53:48
    #36066756
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
Прошло 2 года...
Лето все так же влияет на интенсивность работы форума...
...
Рейтинг: 0 / 0
01.07.2009, 13:52:26
    #36067914
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
DeggasadПрошло 2 года...
раз уж апнули старый топик - задам вопрос 2All тут:
Хотелось бы окончательно прояснить для себя логику работы Union с перекрывающимися диапазонами...
вот, на скорую руку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
?Union(Range("A1:B2"), Range("B2:C3")).Address( 0 , 0 )
A1:B2,B2:C3
?Union(Range("A1:B3"), Range("B1:B5")).Address( 0 , 0 )
A1:B3,B1:B5
?Union(Range("A1:B3"), Range("A1:D1")).Address( 0 , 0 )
A1:B3,A1:D1
?Union(Range("A1:B3"), Range("B1:C3")).Address( 0 , 0 )
A1:C3
?Union(Range("A1:B3"), Range("A2:B5")).Address( 0 , 0 )
A1:B5
?Union(Range("A1:D6"), Range("B2:C8")).Address( 0 , 0 )
A1:D6,B2:C8
?Union(Range("A1:D6"), Range("A1:A6")).Address( 0 , 0 )
A1:D6
?Union(Range("A1:D6"), Range("A1:A7")).Address( 0 , 0 )
A1:D6,A1:A7
?Union(Range("A1:D6"), Range("B2:C3")).Address( 0 , 0 )
A1:D6
?Union(Range("A1:D6"), Range("A1:C3")).Address( 0 , 0 )
A1:D6
пока что вырисовывается так:
- если диапазоны полностью накладываются друг на друга - их сливают
- если они полностью совпадают по одной стороне (примеры 4 и 5) - их сливают
- в остальных случаях (?? что я забыл ??) - формируется "многослойный" диапазон, содержащий некоторые ячейки дважды (в 1ом примере - "B2")
честно, говоря - это напрягает
хотелось бы, чтобы было "безобразно, но единообразно".
с благодарностью приму ссылки с обсуждением этого безобразия или цитаты на тему из хелпа - т.к. сам найти не смог.
...
Рейтинг: 0 / 0
01.07.2009, 15:20:39
    #36068218
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
до кучи:
Код: plaintext
1.
2.
3.
4.
set r=[A1:D6]: ?r.cells.count: set r=Union(r,[F1:Y2]): ?r.cells.count: set r=Union(r,[H1:Z6]): ?r.cells.count: set r=Union(r,[C1:K6]): ?r.cells.count 
  24  
  64  
  178  
  156  
разве не замечательно?
...
Рейтинг: 0 / 0
02.07.2009, 10:53:48
    #36069494
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
По моему я когда-то воевал с этим, но так и не победил.
Вот один из топиков на похожую тему - тынц
...
Рейтинг: 0 / 0
02.07.2009, 15:16:54
    #36070279
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действия с диапазонами ячеек
DeggasadПо моему я когда-то воевал с этим, но так и не победил.
Вот один из топиков на похожую тему - тынц Благодарю за ссылку - сам её пропустил при беглом просмотре.
Из полезного оттуда вынес .Range("C24:AL25:D26:AK27") - я не знал про такой вариант синтаксиса.
Хочу уточнить, что "воевать" пока потребности не испытывал - вопрос был задан, как говорил почтальон Печкин - "с целью повышения общей образованности".
Таким образом нарисовался "альтернативный юнион" - выдающий Range всегда с 1ной Area и действующий аналогично АПИшной
Код: plaintext
Declare Function UnionRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long
которая возвращает " прямоугольник объединения - самый маленький возможный прямоугольник, который содержит два других прямоугольника. "
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function OptionUnion(ByVal rng1 As Range, ByVal rng2 As Range) As Range
Dim rgU As Range, strAdr As String
    Set rgU = Application.Union(rng1, rng2)
    If rgU.Areas.Count >  1  Then
        strAdr = Replace(rgU.Address( 0 ,  0 ), ",", ":")
        Set OptionUnion = Range(strAdr)
    Else
        Set OptionUnion = rgU
    End If
End Function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
set r=[A1:D6]: ?r.cells.count: set r=Union(r,[F1:Y2]): ?r.cells.count: set r=Union(r,[H1:Z6]): ?r.cells.count: set r=Union(r,[C1:K6]): ?r.cells.count 
  24  
  64  
  178  
  156  
set r=[A1:D6]: ?r.cells.count: set r=OptionUnion(r,[F1:Y2]): ?r.cells.count: set r=OptionUnion(r,[H1:Z6]): ?r.cells.count: set r=OptionUnion(r,[C1:K6]): ?r.cells.count 
  24  
  150  
  156  
  156  
Теперь свое собственное пожелание "чтобы было безобразно, но единообразно" могу считать вполне состоявшимся.
Пусть лежит тут - возможно когда-то и пригодится.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Действия с диапазонами ячеек / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]