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

Вход

Регистрация

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

 

= Мир MS Excel/Прошу помочь разобраться в макросе с Target и Intersect - Мир MS Excel

Старая форма входа
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Прошу помочь разобраться в макросе с Target и Intersect (Новое детище.. ну хорошо, не детище, так, детеныш ))
Прошу помочь разобраться в макросе с Target и Intersect
light26 Дата: Четверг, 26.04.2012, 22:01 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Всем привет.
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)       'тут не совсем понятно
         If Target.Cells.Count > 1 Then Exit Sub                    'тут совсем не понятно
           If Not Intersect(Target, Range("A:A")) Is Nothing Then                  'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней
              With Target(1, 5)                    'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
                .Value = Now                    'если по-русски, то =ТДАТА()
                 Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM"  'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
                 .EntireColumn.AutoFit                    'автовыравнивание
              End With
                With Target(1, 6)                    '
                   .Value = Now                    '
                    Columns("f:f").NumberFormat = "d/m/yyyy"                       'формат ячеек столбца F - дата (д,м,ггг)
                   .EntireColumn.AutoFit                    '
                End With
               End If
            End Sub
[/vba]
Вот что у меня получилось после доработки уже готового макроса строками, полученными в результате использования макрорекордера
Для пущей ясности прошу знатоков разъяснить вопросы, которые я указал выше.
Спасибо.


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Пятница, 27.04.2012, 14:43
 
Ответить
СообщениеВсем привет.
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)       'тут не совсем понятно
         If Target.Cells.Count > 1 Then Exit Sub                    'тут совсем не понятно
           If Not Intersect(Target, Range("A:A")) Is Nothing Then                  'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней
              With Target(1, 5)                    'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
                .Value = Now                    'если по-русски, то =ТДАТА()
                 Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM"  'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
                 .EntireColumn.AutoFit                    'автовыравнивание
              End With
                With Target(1, 6)                    '
                   .Value = Now                    '
                    Columns("f:f").NumberFormat = "d/m/yyyy"                       'формат ячеек столбца F - дата (д,м,ггг)
                   .EntireColumn.AutoFit                    '
                End With
               End If
            End Sub
[/vba]
Вот что у меня получилось после доработки уже готового макроса строками, полученными в результате использования макрорекордера
Для пущей ясности прошу знатоков разъяснить вопросы, которые я указал выше.
Спасибо.

Автор - light26
Дата добавления - 26.04.2012 в 22:01
Саня Дата: Пятница, 27.04.2012, 01:27 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
вот твой код:
[vba]
Code
' это обработчик события изменений на листе, _
    Target - это диапазон, который был изменен
