excel - 如何根据excel中的另一个单元格值限制单元格中的值输入/输入?

标签 excel vba

我有这样的东西


一个



问?
是或否

数字
数字或零


我想做的是:
如果 B1 = “Y”,则让用户在 B2 中输入一个数字。
如果 B1 = “N”,则将 B2 中的值更改为零,并且不允许用户在 B2 中输入任何数字,除非用户将 B1 的值更改回“Y”。
基本上,当且仅当 B1=”Y” 时,才允许用户在 B2 中输入一个数字。
到目前为止我做了什么:

  • 数据 -> 数据验证 -> 自定义,这是我写的公式
  • =OR(AND(B1="Y",ISNUMBER(B2)),AND(B1="N",B2=0))此解决方案并不理想 b/c 当 B1 被选为 N 时,它不会将 B2 更改为零。此外,当 B1 更改为 Y 时,它不会强制用户在 B2 中输入新值。
  • 我尝试使用 VBA 解决问题。这是我写的代码
  • ActiveSheet.Unprotect
    Range("B2").Locked = False
    If Target.Address = "$B$1" Then
        Dim myValue As Variant
        If Range("B1").Value = "N" Then
            Range("B2").Value = 0
        Else
            myValue = InputBox("Give me some input")
            Range("B2").Value = myValue
        
        End If
        
    End If
    Range("B2").Locked = True
    ActiveSheet.Protect
    End Sub
    
    此解决方案工作正常,除了当代码尝试再次锁定 B2 以防止用户直接将数字输入 B2 单元格(不使用输入框)​​时出现错误。另外,我需要添加一些代码来将数据输入限制为数字。
    Error when changing the B1
    知道我该如何解决这个问题吗?
    PS:我设法在 SJR 的帮助下解决了上述代码
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Worksheets("Sheet1").Unprotect
    
    If Target.Address = "$B$1" Then
        Dim myValue As Variant
        If Range("B1").Value = "N" Then
            Range("B2").Value = 0
        Else
        myValue = "no"
            Do Until IsNumeric(myValue)
                    myValue = InputBox("Enter a number > 0")
            Loop
            Range("B2").Value = myValue
        End If
        
    End If
    Worksheets("Sheet1").Protect
    End Sub
    

    最佳答案

    在这里使用样式可能会有所帮助。
    创建一个名为“InputData”的样式,将locked设置为false(在 protected 选项卡(?)上)并将填充设置为例如黄色以将输入单元与其他单元区分开来。
    将此样式分配给 B2
    为 B2“问题”和 B3“答案”添加工作表名称。
    将以下代码粘贴到工作表模块中:

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    If hasName(Target.Cells(1, 1)) Then
        If Target.Cells(1, 1).Name.Name Like "*Question*" Then
           lockUnlockAnswer
        End If
    End If
    End Sub
    
    
    Private Sub lockUnlockAnswer()
    
    Me.Unprotect
    
    Application.EnableEvents = False
    
    If Me.Range("Question") = "Y" Then
        With Me.Range("Answer")
            .Style = "InputData"  'this style
            .Value = vbNullString
        End With
    Else
        With Me.Range("Answer")
            .Style = "Normal"
            .Value = 0
        End With
    End If
        
    Application.EnableEvents = True
        
    Me.Protect
    End Sub
    
    
    Public Function hasName(ByVal c As Range) As Boolean
    On Error Resume Next
    hasName = CBool(c.Name.Name <> vbNullString)
    If Err = 0 Then hasName = True
    Err.Clear
    On Error GoTo 0
    End Function
    
    
    每当用户更改工作表上的任何内容时,都会触发 on_change-event。
    如果更改发生在“问题”lockUnlockAnswer叫做。
    如果 Question = "Y"则 Style "InputData"应用于 B3 (= Answer)。单元格是可编辑的!
    如果问题 <>“Y”,则样式“正常”应用于 B3。单元格被锁定并设置为 0。
    为了防止再次调用 worksheet_change,EnableEvents 设置为 false。
    (大概你会有更多应该像这样工作的问题/答案 - 你可以简单地为单元格名称添加一个索引。向 lockUnlockAnswer 添加一个参数“index”并将索引添加到范围名称......然后例程将适用于不同的问题/答案范围)

    关于excel - 如何根据excel中的另一个单元格值限制单元格中的值输入/输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69559736/

    相关文章:

    工作簿中命名范围的 VBA 超链接列表

    VBA excel : How do I compare a string array to a string?

    vba - IsNumeric/IsError 返回错误

    excel - 表单中的表单 - VBA 右键单击​​复制/粘贴多页

    vba - 如何使用VBA在进入PPT中的下一张幻灯片之前添加延迟

    vba - 如何在[vba] [powerpoint]中为图像添加颜色边框

    excel - 用括号表示法比较不同的范围

    excel - 使用 VBA 使用 IF 在单元格中添加公式时出现问题

    excel - 无法激活工作表 : "Object Required"

    vba - 如何使用 VBA 查找或替换功能定义 'Within' 匹配条件?