Vba 以列中的数据输入为条件保护版本允许范围内的行

Vba 以列中的数据输入为条件保护版本允许范围内的行,vba,excel,Vba,Excel,下午好, 我的工作表受密码保护,用户只允许编辑由单元格C19:G23和C32:L70组成的范围。 我需要创建一个VBA来验证是否在上述范围内的C列中的任何行中输入了数据,在输入数据的行的B列中写入单词“Ok”,并保护这些行以供进一步编辑。换句话说,我需要根据C列中输入的数据修改/覆盖版本允许范围。 在过去的两天里,我尝试了几种方法,包括下面的私人sub,它是从这里找到的另一个答案中选取的,经过了一些修改,但都不起作用 Private Sub Worksheet_Change(ByVal Targ

下午好, 我的工作表受密码保护,用户只允许编辑由单元格
C19:G23
C32:L70
组成的范围。 我需要创建一个VBA来验证是否在上述范围内的C列中的任何行中输入了数据,在输入数据的行的B列中写入单词“Ok”,并保护这些行以供进一步编辑。换句话说,我需要根据C列中输入的数据修改/覆盖版本允许范围。 在过去的两天里,我尝试了几种方法,包括下面的私人sub,它是从这里找到的另一个答案中选取的,经过了一些修改,但都不起作用

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Cells.Count > 1 Then Exit Sub

    Application.EnableEvents = False

    Dim mypassword As String, StringToCheck As String

    On Error GoTo Whoa

    '~~> Change the password here to protect/unprotect the sheet
    mypassword = "Maze"

    '~~> Change it to the relevant string with which you want to compare
    StringToCheck = "Ok"

    If Not Intersect(Target, Range("C1:C70")) Is Nothing Then
        '~~> Check for the cell value
        If Target.Value = “Ok” Then
            '~~> Un-Protect the sheet
            ActiveSheet.Unprotect Squonk

            '~~> Lock the cell
            Range("A1:AAA50000").Locked = True

            '~~> Re-Protect the sheet
            ActiveSheet.Protect Squonk
        End If
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

我不理解您问题的保护部分,但其余部分(我需要创建一个VBA,以验证是否在上述范围内的C列的任何行中输入了数据,在输入数据的行的B列中写入“Ok”一词)应通过以下代码完成:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Cells.Count > 1 Then Exit Sub
    If Intersect(Target, Range("C1:C70")) Is Nothing And _
        Intersect(Target, Range("C19:G23")) Is Nothing Then Exit Sub

    Cells(Target.Row, 2) = "OK"

End Sub
诀窍是在3个条件下退出sub:

  • 不止一个单元
  • C1以外的目标:C70
  • C19以外的目标:G23

然后使用
Target
的属性
.Row
,在列“B”上写下“OK”。

我从找到的一堆数据中得出了下面的结论,它工作得非常好。非常感谢你的帮助

Sub Test()
ActiveSheet.Unprotect Password:="Maze"
Dim mainworkBook As Workbook
Set mainworkBook = ActiveWorkbook
Application.ScreenUpdating = False
Dim lastRow As Long
Dim cell As Range
lastRow = Range("C" & Rows.Count).End(xlUp).Row
For Each cell In Range("C32:C70" & lastRow)
If InStr(1, cell.Value, "") <> 0 Then
cell.Offset(, -1).Value = "Ok"
End If
Next
Application.ScreenUpdating = True
ActiveSheet.Protect Password:="Maze"
End Sub
子测试()
ActiveSheet.Unprotect密码:=“迷宫”
将工作簿设置为工作簿
设置mainworkBook=ActiveWorkbook
Application.ScreenUpdating=False
最后一排一样长
暗淡单元格作为范围
lastRow=范围(“C”和Rows.Count).End(xlUp).Row
对于范围内的每个单元格(“C32:C70”和lastRow)
如果InStr(1,单元格值“”)为0,则
单元格偏移量(,-1).Value=“确定”
如果结束
下一个
Application.ScreenUpdating=True
ActiveSheet.Protect密码:=“迷宫”
端接头

非常感谢您的快速回答,维塔亚。我将试着解释furhter。@Haellion-锁定和解锁部分应该在您知道该怎么做后很容易完成。Excel上有一个名为“允许用户编辑范围”的资源,位于“更改”部分(Excel 2016)下的“审阅”选项卡上。它允许保护整个表单,但在第二个密码的保护下为编辑留下一个范围。这是我的范围(C19:G23和C32:L70)。我以前试过这个代码,但它不太管用。此外,我意识到我需要用一个按钮来触发它,让用户编辑范围的其余部分,而不仅仅是C列。有没有办法用一个公共sub?Haellion-只需在执行时录制一个宏。Vityata,我试过了,但我必须为每行重新创建一个宏,并为每个宏创建一个按钮。这将是非常麻烦的,更不用说,用户将无法使用超过1线的时间。我需要能够在范围内编辑我想要的任意多行,然后点击按钮操作宏,因为这些行将被添加并导出到另一张工作表,并根据B列上缺少“Ok”创建另一个文档。