Private Sub Worksheet_Change(ByVal Target As Range)
' если изменили диапазон, состоящий более чем из одной ячейки, то выходим
      If Target.Cells.Count > 1 Then Exit Sub

      'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней...
      '...пересечение Таргета с первым столбцом не есть ничто, _
        т.е., есть что-то, т.е., Таргет пересекается с 1-м столбцом
      If Not Intersect(Target, Range("A:A")) Is Nothing Then
          '''If Target.Column = 1 Then ' я бы так написал, т.к. Таргет - это одна ячейка, на этой строчке уже точно!

          With Target(1, 5)  'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
              ' Target(1, 5) - трудноинтерпретируемое выражение, для меня во всяком случае. _
                 более осмысленно было бы: Target.Offset(0,4) _
                 или Target.Offset(,4)   <-- это тот же х... только сбоку  

              'строка (***) вызовет этот обработчик еще раз, я думаю, это не планировалось, _
                поэтому здесь нужно отключить события
              Application.EnableEvents = False    ' <==================
              .Value = Now   'если по-русски, то =ТДАТА()               (***)
              Application.EnableEvents = True    ' <================== включаем обратно!

              Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM"  'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
              .EntireColumn.AutoFit   'автовыравнивание   (АВТОПОДБОР ШИРИНЫ СТОЛБЦА)
          End With

          With Target(1, 6)
              Application.EnableEvents = False    ' <==================
              .Value = Now
              Application.EnableEvents = True    ' <================== включаем обратно!
              Columns("f:f").NumberFormat = "d/m/yyyy"  'формат ячеек столбца F - дата (д,м,ггг)
              .EntireColumn.AutoFit
              ' Columns("f:f") в этом контексте идентично .EntireColumn _
               при каждом изменении листа каждый раз задавать формат одного и того же столбца _
               это неразумно, меняй формат только одной ячейки
          End With
      End If
End Sub
[/vba]

предложу как вариант
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Cells.Count > 1 Then Exit Sub

      If Target.Column = 1 Then
          Application.EnableEvents = False
          With Target
              With .Offset(, 4)
                  .Value = Time
                  .NumberFormat = "[$-F400]h:mm:ss AM/PM"
                  .EntireColumn.AutoFit
              End With
                
              With .Offset(, 5)
                  .Value = Date
                  .NumberFormat = "d/m/yyyy"
                  .EntireColumn.AutoFit
              End With
          End With
          Application.EnableEvents = True
      End If
End Sub
[/vba]
 
Ответить
Сообщениевот твой код:
[vba]
Code
' это обработчик события изменений на листе, _
    Target - это диапазон, который был изменен
Private Sub Worksheet_Change(ByVal Target As Range)
' если изменили диапазон, состоящий более чем из одной ячейки, то выходим
      If Target.Cells.Count > 1 Then Exit Sub

      'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней...
      '...пересечение Таргета с первым столбцом не есть ничто, _
        т.е., есть что-то, т.е., Таргет пересекается с 1-м столбцом
      If Not Intersect(Target, Range("A:A")) Is Nothing Then
          '''If Target.Column = 1 Then ' я бы так написал, т.к. Таргет - это одна ячейка, на этой строчке уже точно!

          With Target(1, 5)  'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
              ' Target(1, 5) - трудноинтерпретируемое выражение, для меня во всяком случае. _
                 более осмысленно было бы: Target.Offset(0,4) _
                 или Target.Offset(,4)   <-- это тот же х... только сбоку  

              'строка (***) вызовет этот обработчик еще раз, я думаю, это не планировалось, _
                поэтому здесь нужно отключить события
              Application.EnableEvents = False    ' <==================
              .Value = Now   'если по-русски, то =ТДАТА()               (***)
              Application.EnableEvents = True    ' <================== включаем обратно!

              Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM"  'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
              .EntireColumn.AutoFit   'автовыравнивание   (АВТОПОДБОР ШИРИНЫ СТОЛБЦА)
          End With

          With Target(1, 6)
              Application.EnableEvents = False    ' <==================
              .Value = Now
              Application.EnableEvents = True    ' <================== включаем обратно!
              Columns("f:f").NumberFormat = "d/m/yyyy"  'формат ячеек столбца F - дата (д,м,ггг)
              .EntireColumn.AutoFit
              ' Columns("f:f") в этом контексте идентично .EntireColumn _
               при каждом изменении листа каждый раз задавать формат одного и того же столбца _
               это неразумно, меняй формат только одной ячейки
          End With
      End If
End Sub
[/vba]

предложу как вариант
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Cells.Count > 1 Then Exit Sub

      If Target.Column = 1 Then
          Application.EnableEvents = False
          With Target
              With .Offset(, 4)
                  .Value = Time
                  .NumberFormat = "[$-F400]h:mm:ss AM/PM"
                  .EntireColumn.AutoFit
              End With
                
              With .Offset(, 5)
                  .Value = Date
                  .NumberFormat = "d/m/yyyy"
                  .EntireColumn.AutoFit
              End With
          End With
          Application.EnableEvents = True
      End If
End Sub
[/vba]

Автор - Саня
Дата добавления - 27.04.2012 в 01:27
Alex_ST Дата: Пятница, 27.04.2012, 09:46 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Да уж, Вадим, по поводу Target(1, 5) и Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно. Правильно сказал Саша, что корректнее использовать Offset
Саш, я тут на досуге твой код для Вадима откомментировал. Надеюсь, ты не против?
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)   ' обработка события изменения на листе
    If Target.Cells.Count > 1 Then Exit Sub   ' если изменение было больше, чем в одной ячейке - выход
