Вот, есть у нас 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)).
допустим Вы с клавишей 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 и Ігор Гончаренкоза усилия по решению обозначенной в вопросе проблемы, однако сам по себе мой вопрос всё же касался только наличия \ отсутствия стандартных экселевских функций, выйти за рамки которых - лично я, в данном случае - категорически не готов.
на том же принципе, что и ранее, (сделали когда-то совместными усилиями с 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
исключить из базового диапазона ячейки содержащиеся в АутДиапазоне
Ігор Гончаренко написал: допустим Вы с клавишей Ctrl отмечаете несвязный диапазон и случайно, промахнулись мышьюв отмеченный диапазон попала "левая" ячейка или группа ячеек. и теперь сколько чего не жми - снять отметку нечем!