从Excel 2010中的公式更新任何单元格

时间:2011-10-31 06:27:29

标签: excel vba

说我有公式:V = IR

在Excel中,我需要计算这种可能的任何组合。

例如,

  • 如果给出I和R的值,我需要在我有V的单元格中显示V的结果(用户将其保持为0或空白以表示他想要找到的值)< / LI>

之前的Excel表格:

+------+---------+------+
| V    |   I     |   R  |
+------+---------+------+
| 0    |   1     |   10 |
+------+---------+------+

Excel表格之后:

+------+---------+------+
| V    |   I     |   R  |
+------+---------+------+
| 10   |   1     |   10 |
+------+---------+------+
  • 如果给出V和R的值,我需要在我拥有的单元格中显示I的结果(用户保持0或空白以表示他想要找到的值)< / LI>

之前的Excel表格:

+------+---------+------+
| V    |   I     |   R  |
+------+---------+------+
| 10   |   0     |   10 |
+------+---------+------+

Excel表格之后:

+------+---------+------+
| V    |   I     |   R  |
+------+---------+------+
| 10   |   1     |   10 |
+------+---------+------+

编写一个函数来检查一个单元格是否为0并更新另一个“回答”单元格(除了V,I,R;此单元格明确地调用此函数)与期望值没有问题。

挑战在于除了额外的“回答”单元格之外,还有空白单元格(我们需要从提供的其他变量计算的值)更新。

Excel不允许公式更新任何单元格,这需要一些解决方法 - 我无法想到。

我如何使这项工作?

2 个答案:

答案 0 :(得分:1)

我会给你一个关于如何解决这个问题的提示......:^)不要试图在单元格中输入公式,而是编写一个VBA脚本,找出要应用的公式的三种排列中的哪一种给定V = IR,基于哪个单元格为空。所以你的逻辑的第一部分看起来像这样:

if cellV == "" and cellI <> "" and cellR <> "" then
   cellV = cellI * cellR 
elseif cellV <> "" and cell I = "" and cellR <> "" then
   cellI = cellV/cellR 
elseif cellV <> "" and cell I<> "" and cellR = "" then
   cellR = cellV/cellR
else
   alert("must provide at least two out of three values before evaluation");

并将此附加到您喜欢的任何事件。例如,一个事件检查是否指定了3个值中的2个(如onUpdate或其他)

请注意,这只是伪代码。

答案 1 :(得分:1)

据我所知,目前还没有Excel解决方案。你必须使用VBA。

这对我有用:

Option Explicit

Sub Electricity()
    Dim nEmptyCells As Integer

    nEmptyCells = -CInt(IsEmpty(Range("Voltage"))) _
        - CInt(IsEmpty(Range("Current"))) _
        - CInt(IsEmpty(Range("Resistance")))

    If nEmptyCells = 1 Then
        If IsEmpty(Range("Voltage")) Then
            'Calculate voltage
            Range("Voltage") = Range("Current") * Range("Resistance")
        ElseIf IsEmpty(Range("Current")) Then
            'Calculate current
            Range("Current") = Range("Voltage") / Range("Resistance")
        ElseIf IsEmpty(Range("Resistance")) Then
            'Calculate resistance
            Range("Resistance") = Range("Voltage") / Range("Current")
        End If
        Range("Notification") = "Calculation successful."
    ElseIf nEmptyCells > 1 Then
        Range("Notification") = "Insufficient input."
    ElseIf nEmptyCells < 1 Then
        Range("Notification") = "Too much input. Problem is overspecified."
    End If

End Sub

请注意,我为与V,R和I对应的单元格以及向用户提供有用反馈的“通知”单元格指定了名称。如果您不想给他们起名字,那么您可以使用例如"B2"代替Voltage"等。此外,我只检查空白单元格而不是零值。我会把那部分留给你。

上述宏属于代码模块,必须手动运行。您可以在工作表上放置一个CommandButton,并使其在用户单击时运行宏。或者,如果您希望每次用户更改输入时自动运行它,您可以将其放在工作表模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("Voltage").Address _
        Or Target.Address = Range("Current").Address _
        Or Target.Address = Range("Resistance").Address Then

        Electricity

    End If
End Sub

这就是我想到的袖口。通过更多的工作,您可以使它更好,更用户友好。