Страницы: 1
RSS
VBA - убрать ячейки из zRange (As Range)
 
Добрый вечер!

Вот, есть у нас Union(), да? Он объединяет несколько объектов типа Range
(строго говоря, Union увеличивает количество ячеек в диапазоне, путём объединения двух изначально меньших диапазонов).

А есть ли в VBA функция уменьшения диапазонов (путём исключения меньших из большего) - ???
Было бы круто, если так же как в Union можно было бы указать условно-неограниченное число элементов.
Кроме манипуляций с Intersect, само собой.

Чтобы получилось что-то вроде:
Код
Set zRange = Colimns(1).EntireColumn
Set zRange = "UnUnion"(zRange, Cells(1, 1))
- т.е., чтобы эксель сам понял, что zRange у нас теперь = Range(Cells(2, 1), Cells(1048576, 1)).

Или я размечтался?
Изменено: RazorBaze - 09.08.2018 16:38:53
 
в VBA нет,, но самописное чудо есть
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
Dim rng As Range
Set rng = Range("A1:C3,D4:E8")
rng.Areas.Item(2).Delete

получите rng=A1:C3
Оно?
 
Ігор Гончаренко, написать-то я тоже написал - только не чудо получилось, а геморрой какой-то)))
Спасибо за быстрый ответ!

yozhik, боюсь, что нет: я всё-таки имел в виду что-то вроде:
Код
Set zRange = Colimns(1).EntireColumn
Set zRange = "UnUnion"(zRange, Cells(1, 1))
- чтобы эксель сам понял, что zRange у нас теперь = Range(Cells(2, 1), Cells(1048576, 1)).

Добавлю это в шапку.
Изменено: RazorBaze - 09.08.2018 16:37:25
 
допустим Вы с клавишей Ctrl отмечаете несвязный диапазон и случайно, промахнулись мышью
в отмеченный диапазон попала "левая" ячейка или группа ячеек. и теперь сколько чего не жми - снять отметку нечем!
стандартне средства предлапгают отказаться от сделанного выбора и начать выбирать нужные ячейки с нуля...

и тут пригодиться вот такой макрос:
Код
Sub UnSelect()
  Dim Base As Range, out As Range, Adr$, SU As Boolean, DA As Boolean, EE As Boolean, CM As Long
  With Application
    Set Base = Selection: On Error Resume Next
    Set out = Application.InputBox("Укажите ячейки, которые следует из него исключить", "Видите выбранный диапазон?", Type:=8)
    If Err Then Exit Sub
    SU = .ScreenUpdating: .ScreenUpdating = False: CM = .Calculation:  .Calculation = xlCalculationManual
    DA = .DisplayAlerts: .DisplayAlerts = False:   EE = .EnableEvents: .EnableEvents = False
    Worksheets.Add: Range(out.Address) = 1:  Cells(Rows.Count, .Columns.Count) = 1
    Adr = Range(Base.Address).SpecialCells(xlCellTypeBlanks).Address
    ActiveSheet.Delete: If Not Err Then Range(Adr).Select
    .ScreenUpdating = SU: .DisplayAlerts = DA: .EnableEvents = EE:  .Calculation = CM
  End With
End Sub
у меня он лежит в личной книге макросов, кнопка с меткой Х выведена на панель быстрого запуска.
и так:
в число отмеченных ячеекк попало что-то лишнее, вызываете этот макрос, указываете что исключить... и готово!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, это круто))) сродни Application.Undo
хотя моё чудо мне для Worksheet_Change нужно: чтобы запретить редактировать все ячейки
- кроме тех, которые можно, с автоматической отменой действий.

Но Ваш код в работе точно будет полезен. Спасибо!

__________________________________________

2018.08.15
Благодарю sokol92 и Ігор Гончаренко за усилия по решению обозначенной в вопросе проблемы,
однако сам по себе мой вопрос всё же касался только наличия \ отсутствия стандартных экселевских функций,
выйти за рамки которых - лично я, в данном случае - категорически не готов.
Изменено: RazorBaze - 15.08.2018 11:59:52
 
Посмотрите здесь.
Владимир
 
на том же принципе, что и ранее, (сделали когда-то совместными усилиями с SAS888)
Код
Function BaseModOut(BaseAdr As String, OutAdr As String) As String
  Dim SU As Boolean, DA As Boolean, EE As Boolean, CM As Long
  With Application
    SU = .ScreenUpdating: .ScreenUpdating = False: CM = .Calculation:  .Calculation = xlCalculationManual
    DA = .DisplayAlerts: .DisplayAlerts = False:   EE = .EnableEvents: .EnableEvents = False:
    Worksheets.Add: Range(OutAdr) = 1:  Cells(Rows.Count, .Columns.Count) = 1
    If WorksheetFunction.CountBlank(Range(BaseAdr)) > 0 Then BaseModOut = Range(BaseAdr).SpecialCells(xlCellTypeBlanks).Addrers
    ActiveSheet.Delete: .ScreenUpdating = SU: .DisplayAlerts = DA: .EnableEvents = EE:  .Calculation = CM
  End With
End Function
исключить из базового диапазона ячейки содержащиеся в АутДиапазоне
Изменено: Ігор Гончаренко - 09.08.2018 20:04:12
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
допустим Вы с клавишей Ctrl отмечаете несвязный диапазон и случайно, промахнулись мышьюв отмеченный диапазон попала "левая" ячейка или группа ячеек. и теперь сколько чего не жми - снять отметку нечем!
В каком-то из новейших офисов исправили: https://mspoweruser.com/microsoft-is-fixing-one-of-the-most-annoying-issues-in-excel/
Страницы: 1
Наверх