【问题标题】:Cell with formula and possible custom input带有公式和可能的自定义输入的单元格
【发布时间】:2018-05-15 17:57:00
【问题描述】:

我有一个带有基于另一个单元格的公式的单元格。这个另一个单元格是一个数据验证单元格,用户可以在下拉列表中选择各种选项。

举个例子:

如果用户在下拉列表中选择“A”,则公式计算“1+1”。

如果用户在下拉列表中选择“B”,则公式计算“1+2”。

下拉列表中的最后一个选项是“自定义”。如果选择此选项,则用户应插入自定义数字。

但是,如果用户返回并在下拉菜单中选择“A”,则应保留公式并计算“1+1”。

我已经查看了一些 worksheet_change,但我无法弄清楚如何去做。

提前致谢!

【问题讨论】:

  • 假设您的数据验证单元格是 A2,那么在您的单元格中包含一个带有公式的 OR 语句应该可以解决问题,即 "IF(OR(A2="A",A2="Custom" ),1+1,1+2)"
  • @JK2017,我相信你的公式不起作用,因为 OP 提到如果选择自定义,它应该提示用户输入自定义数字,如果用户你的公式会给出相同的结果选择 A 或自定义...
  • @Xabier - 你是绝对正确的,对不起,我错过了“自定义”需要用户输入的地方。好的,所以为了保持这个 VBA-free,你可以让单元格 B2 成为用户需要为“自定义”提供值的单元格,然后将公式更改为:“=IF(A2="A",1+1,IF (A2="B",1+2,​​1+B2))"

标签: vba excel


【解决方案1】:

使用 Worksheet_Change 事件,您可以执行以下操作,这假设您的数据验证列表位于单元格 B1 中,并且您希望结果位于 C1 中:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet: Set ws = Sheets("Sheet1")
Dim CustomNumber As Variant
If Target.Address = "$B$1" Then
    Select Case ws.Range("B1").Value
        Case "A"
            ws.Range("C1").Formula = "=1+1"
        Case "B"
            ws.Range("C1").Formual = "=1+2"
        Case "C"
            ws.Range("C1").Formula = "=1+3"
        Case "D"
            ws.Range("C1").Formula = "=1+4"
        Case "E"
            ws.Range("C1").Formula = "=1+5"
        Case "Custom"
            CustomNumber = InputBox("Please enter a custom number", "Custom")
            If IsNumeric(CustomNumber) Then
                ws.Range("C1").Formula = "=1+" & CustomNumber
            Else
                MsgBox "Please enter a number", vbCritical = vbOKOnly
                Exit Sub
            End If
    End Select
End If
End Sub

编辑:

根据 cmets,我已将答案更新为只有两个案例,使用自定义数字或使用公式返回的值,这假设您的查找公式在 A1 中,根据需要修改您的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet: Set ws = Sheets("Sheet1")
Dim CustomNumber As Variant
If Target.Address = "$B$1" Then
    Select Case ws.Range("B1").Value
        Case "Custom"
            CustomNumber = InputBox("Please enter a custom number", "Custom")
            If IsNumeric(CustomNumber) Then
                ws.Range("C1").Formula = "=1+" & CustomNumber
            Else
                MsgBox "Please enter a number", vbCritical = vbOKOnly
                Exit Sub
            End If
        Case Else 'if your lookup formula is in A1, then the code below will add one to the value from the formula
            ws.Range("C1").Formula = "=1+" & Val(ws.Range("A1").Value)
    End Select
End If
End Sub

更新:

在 OP 的进一步 cmets 之后,我更新了代码以包含公式返回的查找值:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet: Set ws = Sheets("Sheet1")
Dim CustomNumber As Variant
If Target.Address = "$B$1" Then
    Select Case ws.Range("B1").Value
        Case "Custom"
            CustomNumber = InputBox("Please enter a custom number", "Custom")
            If IsNumeric(CustomNumber) Then
                ws.Range("C1").Formula = "=1+" & CustomNumber
            Else
                MsgBox "Please enter a number", vbCritical = vbOKOnly
                Exit Sub
            End If
        Case Else 'if your lookup formula is in A1, then the code below will add one to the value returned by the LookUp
            LookUpValue = "Ground type"
            LookUpTable = "Ground_type_table[#Alle]"
            ValueReturned = Application.WorksheetFunction.VLookup(LookUpValue, LookUpTable, 4, False)
            ws.Range("C1").Formula = "=1+" & Val(ValueReturned)
    End Select
End If
End Sub

【讨论】:

  • 非常感谢。我几乎就在那里。然而,上面只是一个例子,实际上公式是一个查找,所以实际上我只需要 2 个案例,如果“自定义”或“自定义”以外的任何其他内容,因为它会从表中查找正确的值。
  • @DFH 我已经更新了我的答案以反映您的 cmets,如果有帮助,您能否也将我的回复标记为答案?谢谢。 :)
  • 你好 Xabier 答案非常重要。但是,你能帮我解决最后一个小障碍吗?保持你的例子。首先:“B1”是一个数据验证下拉列表,“C1”是我想要结果的单元格。但是,“C1”也是查找单元格。因此,如果我在“B1”的下拉列表中选择“A”,则“C1”会吐出“48”(或任何查找内容)。如果我在“B1”的下拉列表中选择“B”,那么“C1”会吐出“79”。如果我在“B1”中选择“自定义”,那么“C1”应该不再使用查找,而是自定义输入的数字。我想我们已经很接近了,但你能帮帮我吗?
  • @DFH,最好将查找公式嵌入代码中,因此如果您可以提供您正在使用的实际公式,那么我可以更新我的答案以使用相同的公式选择了“自定义”以外的值。
  • 丹麦语:=LOPSLAG(Ground_type;Ground_type_table[#Alle];4;falsk) 英语(用逗号代替分号):= vlookup(Ground_type,Ground_type_table[#Alle],4 ,false) 如您所见,我使用已定义的命名范围和表。
【解决方案2】:

如果允许硬编码您的答案而不是我建议的(不带 VBA):

=IF(A1="A";1;IF(A1="B";2;A1))+1

更好: 您在任何其他地方都有您的下拉列表,并且您可以像表格一样完成它:

一个 | 1

B | 2

如果您使用简单的 VLOOKUP,则可以有无限多的选项,例如:

=IFERROR(VLOOKUP(A1;A2:B3;2;WRONG);A1)+1

这可能在单元格 B2 中。 但是在这种情况下,您的行为可能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多