Дата: Воскресенье, 02.03.2014, 19:08 |
Сообщение № 1
Группа: Гости
Здравствуйте, помогите пожайлуста объединить практически одинаковых два макроса работающий в разных диапазонах Первый вставляет дату , второй - время
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' Òîëüêî îäíà ÿ÷åéêà If Target.Cells.Count > 1 Then Exit Sub End If For Each cell In Target If Not Intersect(cell, Range("D2:D1100")) Is Nothing And _ Target.Offset(0, -1) = "" Then With Target.Offset(0, -1) ActiveSheet.Unprotect Password:="1" .Value = Now ActiveSheet.Protect Password:="1" End With End If Next cell End Sub
и второй
Private Sub Worksheet_Change(ByVal Target As Range) ' Òîëüêî îäíà ÿ÷åéêà If Target.Cells.Count > 1 Then Exit Sub End If For Each cell In Target If Not Intersect(cell, Range("F2:F1000")) Is Nothing And _ Target.Offset(0, 4) = "" Then With Target.Offset(0, 4) ActiveSheet.Unprotect Password:="1" .Value = Now - Date ' ActiveSheet.Protect Password:="1" End With End If Next cell End Sub
[/vba]
Здравствуйте, помогите пожайлуста объединить практически одинаковых два макроса работающий в разных диапазонах Первый вставляет дату , второй - время
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' Òîëüêî îäíà ÿ÷åéêà If Target.Cells.Count > 1 Then Exit Sub End If For Each cell In Target If Not Intersect(cell, Range("D2:D1100")) Is Nothing And _ Target.Offset(0, -1) = "" Then With Target.Offset(0, -1) ActiveSheet.Unprotect Password:="1" .Value = Now ActiveSheet.Protect Password:="1" End With End If Next cell End Sub
и второй
Private Sub Worksheet_Change(ByVal Target As Range) ' Òîëüêî îäíà ÿ÷åéêà If Target.Cells.Count > 1 Then Exit Sub End If For Each cell In Target If Not Intersect(cell, Range("F2:F1000")) Is Nothing And _ Target.Offset(0, 4) = "" Then With Target.Offset(0, 4) ActiveSheet.Unprotect Password:="1" .Value = Now - Date ' ActiveSheet.Protect Password:="1" End With End If Next cell End Sub
PS, точно работают. Тогда внесите оба действия в одну процедуру Sub но разделите диапазонами обработки. Типа если D1:D1000 Процедура ендиф если F1:F1000 Процедура ендиф.
Проверяйте [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' ActiveSheet.Unprotect Password:="1" If Target.Cells.Count > 1 Then Exit Sub If Not Application.Intersect(Range("D2:D1100"), Target) Is Nothing Then If Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Date End If If Not Application.Intersect(Range("F2:F1100"), Target) Is Nothing Then If Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time End If ' ActiveSheet.Protect Password:="1" End Sub
PS, точно работают. Тогда внесите оба действия в одну процедуру Sub но разделите диапазонами обработки. Типа если D1:D1000 Процедура ендиф если F1:F1000 Процедура ендиф.
Проверяйте [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' ActiveSheet.Unprotect Password:="1" If Target.Cells.Count > 1 Then Exit Sub If Not Application.Intersect(Range("D2:D1100"), Target) Is Nothing Then If Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Date End If If Not Application.Intersect(Range("F2:F1100"), Target) Is Nothing Then If Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time End If ' ActiveSheet.Protect Password:="1" End Sub
Ну да, тогда после причёсывания кода получится что-то типа[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'Dim rCell As Range If Target.Cells.Count > 1 Then Exit Sub 'Только одна ячейка ActiveSheet.Unprotect Password:="1" 'For Each rCell In Target ' цикл не нужен, т.к. ячейка в Target всего одна If Not Intersect(rCell, Range("D2:D1100")) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now If Not Intersect(rCell, Range("F2:F1000")) Is Nothing And Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time 'Next rCell ActiveSheet.Protect Password:="1" End Sub
[/vba]
Ну да, тогда после причёсывания кода получится что-то типа[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'Dim rCell As Range If Target.Cells.Count > 1 Then Exit Sub 'Только одна ячейка ActiveSheet.Unprotect Password:="1" 'For Each rCell In Target ' цикл не нужен, т.к. ячейка в Target всего одна If Not Intersect(rCell, Range("D2:D1100")) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now If Not Intersect(rCell, Range("F2:F1000")) Is Nothing And Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time 'Next rCell ActiveSheet.Protect Password:="1" End Sub
Да, блин... А тупого цикла по единственной ячейке я там не заметил... Стыжусть. Конечно, он нафиг не нужен. Заремарил свой срам в предыдущем посте.
Да, блин... А тупого цикла по единственной ячейке я там не заметил... Стыжусть. Конечно, он нафиг не нужен. Заремарил свой срам в предыдущем посте.Alex_ST
Ну, вообще-то там даже в комментариях кракозябрами написано, что ячейка в Target одна. Поэтому цикл по-любому не нужен (хотя никому и не мешает, конечно ) Так что это я просто по невнимательности цикл оставил. Недоупростил...
Ну, вообще-то там даже в комментариях кракозябрами написано, что ячейка в Target одна. Поэтому цикл по-любому не нужен (хотя никому и не мешает, конечно ) Так что это я просто по невнимательности цикл оставил. Недоупростил...Alex_ST
If Not Intersect(rCell, Range("D2:D1100")) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now
Не вижу принципиальной разницы... Intersect всегда и у всех нормально работает без предваряющего Application. Что .Value = Date, что .Value = Now - пофигу, только данные разные будут выводиться. Да и остальное - те же … , но в профиль
--------------------------------- Блин! Понял! Остатки тупого цикла по единственной rCell на Target не исправил. Конечно, так должно быть[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub 'Только одна ячейка ActiveSheet.Unprotect Password:="1" If Not Intersect(Target, ["D2:D1100"]) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now If Not Intersect(Target, ["F2:F1000"]) Is Nothing And Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time ActiveSheet.Protect Password:="1" End Sub
[/vba] Всё. Больше дома в воскресенье вечером не программирую.
If Not Intersect(rCell, Range("D2:D1100")) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now
Не вижу принципиальной разницы... Intersect всегда и у всех нормально работает без предваряющего Application. Что .Value = Date, что .Value = Now - пофигу, только данные разные будут выводиться. Да и остальное - те же … , но в профиль
--------------------------------- Блин! Понял! Остатки тупого цикла по единственной rCell на Target не исправил. Конечно, так должно быть[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub 'Только одна ячейка ActiveSheet.Unprotect Password:="1" If Not Intersect(Target, ["D2:D1100"]) Is Nothing And Target.Offset(0, -1) = "" Then Target.Offset(0, -1).Value = Now If Not Intersect(Target, ["F2:F1000"]) Is Nothing And Target.Offset(0, 4) = "" Then Target.Offset(0, 4).Value = Time ActiveSheet.Protect Password:="1" End Sub
[/vba] Всё. Больше дома в воскресенье вечером не программирую.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 03.03.2014, 09:35
Нет. Просто не rCell, а Target нужно было писать после ремарок на цикле. Уже исправил. Должно работать. Но без файла-примера проверить, естественно, никак.
Нет. Просто не rCell, а Target нужно было писать после ремарок на цикле. Уже исправил. Должно работать. Но без файла-примера проверить, естественно, никак.Alex_ST