Страницы: 1
RSS
как в VBA отследить вставку/удаление строки (столбца)?
 
Всем доброго здоровья!
Весь вопрос уместился в заголовке, пример, как мне кажется не нужен...
 
Worksheet_Change сработает.
 
Срабатывает, я проверял.
Но как узнать, что строка была вставлена или удалена?
 
Михаил, я в своем время лишь одно средство придумал - сохранять каждый раз скрытую копию листа и сверять данные. Но очень неоптимально и если такое требуется я всегда рекомендую создать отдельную команду удаления строк и столбцов именно программой. А ручное удаление запретить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Миш, контролировать ведь нужно в пределах некого диапазона, а не всего листа? Тогда можно попробовать такой неоптимальный вариант: исходя из данных в диапазоне запомнить что-нибудь - сумму в ячейках даиапазона, количество пустых/непустых... А потом сверить с тем, что получилось после Change.
 
Михаил С., добрый вечер.
Такой вариант устроит?
 
Цитата
The_Prist написал:
я в своем время лишь одно средство придумал - сохранять каждый раз скрытую копию листа и сверять данные.
Я пошёл другим путём. Сделал отслеживание количества заполненных столбцов и строк, которое сравнивалось при любом "пуке". Если количество столбцов или строк изменилось, то делаем дальше что-нибудь. Мне показалось это самым действенным способом.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Jungl написал:
Такой  вариант устроит?
Интересный вариант.
Но сразу возникает вопрос - а если строк не одна, а несколько?
Но это решаемо, имхо.
Спасибо, что-то такое мне и думалось, но про Statiс я совершенно забыл (т.к. ни разу еще не пользовался)
Юрий М, The_Prist, спасибо за предложенные варианты.
 
Цитата
Caho написал:
Если количество столбцов или строк изменилось
Где изменилось?
 
Caho, сразу ваш ответ не видел - тоже спасибо.
 
Ещё один сумасшедший вариант: в отдалённую ячейку, например, AAA1000000 пишем что-нибудь. Номера последних строк и столбца нам известны (LastRow и LastColumn). Запоминаем. Теперь, если вставим столбец, номер последнего столбца увеличится. Если удалим столбец - уменьшится. Со строками аналогично.  
 
думаю тут вариант близкий к варианту от Юрий М, но может оказаться полезным.
По вопросам из тем форума, личку не читаю.
 
Доброго дня всем!
Тут хорошую тему раскрыли про то, как узнать, что строка была вставлена или удалена...
А как можно отловить удаление или вставку столбца? Например, чтобы при попытке удалить/вставить столбец, выходило MsgBox о подтверждении сего действия (да/нет)? Я сделал через форму Msg, но действие отлавливает непосредственное выделение столбца:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With Target
        If .Address = .EntireColumn.Address Then
            frmColumnChange.Show
        End If
    End With
End Sub
Однако его можно выделить и для переноса/раскраски например... Не шибко удобно получается... Никто не сталкивался, что можно сделать?
Изменено: Владимир Самара - 03.06.2019 18:48:01
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
 
Схема действий ниже (в модуль книги).
Код
Option Explicit

Public WithEvents q1 As CommandBarButton  ' удалить столбец
Public WithEvents q2 As CommandBarButton  ' вставить столбец

Private Sub q1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   If MsgBox("Вы хотите удалить столбец", vbYesNo + vbQuestion) <> vbYes Then
     CancelDefault = True
   End If
End Sub

Private Sub q2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   If MsgBox("Вы хотите вставить столбец", vbYesNo + vbQuestion) <> vbYes Then
     CancelDefault = True
   End If
End Sub

Private Sub Workbook_Open()
  Init
End Sub

Private Sub Init()
   With Application.CommandBars("Column")
   Set q1 = .FindControl(ID:=294, recursive:=True)
   Set q2 = .FindControl(ID:=3183, recursive:=True)
   End With
End Sub
Владимир
 
_Igor_61, благодарю! Интересный вариант... Правда сообщение выходит уже после удаления столбца, но можно вывести сообщение на подтверждение и в случае отказа - прописать код на отмену...

sokol92, также благодарен! Вариант чудный конечно, а можно, чтобы перехват происходил только на одном конкретном листе, а не во всей книге? Если сложно, то я могу воспользоваться в принципе и выше описанным вариантом...
 
