Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何通过;如果;结果发送到另一个单元格_Excel_Vba_If Statement - Fatal编程技术网

Excel 如何通过;如果;结果发送到另一个单元格

Excel 如何通过;如果;结果发送到另一个单元格,excel,vba,if-statement,Excel,Vba,If Statement,我正在创建包含以下列的出差成本表: “A”=状态“B”=计划成本(其他列现在无关紧要) 列“A”具有下拉列表,其中包含“计划、完成、取消”值。 “B”列单元格中始终包含一个数字。(因此在B列中,我无法编写任何函数,因为它将覆盖价格) 当列“a”中的状态更改为“已取消”时,我需要的是一个标准或代码,然后旁边的计划成本变为0或清除单元格 我开始用一个支持表来做这件事,在支持表中我写了一个简单的IF语句(在sheet2随机单元格中)=IF(A2=“cancelled”;B2=0;”。但这样做是行不通的

我正在创建包含以下列的出差成本表:
“A”=状态
<代码>“B”=计划成本(其他列现在无关紧要) 列“A”具有下拉列表,其中包含“计划、完成、取消”值。 “B”列单元格中始终包含一个数字。(因此在B列中,我无法编写任何函数,因为它将覆盖价格)

当列“a”中的状态更改为“已取消”时,我需要的是一个标准或代码,然后旁边的计划成本变为0或清除单元格

我开始用一个支持表来做这件事,在支持表中我写了一个简单的IF语句(在sheet2随机单元格中)
=IF(A2=“cancelled”;B2=0;”
。但这样做是行不通的。简单地给随机单元一个错误的结果

任何帮助都将不胜感激。

=if(A2=“cancelled”;B2=0;”)
:两件事

您使用的是分号而不是逗号
此外,如果此公式进入B列,则不需要显式声明
B2=0
,如前所述:如果没有VBA,则无法更改单元格。在工作表的“代码”窗格中需要类似的内容:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Cells.Count = 1 And Target.Column = 1 Then
    If Target.Value = "cancelled" Then Target.Offset(0, 1).Value = 0
  End If
End Sub
或者(如前所述)使用以下公式以“助手列”的方式进行操作:

=$B2*($A2<>"cancelled")
=$B2*($A2“已取消”)

将此公式放在C2中,C2将根据需要显示结果。

您可以创建第三列(perhabs hidden),其中保存当前在“B”中的值。然后使用“B”列中的函数
=IF(A2=“cancelled”;0;C2)

我认为,在其他一些单元格中,仅使用公式无法完全满足您的要求:

“=if(A2=”取消;B2=0;“”)如果A2恰好被取消,则如果B2等于0,则只返回“question”的逻辑值。这不是你想要的

您可以创建一个VBA代码,该代码将在工作表中每次发生更改时执行

按Alt+F11,然后双击所需功能表并添加代码

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 And Target.Value = "cancelled" Then
    Target.Offset(0, 1) = 0
End If

End Sub
但我强烈建议不要使用此解决方案,因为现在您只需用值0覆盖列B中单元格中的任何内容。因此,您将丢失此单元格中以前的数据

我要做的是:

1) 如果B列中的数据是从其他地方输入的(不是手动写入的),那么我将在那里编写函数,即“=If(A2=“cancelled”;0;get_original_value)”

2) 如果输入是手动的,我会添加另一列以保持“真实值”,这将与第1点的函数一样工作)

3) 或者,您可以使用条件格式,仅根据A列中的值更改B列中单元格的显示,而不是2) 例如,你可以在这里开始阅读
最有可能的情况是,您计算了一些聚合(如总和),并且为了进行此计算,希望取消的值为0。通过仅更改显示,该值将保持非零,因此您必须使用SUMIF而不是常规求和,并排除取消的值,例如=SUMIF(A:A;“取消”;B:B)。

分号和逗号由客户端的区域设置定义。如果无法键入B列,我认为没有VB,您将无法覆盖它。您可以做的是,添加一个额外的列,并执行类似于
=IF($A2=“cancelled”;B2*0;B2)
的操作来显示更新的成本。
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 And Target.Value = "cancelled" Then
    Target.Offset(0, 1) = 0
End If

End Sub