Всем привет! По сути весь вопрос в заголовке. Worksheet_Change отслеживает событие вставки, но как определить, что была именно вставка строки, а не какое нибудь другое Change? Чет у меня ни каких идей а надо...
Всем привет! По сути весь вопрос в заголовке. Worksheet_Change отслеживает событие вставки, но как определить, что была именно вставка строки, а не какое нибудь другое Change? Чет у меня ни каких идей а надо...Michael_S
RAN, Андрей, так реагирует еще и на просто вставку значения ниже ЮзедРенжа. И не реагирует на вставку строки ниже него (правда, смысла на него реагировать я не вижу). Это я про первый твой код.
Michael_S, Михаил, предлагаю сравнивать кол-во ячеек Тэджета и кол-ва ячеек в одной строке. Тоже может быть совпадение, но довольно маловероятно. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) n_ = Target.Cells.Count c_ = Columns.Count If n_ Mod c_ = 0 Then MsgBox "Вставка строк(и)" End Sub
[/vba]
RAN, Андрей, так реагирует еще и на просто вставку значения ниже ЮзедРенжа. И не реагирует на вставку строки ниже него (правда, смысла на него реагировать я не вижу). Это я про первый твой код.
Michael_S, Михаил, предлагаю сравнивать кол-во ячеек Тэджета и кол-ва ячеек в одной строке. Тоже может быть совпадение, но довольно маловероятно. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) n_ = Target.Cells.Count c_ = Columns.Count If n_ Mod c_ = 0 Then MsgBox "Вставка строк(и)" End Sub
Александр - попробуй просто очистить строку Нужно все-таки привязываться и к к-ву строк. Попробовал - получилось как-то так: [vba]
Код
Option Explicit Dim n&
Private Sub Worksheet_Activate() Application.EnableEvents = False n = Me.Cells(1, 1).SpecialCells(xlLastCell).Row Application.EnableEvents = True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.CountLarge Mod Me.Columns.Count = 0 And Me.Cells(1, 1).SpecialCells(xlLastCell).Row > n Then MsgBox "Мяу! + d:)" Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.EnableEvents = False n = Me.Cells(1, 1).SpecialCells(xlLastCell).Row Application.EnableEvents = True End Sub
[/vba]
Сначала думал тоже к UsedRange привязатся, но если он начинается, к примеру, с 4-й строки а вставка пустой строки происходит до него - то к-во его строк не изменяется.
Добавил: Если нужно отследить именно вставку пустой строки - поменять процедуру Worksheet_Change на (2-й файл) : [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Application.EnableEvents = False Set r = Target.Find("*", , xlValues) If Not r Is Nothing Then Application.EnableEvents = True: Exit Sub If Target.CountLarge Mod Me.Columns.Count = 0 And Me.Cells(1, 1).SpecialCells(xlLastCell).Row > n Then MsgBox "Мяу! + d:)" Application.EnableEvents = True End Sub
[/vba]
Александр - попробуй просто очистить строку Нужно все-таки привязываться и к к-ву строк. Попробовал - получилось как-то так: [vba]
Код
Option Explicit Dim n&
Private Sub Worksheet_Activate() Application.EnableEvents = False n = Me.Cells(1, 1).SpecialCells(xlLastCell).Row Application.EnableEvents = True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.CountLarge Mod Me.Columns.Count = 0 And Me.Cells(1, 1).SpecialCells(xlLastCell).Row > n Then MsgBox "Мяу! + d:)" Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.EnableEvents = False n = Me.Cells(1, 1).SpecialCells(xlLastCell).Row Application.EnableEvents = True End Sub
[/vba]
Сначала думал тоже к UsedRange привязатся, но если он начинается, к примеру, с 4-й строки а вставка пустой строки происходит до него - то к-во его строк не изменяется.
Добавил: Если нужно отследить именно вставку пустой строки - поменять процедуру Worksheet_Change на (2-й файл) : [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Application.EnableEvents = False Set r = Target.Find("*", , xlValues) If Not r Is Nothing Then Application.EnableEvents = True: Exit Sub If Target.CountLarge Mod Me.Columns.Count = 0 And Me.Cells(1, 1).SpecialCells(xlLastCell).Row > n Then MsgBox "Мяу! + d:)" Application.EnableEvents = True End Sub
"думал тоже к UsedRange привязатся" - еще надо координаты левого верхнеого угла добавить. Вот вроде как работает:
Цитата
Private oldR As Integer Private oldC As Integer Private nExp As Integer
Private Sub Worksheet_Activate() Dim ur As Range Set ur = Me.UsedRange oldR = ur.Row + ur.rows.Count oldC = ur.Column + ur.Columns.Count nExp = 0 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim maxR As Integer, maxC As Integer, r As Integer, c As Integer, ur As Range
Set ur = Worksheets("Лист1").UsedRange maxR = ur.Row + ur.rows.Count maxC = ur.Column + ur.Columns.Count r = Target.Row c = Target.Column
nExp = nExp + 1 If maxR > oldR Then Debug.Print nExp, "+ R " & (maxR - oldR) & " from " & r If maxR < oldR Then Debug.Print nExp, "- R " & (oldR - maxR) & " from " & r oldR = maxR If maxC > oldC Then Debug.Print nExp, "+ C " & (maxC - oldC) & " from " & c If maxC < oldC Then Debug.Print nExp, "- C " & (oldC - maxC) & " from " & c oldC = maxC
End Sub
"думал тоже к UsedRange привязатся" - еще надо координаты левого верхнеого угла добавить. Вот вроде как работает:
Цитата
Private oldR As Integer Private oldC As Integer Private nExp As Integer
Private Sub Worksheet_Activate() Dim ur As Range Set ur = Me.UsedRange oldR = ur.Row + ur.rows.Count oldC = ur.Column + ur.Columns.Count nExp = 0 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim maxR As Integer, maxC As Integer, r As Integer, c As Integer, ur As Range
Set ur = Worksheets("Лист1").UsedRange maxR = ur.Row + ur.rows.Count maxC = ur.Column + ur.Columns.Count r = Target.Row c = Target.Column
nExp = nExp + 1 If maxR > oldR Then Debug.Print nExp, "+ R " & (maxR - oldR) & " from " & r If maxR < oldR Then Debug.Print nExp, "- R " & (oldR - maxR) & " from " & r oldR = maxR If maxC > oldC Then Debug.Print nExp, "+ C " & (maxC - oldC) & " from " & c If maxC < oldC Then Debug.Print nExp, "- C " & (oldC - maxC) & " from " & c oldC = maxC