Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 16:35   #1
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию Как исключить ячейку Х из диапазона А

как добавить ячейку (диапазон) Х в диапазон А понятно
set A = Application.Union(A, X)

А есть простой способ как ИСКЛЮЧИТЬ ячейку Х из диапазона А.

Уважаемые программисты, нужна функция типа
Function DeLCeLL(BaseRg as range, Cel2Del as range) as range

т.е. на входе диапазон и какая-то ячейка из него, на выходе тот же диапазон, но уже без указанной ячейки (ни сама ячейка на листе, ни данные в ней не должны пострадать). Может есть стандартные средства VBA для этого?

Спасибо!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 06.02.2014, 19:33   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Вроде кто-то из гуру делал это, и даже не для одной ячейки. Стандартных средств точно нет.
Если все же делать: можно перебрать области диапазона и проверять intersect с ячейкой. Если пересечения нет, область добавляется к выходному диапазону. Если пересечение есть, ячейка делит эту область на 4 диапазона (в общем случае): сверху, снизу, строка слева и строка справа. Или слева, справа, столбец сверху и столбец снизу - можно выбрать этот вариант, если область имеет .rows.count > .columns.count.
Координаты диапазонов вычисляются арифметически, и диапазоны добавляются к выходному диапазону.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.02.2014, 20:00   #3
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Код:
Sub RangeSelect()
    DelCell2(Selection, Range("a2:a14,C4")).Select
End Sub

Public Function DelCell2(BaseRg As Range, DelRg As Range) As Range
    Dim newRg As Range:
    For Each Ar In BaseRg
        If Application.Intersect(Ar, DelRg) Is Nothing Then
            If newRg Is Nothing Then
                Set newRg = Ar
            Else
                Set newRg = Union(newRg, Ar)
            End If
        End If
    Next
    Set DelCell2 = newRg
End Function
Ну ни как не хотел VBA такое имя пропускать: DeLCeLL

Последний раз редактировалось maksim_serg; 06.02.2014 в 20:24. Причина: Немного изменил. Удаляет диапозон ячеек из диапозона ячеек
maksim_serg вне форума Ответить с цитированием
Старый 06.02.2014, 21:02   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Если диапазон небольшой, можно, конечно, и по ячейкам. Но попробуйте таким способом исключить что-нибудь из целого столбца в 2007
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.02.2014, 21:04   #5
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Если диапазон небольшой, можно, конечно, и по ячейкам. Но попробуйте таким способом исключить что-нибудь из целого столбца в 2007
как сказали в одном фильме: "Две минуты, Турецкий!"
maksim_serg вне форума Ответить с цитированием
Старый 07.02.2014, 01:06   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub RangeSelect()
  Dim tm As Single
  tm = Timer
  DelCell2([c:c], [c3]).Select
  MsgBox Timer - tm
End Sub
maksim_serg, знаете что MsgBox показал? 61 сек.

а теперь представте так, по одной, надо удалить ячейки из всего столбика
= 61/2*1048000/60/60/24 = 369 дней.
чуть больше года работы и готово!

моя процедура делает это за 3-4 минуты это где-то в 200тыс.раз быстрее, чем 369 дней.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.02.2014, 06:12   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если из диапазона "A" требуется получить диапазон с "вырезанной" ячейкой "X", то перебирать поячеечно, это слишком долго. Предлагаю, примерно так:
Код:
Function CutCell(A As Range, X As Range) As Range
    Dim rng As Range
    If X.Row > 1 Then Set rng = Rows("1:" & X.Row - 1)
    If X.Row < Rows.Count Then If rng Is Nothing Then _
        Set rng = Rows(X.Row + 1 & ":" & Rows.Count) Else Set rng = Union(rng, Rows(X.Row + 1 & ":" & Rows.Count))
    If X.Column > 1 Then Set rng = Union(rng, Range([A1], X.Offset(, -1)).EntireColumn)
    If X.Column < Columns.Count Then Set rng = Union(rng, Range(X.Offset(, 1), Cells(X.Row, Columns.Count)).EntireColumn)
    Set CutCell = Intersect(rng, A)
End Function
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 07.02.2014, 12:43   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

спасибо, SAS888!

с пришел к этому же решению чуть корявее записанному здесь а сейчас хотел поинтересоваться не изобрел-ли я велосипед, может среди обилия встроенных функций я недосмотрел готовую.

ячейка, обозначена Я разбивает поле листа на 4 диапазона
Код:
     1-й    |
____________|  4-й
        | Я |
        |___|_______
  2-й   |
        |      3-й
могут отсутсвовать один или два диапазона, когда ячейка находится в первой (последней) строке (колонкке) листа.
эти 4-е диапазона обьединялись в один, пересечение обьединенного диапазона и исходного давало исходный без ячейки Я.

но в ситуации, когда отмечена колонка без 1 ячейки и надо инвертировать отметку и этот алгоритм работал несколько минут (3-4-5) не засекал точно, но долго - это факт.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 07.02.2014 в 12:46.
IgorGO вне форума Ответить с цитированием
Старый 07.02.2014, 13:10   #9
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

о, исправил (на примерно миллион строк):
DelCell2([c:c], [c3]).Select=1,92 сек
DelCell2([c:c], [c:c]).Select=3,32 сек
DelCell2([a:z], [c3]).Select=37,2 сек
DelCell2([1:1], [c1]).Select=0.18 сек
DelCell2([1:100], [c1]).Select=2,3 сек
DelCell2([a1:a1048576], [c1]).Select=1,93
maksim_serg вне форума Ответить с цитированием
Старый 07.02.2014, 15:14   #10
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

это все удалено

Последний раз редактировалось maksim_serg; 07.02.2014 в 15:37.
maksim_serg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как исключить данные запросом? Вадичок Microsoft Office Access 9 16.09.2012 08:49
Подставновка значений в ячейку из диапазона p2rpower Microsoft Office Excel 3 15.08.2012 10:12
Как исключить запись в таблице. vlkr Microsoft Office Access 4 14.07.2012 16:38
Нужен Макрос для ввода данных в перую пустую ячейку диапазона valik65 Microsoft Office Excel 4 16.12.2010 16:01
как исключить слова RegExp kroŧ Общие вопросы Delphi 0 24.10.2010 18:40