Поскольку мы перехватываем обработку пункта меню, то макрос будет вызываться при удалении/вставке столбцов и из других книг. Можно проанализировать имя текущей книги и имя текущего листа перед тем, как задать вопрос.
Владимир
 
sokol92, понял, попробую... Мерси :)
 
Вариант, предложенный Игорем в #14, анализировался Владимиром (ZVI) здесь (для вставки/удаления строк).
Изменено: sokol92 - 03.06.2019 20:42:27
Владимир
 
sokol92, благодарю, есть интересные предложения...
 
Добрый вечер, пробовал применить предложение Sokol92 в #17 посте...
Код
Private Sub q1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  With ThisWorkbook.Sheets("Лист1")
   If MsgBox("Вы хотите удалить столбец", vbYesNo + vbQuestion) <> vbYes Then
     CancelDefault = True
   End If
  End With
End Sub

Наверное не так подобрал условие... With ThisWorkbook.Sheets("Лист1")
А как можно ещё попробовать?
 
Следующая модификация макроса из 15 будет спрашивать подтверждение удаления столбца на листе Sheet2  (в приложенном файле это "Лист2"). На других листах этой книги и в других книгах столбцы будут удаляться "молча".
Код
Private Sub q1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   If ActiveWorkbook.Name = ThisWorkbook.Name And ActiveSheet.Name = Sheet2.Name Then
     If MsgBox("Вы хотите удалить столбец", vbYesNo + vbQuestion) <> vbYes Then
       CancelDefault = True
     End If
   End If
End Sub
Изменено: sokol92 - 15.06.2019 15:56:04 (Вложение изменено)
Владимир
 
sokol92, понятно... благодарю!
 
Странно, но почему то, когда изменил часть кода и для вставки столбца... он отказывается работать... При удалении выводится предупреждение, а при вставке нет:
Код
Private Sub q1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   If ActiveWorkbook.Name = ThisWorkbook.Name And ActiveSheet.Name = Sheet2.Name Then
     If MsgBox("Вы хотите удалить столбец", vbYesNo + vbQuestion) <> vbYes Then
       CancelDefault = True
     End If
   End If
End Sub

Private Sub q2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
 If ActiveWorkbook.Name = ThisWorkbook.Name And ActiveSheet.Name = Sheet2.Name Then
   If MsgBox("Вы хотите вставить столбец", vbYesNo + vbQuestion) <> vbYes Then
     CancelDefault = True
   End If
 End If
End Sub
 
Владимир Самара,
как минимум из предыдущего сообщения необходимо удалить слово "ПОНЯТНО"
по сотоянию темы на  24 сообщения в ней пока понятно, что Вам ничего не понятно
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Насчет вставки столбца - моя недоработка (пункт меню столбца c ID=3183 образуется динамически). Исправил вложение в #22.
Владимир
 
sokol92, примного благодарен за помощь!  
 
sokol92, доброго здравия! :)

После практики выполнения макроса (#22) всплыл такой момент...
После открытия книги, когда первый раз пробуешь вставить столбец - он вставляется без отображения сообщения (MsgBox).
Со второго раза, сообщение выходит...

Касательно удаления столбца - тут всё хорошо. Сообщение выводится с первой попытки (после открытия книги).

Вопрос... Можно поправить макрос для вставки столбца (чтобы сообщение отображалось сразу) или это какая-то внутренняя особенность ?

И ещё один момент касательно макроса для вставки столбца...
Когда вставляешь строку, MsgBox также вызывается (хотя для вставки строки вызов MsgBox не нужен)... При удалении строки такого не происходит.
Если не напряжно помочь, - мерси боку!!!
Если проблемно, попробую при открытии книги вставить столбец где-нибудь подальше за пределами расчётных данных...
Потом уже должно обрабатываться, как надо...
 
Исправил вложение в #22. Пробуйте!
Владимир
 
sokol92, примного благодарен, что отозвались...

Сейчас строку вставляет без вывода сообщения - что нужно!
Но при открытии также даёт вставить столбец, как и прежде. Со второго раза - уже выводит сообщение...

Применил макрос на работе... Там работает с первой попытки вставить столбец... Видно дома офис по старше...
Вопрос можно закрыть. Примного благодарен за помощь!
Изменено: Владимир Самара - 17.06.2019 21:41:27
Страницы: 1
Наверх