#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:
- Пожалуйста, скопируйте следующий код в модуль кода листа, подлежащий обработке (перепишите существующее событие кода).:
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
- Деактивируйте активный лист (перейдите на другой) и активируйте его (вернитесь). Только в первый раз! Когда вы открываете книгу и переходите на этот конкретный лист, событие запускается автоматически.
- Попробуйте это решение и отправьте несколько отзывов
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