Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как определить, что была вставлена строка? (или несколько) - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как определить, что была вставлена строка? (или несколько) (Макросы/Sub)
Как определить, что была вставлена строка? (или несколько)
Michael_S Дата: Вторник, 12.04.2016, 14:49 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1834
Репутация: 344 ±
Замечаний: 0% ±

Excel2016
Всем привет!
По сути весь вопрос в заголовке.
Worksheet_Change отслеживает событие вставки, но как определить, что была именно вставка строки, а не какое нибудь другое Change?
Чет у меня ни каких идей :( а надо...


ЯД: 41001136675053
WM: R389613894253
 
Ответить
СообщениеВсем привет!
По сути весь вопрос в заголовке.
Worksheet_Change отслеживает событие вставки, но как определить, что была именно вставка строки, а не какое нибудь другое Change?
Чет у меня ни каких идей :( а надо...

Автор - Michael_S
Дата добавления - 12.04.2016 в 14:49
RAN Дата: Вторник, 12.04.2016, 15:08 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4607
Репутация: 925 ±
Замечаний: 0% ±

2010
[vba]
Код
Option Explicit

Dim n&

Private Sub Worksheet_Activate()
    n = Me.UsedRange.Rows.Count
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Me.UsedRange.Rows.Count <> n Then MsgBox "Мяу!"
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    n = Me.UsedRange.Rows.Count
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Option Explicit

Dim n&

Private Sub Worksheet_Activate()
    n = Me.UsedRange.Rows.Count
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Me.UsedRange.Rows.Count <> n Then MsgBox "Мяу!"
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    n = Me.UsedRange.Rows.Count
End Sub
[/vba]

Автор - RAN
Дата добавления - 12.04.2016 в 15:08
Michael_S Дата: Вторник, 12.04.2016, 15:17 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1834
Репутация: 344 ±
Замечаний: 0% ±

Excel2016
RAN, спасибо, тоже вариант.
Почему "тоже" - пришла такая идея:
[vba]
Код
If Target.Address Like "*[!A-Z]*" Then MsgBox "Вставлена строка"
[/vba]


ЯД: 41001136675053
WM: R389613894253
 
Ответить
СообщениеRAN, спасибо, тоже вариант.
Почему "тоже" - пришла такая идея:
[vba]
Код
If Target.Address Like "*[!A-Z]*" Then MsgBox "Вставлена строка"
[/vba]

Автор - Michael_S
Дата добавления - 12.04.2016 в 15:17
RAN Дата: Вторник, 12.04.2016, 15:29 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4607
Репутация: 925 ±
Замечаний: 0% ±

2010
Тогда уж так
[vba]
Код
If Not Target.Address Like "*[A-Z]*" Then MsgBox "Вставлена строка"
[/vba]
Но попробуй строку очистить.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеТогда уж так
[vba]
Код
If Not Target.Address Like "*[A-Z]*" Then MsgBox "Вставлена строка"
[/vba]
Но попробуй строку очистить.

Автор - RAN
Дата добавления - 12.04.2016 в 15:29
_Boroda_ Дата: Вторник, 12.04.2016, 15:32 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 11698
Репутация: 4839 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
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]
К сообщению приложен файл: 829786.xlsm(15Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение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]

Автор - _Boroda_
Дата добавления - 12.04.2016 в 15:32
SLAVICK Дата: Вторник, 12.04.2016, 16:00 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2011
Репутация: 675 ±
Замечаний: 0% ±

2007,2010,2013,2016
Александр - попробуй просто очистить строку :D
Нужно все-таки привязываться и к к-ву строк.
Попробовал - получилось как-то так:
[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]
К сообщению приложен файл: 3995903-1-.xlsm(42Kb) · 3004474.xlsm(39Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 12.04.2016, 16:21
 
Ответить
СообщениеАлександр - попробуй просто очистить строку :D
Нужно все-таки привязываться и к к-ву строк.
Попробовал - получилось как-то так:
[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]

Автор - SLAVICK
Дата добавления - 12.04.2016 в 16:00
leonrom Дата: Четверг, 21.09.2017, 17:37 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
"думал тоже к 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

End Sub

Автор - leonrom
Дата добавления - 21.09.2017 в 17:37
_Boroda_ Дата: Четверг, 21.09.2017, 17:53 | Сообщение № 8
Группа: Модераторы
Ранг: Местный житель
Сообщений: 11698
Репутация: 4839 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Оформите код тегами (кнопка # в режиме правки поста)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеОформите код тегами (кнопка # в режиме правки поста)

Автор - _Boroda_
Дата добавления - 21.09.2017 в 17:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как определить, что была вставлена строка? (или несколько) (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!