' дальше Target - это одна ячейка
    If Target.Column = 1 Then   ' если Target (изменение на листе) в первом столбце (столбце А)
       Application.EnableEvents = False   ' запретить обработку событий чтобы производимые далее изменения на листе не приводили к повторному циклическому вызову этой же процедуры
       With Target.Offset(0, 4)   ' в ячейке, сдвинутой от ячейки Target на 0 строк и 4 столбца (т.е. с столбце Е)
          .Value = Time   ' значение - текущее время
          .NumberFormat = "h:mm:ss"   ' формат представления чисел в ячейке (время в 24-часовом формате ч:мм:сс)
          .EntireColumn.AutoFit   ' во всём столбце установить выравнивание "Автоподбор ширины"
       End With

       With Target.Offset(0, 5)  ' в ячейке, сдвинутой от ячейки Target на 0 строк и 5 столбцов (т.е. с столбце F)
          .Value = Date  ' значение - текущая дата
          .NumberFormat = "d/m/yyyy"   ' формат представления чисел в ячейке (дата Д.М.ГГГГ)
          .EntireColumn.AutoFit  ' во всём столбце установить выравнивание "Автоподбор ширины"
       End With
       Application.EnableEvents = True   ' разрешить обработку событий
    End If
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеДа уж, Вадим, по поводу Target(1, 5) и Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно. Правильно сказал Саша, что корректнее использовать Offset
Саш, я тут на досуге твой код для Вадима откомментировал. Надеюсь, ты не против?
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)   ' обработка события изменения на листе
    If Target.Cells.Count > 1 Then Exit Sub   ' если изменение было больше, чем в одной ячейке - выход
' дальше Target - это одна ячейка
    If Target.Column = 1 Then   ' если Target (изменение на листе) в первом столбце (столбце А)
       Application.EnableEvents = False   ' запретить обработку событий чтобы производимые далее изменения на листе не приводили к повторному циклическому вызову этой же процедуры
       With Target.Offset(0, 4)   ' в ячейке, сдвинутой от ячейки Target на 0 строк и 4 столбца (т.е. с столбце Е)
          .Value = Time   ' значение - текущее время
          .NumberFormat = "h:mm:ss"   ' формат представления чисел в ячейке (время в 24-часовом формате ч:мм:сс)
          .EntireColumn.AutoFit   ' во всём столбце установить выравнивание "Автоподбор ширины"
       End With

       With Target.Offset(0, 5)  ' в ячейке, сдвинутой от ячейки Target на 0 строк и 5 столбцов (т.е. с столбце F)
          .Value = Date  ' значение - текущая дата
          .NumberFormat = "d/m/yyyy"   ' формат представления чисел в ячейке (дата Д.М.ГГГГ)
          .EntireColumn.AutoFit  ' во всём столбце установить выравнивание "Автоподбор ширины"
       End With
       Application.EnableEvents = True   ' разрешить обработку событий
    End If
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 27.04.2012 в 09:46
RAN Дата: Пятница, 27.04.2012, 10:12 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Quote (Alex_ST)
Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно

Это еще мягко сказано.
Когда Target = [A1:F2], то Target(1, 6) = [F1] б/м понятно
A вот когда Target = [A1], и Target(1, 6) = [F1] ???


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Quote (Alex_ST)
Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно

Это еще мягко сказано.
Когда Target = [A1:F2], то Target(1, 6) = [F1] б/м понятно
A вот когда Target = [A1], и Target(1, 6) = [F1] ???

Автор - RAN
Дата добавления - 27.04.2012 в 10:12
light26 Дата: Пятница, 27.04.2012, 14:36 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Безусловно, огромное спасибо, господа.
Но... Ряд вопросов остался без ответа, ряд разъяснений так и остался за пределами моего понимания, а на ряд ответов возникли новые вопросы )))
Это ни в коем случае, не упрек в ваш адрес. Это обоснование причин, по которым я продолжаю диалог на эту тему smile
Итак:
В строке Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM" что же все-таки значит [$-F400]? (эта строка получена в результате применения макрорекордера, - включил макрорекордер, изменил свойства ячейки, остановил запись, отредактировал, вставил в имеющийся код)
Что касается:
Quote (RAN)
Когда Target = [A1:F2], то Target(1, 6) = [F1] б/м понятно
A вот когда Target = [A1], и Target(1, 6) = [F1]

