制作if语句,如果值中的条件为false,则允许用户输入

时间:2019-07-16 13:05:38

标签: excel vba

如果满足某些条件或如果不满足条件,则我有一列单元格必须等于另一个单元格的值,允许用户输入。我需要在不将用户输入置于此单元格中的情况下删除if语句。因此,例如在单元格Ex(其中x是该单元格的编号)中,如果满足条件a和b,则Ex = K(x-1);如果不满足条件,则允许用户输入。

到目前为止,我已经在单元格中使用if语句并使用了宏,已经很累了。对于单元格中的if语句,如果不满足条件,我试图使其返回“”。显然,这不起作用,因为当用户输入输入时,if语句被删除。我也尝试制作一个宏,但是我不熟悉VBA,并且不断收到错误消息。

这是我在单元格E2中放入的if语句,然后为整个列复制并粘贴:

IF(AND(K1<>0,K1<>"Actual finish"),K1,"")

这是我尝试制作的宏:

(1)Private Sub Worksheet_Change(ByVal Target As Range)  
(2)    Sheets("Main Menu").AutoFilter.ApplyFilter
(3)End Sub

Private Sub Worksheet_Calculate()
    If Range("K:K").Value <> 0 And (Range("K:K").Value <> "Actual finish") Then 
    Range("F:F") = Range("K:K").Value
End Sub

请注意,前三行与我要制作的宏不同。我将其包括在内是因为我不确定此语法是否适用于VBA。

关于如何解决此问题的任何想法?我愿意接受任何想法。非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解您的要求,但这是我的方法:

Private Sub Worksheet_Activate()
    ActiveSheet.Unprotect
    ActiveSheet.Cells.Locked = False                'unlock all cells initially
    For i = 1 To ActiveSheet.UsedRange.Rows.Count   'iterate through column "f"
        If IsNumeric(Cells(i, 11)) And Cells(i, 11).Value <> 0 Then
            Cells(i, 6).Locked = True               'lock cells that satisfy condition in column "k"
        Else
            Cells(i, 6).Locked = False              'unlock cells that do not satisfy condition "k"
        End If
    Next i
    ActiveSheet.Protect                             'protect to keep locked cells from editing
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim targetVal As Variant
    If Target.Column = 11 Then                      'we only care about changes in column "k"
        targetVal = Target.Value
        If IsNumeric(Evaluate(Target.Value)) And Evaluate(Target.Value) <> 0 Then  'condition
            ActiveSheet.Unprotect
            Target.Offset(0, -5).Value = targetVal  'here the formula is removed and value inserted
            Target.Offset(0, -5).Locked = True      'lock as condition satisfied
            ActiveSheet.Protect
        Else
            ActiveSheet.Unprotect
            Target.Offset(0, -5).Formula = "=IF(AND(K" & Target.Row & "<>0,K" & Target.Row & "<>""Actual finish""),K" & Target.Row & ","""")"
            'inserted formula as this is what you intended? should display empty cell
            Target.Offset(0, -5).Locked = False     'can be edited, but edit will clear formula
            'although formula is removed, if the condition is satisfied in the future, value in "k" will be inserted
            ActiveSheet.Protect
        End If
    End If
End Sub

我不知道在单元格中键入新值时不覆盖公式的方法,但是VBA可以通过“更改侦听器”来跟踪它。无论如何,请简短浏览一下以上代码的作用:

1)我们禁止用户更改满足条件的单元格的内容,因此我们使用了保护属性。我们首先需要解锁所有单元并仅锁定不满足条件的单元。

2)我们侦听“ K”列中的更改,如果触发了任何更改,我们将更改“ F”列中单元格的内容,并根据“ K”列中满足的条件进行锁定或解锁。

由于我可能尚未完全理解问题,我的答案可能无法完全回答问题,但我希望至少可以以此为起点。祝你好运!