Запуск событий со вставкой и удалением строк в VBA Excel

#excel #vba #excel-2010

Вопрос:

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

Сначала мы определяем имя диапазона (RowMarker =$A$1000)

 Private Sub Worksheet_Change(ByVal Target As Range)  Static lngRow As Long  Dim rng1 As Range  Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange  If lngRow = 0 Then  lngRow = rng1.Row  Exit Sub  End If  If rng1.Row = lngRow Then Exit Sub  If rng1.Row lt; lngRow Then  MsgBox lngRow - rng1.Row amp; " rows removed"  Else  MsgBox rng1.Row - lngRow amp; " rows added"  End If  lngRow = rng1.Row End Sub  

Ответ №1:

  1. Пожалуйста, скопируйте следующий код в модуль кода листа, подлежащий обработке (перепишите существующее событие кода).:
 Option Explicit  Private Sub Worksheet_Activate()  Dim rng1 As Range  Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange  ThisWorkbook.lRow = rng1.row End Sub  Private Sub Worksheet_Change(ByVal Target As Range)  Static lngRow As Long  Dim rng1 As Range  Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange  If lngRow = 0 Then lngRow = ThisWorkbook.lRow  If lngRow = 0 Then 'only for the case you copied the code and forgot sheet activating...  lngRow = rng1.row  Exit Sub  End If  If rng1.row = lngRow Then Exit Sub  If rng1.row lt; lngRow Then  MsgBox lngRow - rng1.row amp; " rows removed"  Else  MsgBox rng1.row - lngRow amp; " rows added"  End If  lngRow = rng1.row End Sub  

1.1 Скопируйте этот код в ThisWorkbook модуль кода:

 Public lRow As Long  Private Sub Workbook_Open()  Dim rng1 As Range  Set rng1 = ThisWorkbook.Names("RowMarker").RefersToRange  lRow = rng1.row End Sub  
  1. Деактивируйте активный лист (перейдите на другой) и активируйте его (вернитесь). Только в первый раз! Когда вы открываете книгу и переходите на этот конкретный лист, событие запускается автоматически.
  2. Попробуйте это решение и отправьте несколько отзывов

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

Комментарии:

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

2. @bagofdoom Боюсь, вы были не так внимательны, когда читали второй выпуск… Только в первый раз! означает действительно один раз , после копирования кода. Тогда вам не придется ни о чем беспокоиться. Он будет работать полностью автоматически. 🙂

3. Да, я понял, что вам нужно только один раз переключить листы, и после этого код будет работать автоматически. Но моя проблема в том, что, если я закрою свою книгу Excel, а затем открою ее позже, мне все равно придется переключаться между листами, чтобы она снова заработала.

4. @bagofdoom Прежде чем изучать программирование, вы должны научиться лучше читать… 🙂 Что означает, когда вы открываете книгу и переходите на этот конкретный лист, событие автоматически запускается ? В ответе важен не только код… Это также сработает, если обсуждаемый лист является активным. Событие все равно будет запущено. Вы должны вручную активировать лист один раз в своей жизни . Тогда во что вам обойдется тестирование этого сценария?

5. Вы говорите, что вам нужно активировать его только один раз, переключая листы, а затем, закрываете ли вы excel и открываете его на активном листе, он должен работать, но он не работает для меня, каждый раз, когда я закрываю и открываю excel, мне приходится переключаться между листами, чтобы заставить его работать…

Ответ №2:

Добавить событие рабочей книги

 Private Sub Workbook_Open()  Sheet1.lrow = Sheet1.Range("RowMarker").Row End Sub  

Событие рабочего листа

 Public lrow As Long  Private Sub Worksheet_Change(ByVal Target As Range)    Dim n as Long  n = Me.Range("RowMarker").Row - lrow  lrow = Me.Range("RowMarker").Row  If n gt; 0 Then  MsgBox n amp; " rows inserted"  ElseIf n lt; 0 Then  MsgBox n amp; " rows removed"  End If  End Sub