Это просто грубая ошибка или такая запись вообще не приемлема, т.к. может в дальнейшем привести к ошибке?
Quote (Alex_ST)
If Target.Cells.Count > 1 Then Exit Sub ' если изменение было больше, чем в одной ячейке - выход
' дальше Target - это одна ячейка

Как понять "если изменение было больше, чем в ОДНОЙ ячейке"?

Quote (Alex_ST)
Application.EnableEvents = False ' запретить обработку событий чтобы производимые далее изменения на листе не приводили к повторному циклическому вызову этой же процедуры

Тут совсем не понял. Без этой строки (по крайней мере в моем макросе) все работает так же, как и с этой строкой. Можно разжевать, в рот положить и еще и проглотить помочь ))) про эту строку макроса?
в чем разница между
Quote (Саня)
NumberFormat = "[$-F400]h:mm:ss AM/PM"

и
Quote (Alex_ST)
.NumberFormat = "h:mm:ss"

Ну и с этой строкой я так ничего и не понял
Quote (Саня)
If Not Intersect(Target, Range("A:A")) Is Nothing Then


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Пятница, 27.04.2012, 14:39
 
Ответить
СообщениеБезусловно, огромное спасибо, господа.
Но... Ряд вопросов остался без ответа, ряд разъяснений так и остался за пределами моего понимания, а на ряд ответов возникли новые вопросы )))
Это ни в коем случае, не упрек в ваш адрес. Это обоснование причин, по которым я продолжаю диалог на эту тему smile
Итак:
В строке Columns("e:e").NumberFormat = "[$-F400]h:mm:ss AM/PM" что же все-таки значит [$-F400]? (эта строка получена в результате применения макрорекордера, - включил макрорекордер, изменил свойства ячейки, остановил запись, отредактировал, вставил в имеющийся код)
Что касается:
Quote (RAN)
Когда Target = [A1:F2], то Target(1, 6) = [F1] б/м понятно
A вот когда Target = [A1], и Target(1, 6) = [F1]

Это просто грубая ошибка или такая запись вообще не приемлема, т.к. может в дальнейшем привести к ошибке?
Quote (Alex_ST)
If Target.Cells.Count > 1 Then Exit Sub ' если изменение было больше, чем в одной ячейке - выход
' дальше Target - это одна ячейка

Как понять "если изменение было больше, чем в ОДНОЙ ячейке"?

Quote (Alex_ST)
Application.EnableEvents = False ' запретить обработку событий чтобы производимые далее изменения на листе не приводили к повторному циклическому вызову этой же процедуры

Тут совсем не понял. Без этой строки (по крайней мере в моем макросе) все работает так же, как и с этой строкой. Можно разжевать, в рот положить и еще и проглотить помочь ))) про эту строку макроса?
в чем разница между
Quote (Саня)
NumberFormat = "[$-F400]h:mm:ss AM/PM"

и
Quote (Alex_ST)
.NumberFormat = "h:mm:ss"

Ну и с этой строкой я так ничего и не понял
Quote (Саня)
If Not Intersect(Target, Range("A:A")) Is Nothing Then

Автор - light26
Дата добавления - 27.04.2012 в 14:36
Serge_007 Дата: Пятница, 27.04.2012, 14:44 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (light26)
что же все-таки значит [$-F400]

Это код формата локали твоего Excel


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (light26)
что же все-таки значит [$-F400]

Это код формата локали твоего Excel

Автор - Serge_007
Дата добавления - 27.04.2012 в 14:44
Hugo Дата: Пятница, 27.04.2012, 14:46 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Про [$-F400] читаем первоисточник:
http://office.microsoft.com/en-us....35.aspx

Про Application.EnableEvents = False - это только кажется, что работает как и без неё. Вы пошагово выполните код - увидите, что на изменение, вызванное кодом, сам же код и реагирует, но проверку это изменение не проходит.
Иначе бы оно зациклилось. Но зачем нам код гонять впустую?

