Excel vba单元格值取决于其他单元格

Excel vba单元格值取决于其他单元格,excel,excel-formula,vba,Excel,Excel Formula,Vba,好的 我正试图弄明白我怎样才能用公式来做这件事。 细胞数量 b单元 单元c单价 单元b的单元d。 所以 细胞a。b单元。细胞c。细胞d。细胞e 100克200公斤20 如果在单元格b中选择了克,而单元格d中选择了克。kg则单元格e必须是单元格c乘以1000乘以单元格a 我有Excel中的公式,但想把它放在vba中。对于删除等意外情况更安全 这是我的代码,运行良好。 如何将其放入vba编辑器中 =(IF(B4="Gr",(A4*1),IF(B4="Ml", (A4*1),IF(B4="Pak

好的

我正试图弄明白我怎样才能用公式来做这件事。 细胞数量 b单元 单元c单价 单元b的单元d。 所以 细胞a。b单元。细胞c。细胞d。细胞e 100克200公斤20 如果在单元格b中选择了克,而单元格d中选择了克。kg则单元格e必须是单元格c乘以1000乘以单元格a 我有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()
放入单元格在功能上应等同于将该精确公式放入单元格,第二个公式也应如此。注意:如果按此方法进行操作,则向下复制公式时,公式的引用不会自动更新,单元格引用“B4”等会硬连接到公式中

我没有测试上面的内容,但是它编译得很好,并且完全符合您的逻辑。如果它不适合你的需要,考虑使用@ VPATET.E/P>的优秀建议。 编辑时这里有一个更灵活的版本:

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)
这将是同等的。此外,当公式向下复制一个范围时,对
A4
B4
D4
的引用将按预期更新

进一步编辑时如果您想继续使用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
在上面,为了可读性,我分阶段构建了公式字符串。你不需要这样做,但是结果会,嗯,不那么可读


并不是说,如果希望引号出现在字符串中,则必须将其加倍(使用
而不是
)这样VBA就可以判断整个字符串不应该在那里结束。

我在单元格中有它。但有时会发生意外,我会删除这个公式。使用VBA更安全,我想你可以做一些类似于
Range(“H10”)。formula=“=你的函数“
您可以保护包含公式的单元格,以防止意外删除。如果您想走VBA路线,那么将公式扔掉并创建一个等效但更可读的VBA函数会更有意义。VBA的主要优点是,它允许您清楚地阐明计算的逻辑,而无需使用嵌套很深、可读性不强的工作表公式。为什么要放弃VBA的主要优势?防止意外删除似乎不是一个足够的动机,我已经试了两天了。是的,我想要相同的计算,但用vba。但无论我多么努力地寻找,我什么也找不到。我已经尝试过有条件的if-else语句。我尝试了多少,它变得多么混乱。所以我向你们求助,非常感谢你们。我到家后再试试这些建议。我可以使用动态范围来代替引用单元格吗?@Erol在我的方法中,您需要使用
Application.Caller
(包含公式的单元格)的偏移量。更直截了当的想法是让函数接受参数,这样像
G10
这样的东西就不会被硬连接,而是被传递给函数。然后单击这些单元格,将其输入公式。我将编辑我的问题以说明这是如何工作的。循环引用不在VBA中,而是在如何使用公式中。例如,
A4
中必须有公式,这取决于您在.Range(“H10”)中输入公式的单元格(直接或间接)。公式=“=(如果(B4=“Gr”),(A4*1),如果(B4=“Ml”,(A4*1),如果(B4=“Paket”,(A4*D4),如果(B4=“Yk”,(A4*12),如果(B4=“Ck”,(A4*8),如果(B4=“Adet”,(A4*1),如果(B4=“Kg”,(A4*1000),如果(B4*Lt)”,(A4*7)))))))*D4)“这一个给了我一个错误。这看起来像是你用来实现@VBAPete想法的VBA。如果是这样的话,那就不会像那样工作了,因为1)你在
=
中有一个杂散的=和2)你没有逃过引号。