powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Действия с диапазонами ячеек
22 сообщений из 22, страница 1 из 1
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #34648964
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перебором по ячейкам я делал, но думал может можно как то проще.
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #34649228
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor
Посмотри
Код: plaintext
Range.Resize
Очень часто полезно использовать


Согласен
Resize => в список полезностей!
Ну раз проперти считать, то и
Offset => туда же
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #34650104
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, завеяло новыми знаниями.
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #34650250
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #34650328
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro Deggasad...Мне например интересно можно ли исключить Range их Range.... я тоже такой вопрос задавал. может что интересное увидешь в обсуждении: исключать Range из Range

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

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

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

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

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

KL
[MVP - Microsoft Excel]да, интересно, спасибо! :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Действия с диапазонами ячеек
    #36066756
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошло 2 года...
Лето все так же влияет на интенсивность работы форума...
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #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
Действия с диапазонами ячеек
    #36069494
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему я когда-то воевал с этим, но так и не победил.
Вот один из топиков на похожую тему - тынц
...
Рейтинг: 0 / 0
Действия с диапазонами ячеек
    #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
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Действия с диапазонами ячеек
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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