"Как понять "если изменение было больше, чем в ОДНОЙ ячейке"? " - закопипастили например диапазон 10х10...

[vba]
Code
If Not Intersect(Target, Range("A:A")) Is Nothing Then
[/vba]
Если Не Пересечение(Цель, Диапазон) Есть Ничего То
=
Если Не (Пересечение(Цель, Диапазон) Есть Ничего) То
сокращаем как в алгебре:
Если Пересечение(Цель, Диапазон) Есть То


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеПро [$-F400] читаем первоисточник:
http://office.microsoft.com/en-us....35.aspx

Про Application.EnableEvents = False - это только кажется, что работает как и без неё. Вы пошагово выполните код - увидите, что на изменение, вызванное кодом, сам же код и реагирует, но проверку это изменение не проходит.
Иначе бы оно зациклилось. Но зачем нам код гонять впустую?

"Как понять "если изменение было больше, чем в ОДНОЙ ячейке"? " - закопипастили например диапазон 10х10...

[vba]
Code
If Not Intersect(Target, Range("A:A")) Is Nothing Then
[/vba]
Если Не Пересечение(Цель, Диапазон) Есть Ничего То
=
Если Не (Пересечение(Цель, Диапазон) Есть Ничего) То
сокращаем как в алгебре:
Если Пересечение(Цель, Диапазон) Есть То

Автор - Hugo
Дата добавления - 27.04.2012 в 14:46
RAN Дата: Пятница, 27.04.2012, 15:00 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Quote (light26)
Как понять "если изменение было больше, чем в ОДНОЙ ячейке"?

Так и понимай. Скопировал 4 ячейки, вставил. Сколько изменилось? 1 или 4?
Если строки
[vba]
Code
If Target.Cells.Count > 1 Then Exit Sub
[/vba]
нет, то при изменении сразу 4 ячеек макрос сработает, а если есть - не сработает.

Application.EnableEvents - изменения происходят не в столбце А, поэтому и без отключения обработки событий повторного запуска макроса не видно.

[vba]
Code
If Not Intersect(Target, Range("A:A")) Is Nothing Then
[/vba]

Переводю! biggrin

Если Не пересечение(изменяемого диапазона, столбца "А") отсутствует, Тогда...


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Quote (light26)
Как понять "если изменение было больше, чем в ОДНОЙ ячейке"?

Так и понимай. Скопировал 4 ячейки, вставил. Сколько изменилось? 1 или 4?
Если строки
[vba]
Code
If Target.Cells.Count > 1 Then Exit Sub
[/vba]
нет, то при изменении сразу 4 ячеек макрос сработает, а если есть - не сработает.

Application.EnableEvents - изменения происходят не в столбце А, поэтому и без отключения обработки событий повторного запуска макроса не видно.

[vba]
Code
If Not Intersect(Target, Range("A:A")) Is Nothing Then
[/vba]

Переводю! biggrin

Если Не пересечение(изменяемого диапазона, столбца "А") отсутствует, Тогда...

Автор - RAN
Дата добавления - 27.04.2012 в 15:00
light26 Дата: Пятница, 27.04.2012, 15:05 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Hugo)
Про [$-F400] читаем первоисточник:
http://office.microsoft.com/en-us....35.aspx

Ага я по-английски только yes знаю как переводится. )))


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Hugo)
Про [$-F400] читаем первоисточник:
http://office.microsoft.com/en-us....35.aspx

Ага я по-английски только yes знаю как переводится. )))

Автор - light26
Дата добавления - 27.04.2012 в 15:05
RAN Дата: Пятница, 27.04.2012, 15:21 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Тогда изучай 1С.
Там весь код на русском! biggrin


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеТогда изучай 1С.
Там весь код на русском! biggrin

