Объединение двух кодов VBA в двух разных диапазонах в одну инструкцию - PullRequest
0 голосов
/ 26 августа 2018

Я могу заставить один или другой из приведенных ниже кодов работать, но они нужны оба.Первое фиксирует ячейки в диапазоне при вводе данных, второе вставляет отметку даты, когда завершается окончательный ввод данных в столбце D каждой строки.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRg As Range
    On Error Resume Next
    Set xRg = Intersect(Range("A8:D5005"), Target)
    If xRg Is Nothing Then Exit Sub
    Target.Worksheet.Unprotect Password:="Midnight"
    xRg.Locked = True
    Target.Worksheet.Protect Password:="Midnight"
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("D8:D5005")

    If Not Intersect(Target, rng) Is Nothing Then
        Target.Offset(0, 1) = Now
        Target.Offset.NumberFormat = "dd/mm/yyyy hh:mm:ss"  
    End If
End Sub

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

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

Сначала настройте 4 ячейки ввода данных в форматах от А4 до D4, используя опцию Форматировать ячейку, убедитесь, что для этих ячеек Заблокировано равно Не проверено на вкладке Защита.

Затем создайте кнопку и свяжите ее со следующим кодом:

Sub ButtonCode()
    ActiveSheet.Unprotect Password:="A"
    Range("A7:E7").Insert xlShiftDown
    Range("A4:D4").Copy Range("A7:D7")
    Range("E7") = Now()
    Range("A7:E7").Interior.Color = rgbLightBlue
    Range("A7:E7").Font.Color = rgbBlack
    ActiveSheet.Protect Password:="A"
End Sub

В качестве единственного шага защитите лист;мой пример последовательно использует пароль «А».Обратите внимание, что вашим пользователям не нужно будет вводить пароль в любое время.

Как только лист настроен, при нажатии кнопки код разблокирует лист (позволяя вносить изменения), он перемещает существующийданные данные вниз, скопируйте новые точки данных в верхнюю часть списка, добавьте метку времени и некоторое минимальное форматирование.Затем он снова включает защиту, чтобы пользователь не мог перезаписать существующие записи.

На приведенном ниже снимке экрана показано, как он может выглядеть, в том числе показано, что A4: D4 необходимо разблокировать.

screen example

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

0 голосов
/ 26 августа 2018

Я не уверен на 100% в структуре вашего рабочего листа, поэтому вот предположения для моего ответа. Вы хотите, чтобы пользователь только изменял ячейки в диапазоне «A8: D5005»… и где-то на листе вы хотите записывать изменения даты / метки времени для измененных ячеек.

Поэтому я бы начал с защиты листа, перейдя на ленту «Обзор» в Excel (не в VBA) и настроив редактируемый диапазон следующим образом.

Review ribbon

Прежде чем закрыть диалоговое окно, нажмите Защитить лист, чтобы остальная часть листа была защищена паролем.

Allow Users to Edit Range

Как только вы это сделаете ... вы можете использовать что-то вроде приведенного ниже кода для записи даты / времени. В этом примере… я записываю их в столбцы справа от вашего редактируемого диапазона (учитывая, что ваши редактируемые данные относятся только к столбцу D).

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vIntersect As Variant
    Set vIntersect = Application.Intersect(Target, Range("A8:D5005"))
    If Not vIntersect Is Nothing Then
        Application.EnableEvents = False
        Target.Worksheet.Unprotect Password:="Midnight"
        Target.Offset(0, 5) = Now
        Target.Offset(0, 5).NumberFormat = "dd/mm/yyyy hh:mm:ss"
        Target.Worksheet.Protect Password:="Midnight"
        Application.EnableEvents = True
    End If
End Sub

Надеюсь, это поможет.

...