Excel VBA单元格的值取决于其他单元格

大家好,

我想弄清楚如何把一个formule做到这一点。 小区数量小区b小区小区c单位价格小区d小区的单位b。 所以Cell a。 小区b。 小区c。 细胞d。 细胞e 100克。 200公斤。 20如果在单元格b中select了单元格并且单元格d是。 公斤,那么单元格e必须是单元格c由1000乘以单元格我有Excel中的表单,但要放在vba中。 对于删除等事故更安全。

这是我的代码,运作良好。 我怎样才能把这个在vba编辑器?

=(IF(B4="Gr",(A4*1),IF(B4="Ml", (A4*1),IF(B4="Paket", (A4*D4),IF(B4="Yk", (A4*12),IF(B4="Ck", (A4*8),IF(B4="Adet",(A4*1), IF(B4="Kg",(A4*1000),IF(B4="Lt", (A4*1),IF(B4>7,""))))))))*D4)) =IF(G10="Gr", ((F10*1)*E10), IF(G10="Ml",((F10/16)*E10), IF(G10="Paket",(F10*E10), IF(G10="Yk",((F10/32)*E10), IF(G10="Ck",((F10/128)*E10), IF(G10="Adet",((F10*1)*E10), IF(G10="Kg",((F10/1000)*E10), IF(G10="Lt",((F10/1000)*E10), IF(G10="","0"))))))))) 

VBA函数IIf是直接对应于工作表函数IF函数。 因此,如果你想要这些确切公式的文字VBA转录,它会看起来像这样:

 Function FirstFormula() As Variant FirstFormula = (IIf(Range("B4").Value = "Gr", (Range("A4").Value * 1), IIf(Range("B4").Value = "Ml", _ (Range("A4").Value * 1), IIf(Range("B4").Value = "Paket", _ (Range("A4").Value * Range("D4").Value), IIf(Range("B4").Value = "Yk", _ (Range("A4").Value * 12), IIf(Range("B4").Value = "Ck", _ (Range("A4").Value * 8), IIf(Range("B4").Value = "Adet", (Range("A4").Value * 1), _ IIf(Range("B4").Value = "Kg", (Range("A4").Value * 1000), IIf(Range("B4").Value = "Lt", _ (Range("A4").Value * 1), IIf(Range("B4").Value > 7, "", False)))))))) * Range("D4").Value)) End Function Function SecondFormula() As Variant SecondFormula = IIf(Range("G10").Value = "Gr", ((Range("F10").Value * 1) * Range("E10").Value), _ IIf(Range("G10").Value = "Ml", ((Range("F10").Value / 16) * Range("E10").Value), _ IIf(Range("G10").Value = "Paket", (Range("F10").Value * Range("E10").Value), _ IIf(Range("G10").Value = "Yk", ((Range("F10").Value / 32) * Range("E10").Value), _ IIf(Range("G10").Value = "Ck", ((Range("F10").Value / 128) * Range("E10").Value), _ IIf(Range("G10").Value = "Adet", ((Range("F10").Value * 1) * Range("E10").Value), _ IIf(Range("G10").Value = "Kg", ((Range("F10").Value / 1000) * Range("E10").Value), _ IIf(Range("G10").Value = "Lt", ((Range("F10").Value / 1000) * Range("E10").Value), _ IIf(Range("G10").Value = "", "0", False))))))))) End Function 

在单元格中放置=FirstFormula()应该在function上等同于将精确公式放置在单元格中,对于第二个公式也是如此。 请注意,如果走这条路线,那么当您复制公式时,公式的引用不会自动更新,单元格引用“B4”等硬连接到它。

我没有testing过上面的代码,但是它编译得很好,它完全遵循你的逻辑。 如果不符合您的需求,请考虑使用@VBAPete的出色build议。

在编辑这里是一个更灵活的版本:

 Function FirstFormula(A As Range, B As Range, D As Range) As Variant FirstFormula = (IIf(B.Value = "Gr", (A.Value * 1), IIf(B.Value = "Ml", _ (A.Value * 1), IIf(B.Value = "Paket", _ (A.Value * D.Value), IIf(B.Value = "Yk", _ (A.Value * 12), IIf(B.Value = "Ck", _ (A.Value * 8), IIf(B.Value = "Adet", (A.Value * 1), _ IIf(B.Value = "Kg", (A.Value * 1000), IIf(B.Value = "Lt", _ (A.Value * 1), IIf(B.Value > 7, "", False)))))))) * D.Value)) End Function Function SecondFormula(E As Range, F As Range, G As Range) As Variant SecondFormula = IIf(G.Value = "Gr", ((F.Value * 1) * E.Value), _ IIf(G.Value = "Ml", ((F.Value / 16) * E.Value), _ IIf(G.Value = "Paket", (F.Value * E.Value), _ IIf(G.Value = "Yk", ((F.Value / 32) * E.Value), _ IIf(G.Value = "Ck", ((F.Value / 128) * E.Value), _ IIf(G.Value = "Adet", ((F.Value * 1) * E.Value), _ IIf(G.Value = "Kg", ((F.Value / 1000) * E.Value), _ IIf(G.Value = "Lt", ((F.Value / 1000) * E.Value), _ IIf(G.Value = "", "0", False))))))))) End Function 

然后在工作表中,例如,您可以使用

 =FirstFormula(A4,B4,D4) 

这将是等同的。 此外,当公式被复制到范围内时,对A4B4D4的引用将按预期进行更新。

进一步编辑如果你想追求使用VBA直接在单元格中插入公式的想法,你可以使用类似于:

 Dim form As String form = "=IF(G10=""Gr"", ((F10*1)*E10)," form = form & "IF(G10=""Ml"",((F10/16)*E10)," form = form & "IF(G10=""Paket"",(F10*E10)," form = form & "IF(G10=""Yk"",((F10/32)*E10)," form = form & "IF(G10=""Ck"",((F10/128)*E10)," form = form & "IF(G10=""Adet"",((F10*1)*E10)," form = form & "IF(G10=""Kg"",((F10/1000)*E10)," form = form & "IF(G10=""Lt"",((F10/1000)*E10)," form = form & "IF(G10="""",""0"")))))))))" Range("H10").Formula = form 

在上面我为了可读性分阶段地build立了公式string。 你不需要这样做,但结果是,可读性会降低。

不是如果你想要string中出现引号,你必须将它们加倍(使用""而不是" ),以便VBA可以告诉整个string不应该在那里结束。