Автор - RAN
Дата добавления - 27.04.2012 в 15:21
Alex_ST Дата: Пятница, 27.04.2012, 15:24 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Вадим,
1. Запись Target(1, 5) означает ячейку, находящуюся в ДИАПАЗОНЕ ЯЧЕЕК Target в первой строке и пятом столбце.
НО ведь у вас в первом же операторе если в Target больше, чем 1 ячейка - выход. Т.е. Target - это ОДНА ЯЧЕЙКА. И о какой тогда ячейке идёт речь в записи Target(1, 5) если там нет ни столбцов, ни строк?
Самое интересное и непонятное, что я сейчас попробовал и выяснил, что [vba]
Code
With Target(1, 5)
[/vba] не понятно почему, но вопреки всякой логике РАБОТАЕТ точно так же как вполне корректное[vba]
Code
With Target.Offset(0, 4)
[/vba] surprised
Но вполне может работать не везде. И не надо привыкать к такому недокументированному обращению. Тем более, что оно просто не логично (я выше, надеюсь, объяснил, почему?)

2. Target в данной процедуре - это диапазон ячеек, в котором произошло изменение. Изменение могло быть не в одной ячейке, а сразу в нескольких. Например, вы вставили значения сразу в несколько ячеек или выделили какой-то диапазон и нажали Delete. Тогда количество ячеек в Target будет больше одной.

3. Опять же хоть без этого и почему-то работает, но:
в процессе ввода макросом времени и даты в ячейки на листе происходят события Worksheet_Change, которые вы собственно этим же макросом и обрабатываете. Т.е. вполне может получиться, что в результате работы макроса он начнёт вызывать сам себя и войдёт в бесконечный цикл.
Поэтому перед тем как начать что-то писать в ячейки листа мы запрещаем приложению реагировать на события : Application.EnableEvents = False, а после того, как изменения ячеек макросом закончим, разрешаем обработку событий опять: Application.EnableEvents = True

4. Не люблю и не знаю я эти текстовые описания цифровых форматов... Потому и стараюсь не использовать. В принципе, это есть у Уокенбаха. Если интересно, почитайте.

5. А про Intersect неужели в справке так не понятно написано? Там же всего-то несколько строк:
Quote
Intersect Method
Returns a Range object that represents the rectangular intersection of two or more ranges.
expression.Intersect(Arg1, Arg2, ...)
expression Optional. An expression that returns an Application object.
Arg1, Arg2, ... Required Range. The intersecting ranges. At least two Range objects must be specified.

Т.е. в нашем случае: если диапазоны столбца А:А и Target не пересекаются (изменения произошли не в столбце А) и, следовательно, метод Intersect(Target, Range("A:A")) вернёт значение Nothing, то выйти из процедуры.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВадим,
1. Запись Target(1, 5) означает ячейку, находящуюся в ДИАПАЗОНЕ ЯЧЕЕК Target в первой строке и пятом столбце.
НО ведь у вас в первом же операторе если в Target больше, чем 1 ячейка - выход. Т.е. Target - это ОДНА ЯЧЕЙКА. И о какой тогда ячейке идёт речь в записи Target(1, 5) если там нет ни столбцов, ни строк?
Самое интересное и непонятное, что я сейчас попробовал и выяснил, что [vba]
Code
With Target(1, 5)
[/vba] не понятно почему, но вопреки всякой логике РАБОТАЕТ точно так же как вполне корректное[vba]
Code
With Target.Offset(0, 4)
[/vba] surprised
Но вполне может работать не везде. И не надо привыкать к такому недокументированному обращению. Тем более, что оно просто не логично (я выше, надеюсь, объяснил, почему?)

2. Target в данной процедуре - это диапазон ячеек, в котором произошло изменение. Изменение могло быть не в одной ячейке, а сразу в нескольких. Например, вы вставили значения сразу в несколько ячеек или выделили какой-то диапазон и нажали Delete. Тогда количество ячеек в Target будет больше одной.

3. Опять же хоть без этого и почему-то работает, но:
в процессе ввода макросом времени и даты в ячейки на листе происходят события Worksheet_Change, которые вы собственно этим же макросом и обрабатываете. Т.е. вполне может получиться, что в результате работы макроса он начнёт вызывать сам себя и войдёт в бесконечный цикл.
Поэтому перед тем как начать что-то писать в ячейки листа мы запрещаем приложению реагировать на события : Application.EnableEvents = False, а после того, как изменения ячеек макросом закончим, разрешаем обработку событий опять: Application.EnableEvents = True

4. Не люблю и не знаю я эти текстовые описания цифровых форматов... Потому и стараюсь не использовать. В принципе, это есть у Уокенбаха. Если интересно, почитайте.

5. А про Intersect неужели в справке так не понятно написано? Там же всего-то несколько строк:
Quote
Intersect Method
Returns a Range object that represents the rectangular intersection of two or more ranges.
expression.Intersect(Arg1, Arg2, ...)
expression Optional. An expression that returns an Application object.
Arg1, Arg2, ... Required Range. The intersecting ranges. At least two Range objects must be specified.

Т.е. в нашем случае: если диапазоны столбца А:А и Target не пересекаются (изменения произошли не в столбце А) и, следовательно, метод Intersect(Target, Range("A:A")) вернёт значение Nothing, то выйти из процедуры.

Автор - Alex_ST
Дата добавления - 27.04.2012 в 15:24
light26 Дата: Пятница, 27.04.2012, 15:25 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (RAN)
Тогда изучай 1С.
Там весь код на русском!

Ну спасибо, добрый человек )))))


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (RAN)
Тогда изучай 1С.
Там весь код на русском!

Ну спасибо, добрый человек )))))

Автор - light26
Дата добавления - 27.04.2012 в 15:25
shanemac51 Дата: Пятница, 27.04.2012, 15:25 | Сообщение № 13
Группа: Проверенные
Ранг: Новичок
Сообщений: 33
Репутация: 4 ±
Замечаний: 0% ±

[vba]
Code

Private Sub Worksheet_Change(ByVal Target As Range)
'тут не совсем понятно
''''target --грубо говоря --копия ячеек, измененных на данном листе

Debug.Print Target.Row, Target.Column
If Target.Cells.Count > 1 Then Exit Sub
'тут совсем не понятно
''если выделено более 1 ячейки--выход
If Not Intersect(Target, Range("A:A")) Is Nothing Then
'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней
''если диапазон а:а не выделен   --выход  
''
   With Target(1, 5)
   'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
   '''''''''' причем 1,5 означает вывод
''1--в первую строку таргета
''5--столбец
'''''''''''''''''''''''''''''''
   .Value = Now
   'если по-русски, то =ТДАТА()
   'Columns ("e:e")   '''не нужна
   .NumberFormat = "[$-F400]h:mm:ss AM/PM"
   'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
   '''вы запросили формат--только время
   .EntireColumn.AutoFit
   'автовыравнивание
   End With
   '''''''''''''''''''''''''''''''
   With Target(1, 6)                    '
   .Value = Now                    '
   'Columns("f:f")    '''не нужна
   .NumberFormat = "d/m/yyyy"
   'формат ячеек столбца F - дата (д,м,ггг)
   ''здесь формат день(1 или 2 цифры), месяц (1 или 2) и год(4)
   .EntireColumn.AutoFit                    '
   End With
End If
End Sub

[/vba]


Сообщение отредактировал shanemac51 - Пятница, 27.04.2012, 15:26
 
Ответить
Сообщение[vba]
Code

Private Sub Worksheet_Change(ByVal Target As Range)
'тут не совсем понятно
''''target --грубо говоря --копия ячеек, измененных на данном листе

Debug.Print Target.Row, Target.Column
If Target.Cells.Count > 1 Then Exit Sub
'тут совсем не понятно
''если выделено более 1 ячейки--выход
If Not Intersect(Target, Range("A:A")) Is Nothing Then
'тут ясно, что следим за изменениями в столбце А. Хотелось бы подробней
''если диапазон а:а не выделен   --выход  
''
   With Target(1, 5)
   'тут указываем ячейку, куда будут вводиться результат вычисления следующей строки
   '''''''''' причем 1,5 означает вывод
''1--в первую строку таргета
''5--столбец
'''''''''''''''''''''''''''''''
   .Value = Now
   'если по-русски, то =ТДАТА()
   'Columns ("e:e")   '''не нужна
   .NumberFormat = "[$-F400]h:mm:ss AM/PM"
   'формат ячеек столбца Е - время (ч,мм,сс). Только вот что значит [$-F400]?
   '''вы запросили формат--только время
   .EntireColumn.AutoFit
   'автовыравнивание
   End With
   '''''''''''''''''''''''''''''''
   With Target(1, 6)                    '
   .Value = Now                    '
   'Columns("f:f")    '''не нужна
   .NumberFormat = "d/m/yyyy"
   'формат ячеек столбца F - дата (д,м,ггг)
   ''здесь формат день(1 или 2 цифры), месяц (1 или 2) и год(4)
   .EntireColumn.AutoFit                    '
   End With
End If
End Sub

[/vba]

Автор - shanemac51
Дата добавления - 27.04.2012 в 15:25
light26 Дата: Пятница, 27.04.2012, 15:27 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Alex_ST)
не понятно почему, но вопреки всякой логике РАБОТАЕТ точно так же как вполне корректное

Я поэтому и уточнил.
Работает вообще весь макрос, несмотря на то, что я над ним "поколдовал" )))


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Alex_ST)
не понятно почему, но вопреки всякой логике РАБОТАЕТ точно так же как вполне корректное

Я поэтому и уточнил.
Работает вообще весь макрос, несмотря на то, что я над ним "поколдовал" )))

Автор - light26
Дата добавления - 27.04.2012 в 15:27
Alex_ST Дата: Пятница, 27.04.2012, 15:30 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (light26)
я по-английски только yes знаю
Безотказный Вы наш! Что бы такое попросить-то ...? biggrin



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (light26)
я по-английски только yes знаю
Безотказный Вы наш! Что бы такое попросить-то ...? biggrin

Автор - Alex_ST
Дата добавления - 27.04.2012 в 15:30
light26 Дата: Пятница, 27.04.2012, 15:39 | Сообщение № 16
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (shanemac51)
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (shanemac51)
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?

Автор - light26
Дата добавления - 27.04.2012 в 15:39
light26 Дата: Пятница, 27.04.2012, 15:40 | Сообщение № 17
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Alex_ST)
Что бы такое попросить-то ...?

yes... )))


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Alex_ST)
Что бы такое попросить-то ...?

yes... )))

Автор - light26
Дата добавления - 27.04.2012 в 15:40
light26 Дата: Пятница, 27.04.2012, 15:48 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Alex_ST)
Т.е. в нашем случае: если диапазоны столбца А:А и Target не пересекаются (изменения произошли не в столбце А) и, следовательно, метод Intersect(Target, Range("A:A")) вернёт значение Nothing, то выйти из процедуры.

Грубо говоря, удаление из кода этой строки приведет к тому, что ввод любого значения в любую ячейку будет отображать в пятом, шестом столбце время и дату внесенных изменений?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Alex_ST)
Т.е. в нашем случае: если диапазоны столбца А:А и Target не пересекаются (изменения произошли не в столбце А) и, следовательно, метод Intersect(Target, Range("A:A")) вернёт значение Nothing, то выйти из процедуры.

Грубо говоря, удаление из кода этой строки приведет к тому, что ввод любого значения в любую ячейку будет отображать в пятом, шестом столбце время и дату внесенных изменений?

Автор - light26
Дата добавления - 27.04.2012 в 15:48
light26 Дата: Пятница, 27.04.2012, 15:57 | Сообщение № 19
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (light26)
удаление из кода этой строки

поэкспериментировал. получилось, что в каждой 5,6 строке макрос вбил дату и время, а потом заругался и прекратил работу


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (light26)
удаление из кода этой строки

поэкспериментировал. получилось, что в каждой 5,6 строке макрос вбил дату и время, а потом заругался и прекратил работу

Автор - light26
Дата добавления - 27.04.2012 в 15:57
RAN Дата: Пятница, 27.04.2012, 20:04 | Сообщение № 20
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
И еще о Target
Target.Cells.Count > 1 работает точно так-же, как и Target.Count > 1


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеИ еще о Target
Target.Cells.Count > 1 работает точно так-же, как и Target.Count > 1

Автор - RAN
Дата добавления - 27.04.2012 в 20:04
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Прошу помочь разобраться в макросе с Target и Intersect (Новое детище.. ну хорошо, не детище, так, детеныш ))
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

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