-2

由于严重缺乏知识,我做了一个长得可笑的函数,以便进行计算。问题是它对于 Excel 来说太长了,我尝试在网上查看如何在 VBA 中创建一个引用我的函数的新函数。我对此非常迷茫,任何帮助都会很棒。这个函数太乱了,不能在这里发布(它有 30k 个字符长)。

好的,就这样 - 这是函数的一部分: =+IF(ISERROR(IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,Selection!$B) $4:Selection!$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,Selection!$B$5:Selection!$E$5),IF (LEFT(C12,FIND(" ",C12,1))=$C$4,SUMPRODUCT(P12:S12,Selection!$B$6:Selection!$E$6),IF(LEFT(C12,FIND(" ", C12,1))=$C$5,SUMPRODUCT(P12:S12,Selection!$B$7:Selection!$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12 :S12,Selection!$B$8:Selection!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:Selection!$E $9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:Selection!$E$10),SUMPRODUCT(P12:S12,Selection!$B $11:Selection!$E$11)))))))),1,IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,Selection!$B $4:选择!$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,Selection!$B$5:Selection!$E$5),IF(LEFT(C12,FIND(" ",C12,1)) =$C$4,SUMPRODUCT(P12:S12,Selection!$B$6:Selection!$E$6),IF(LEFT(C12,FIND(" ",C12,1))=$C$5,SUMPRODUCT(P12:S12 ,Selection!$B$7:Selection!$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12:S12,Selection!$B$8:Selection!$E$8) ,IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:Selection!$E$9),IF(RIGHT(C12,LEN($C$8) )=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:Selection!$E$10),SUMPRODUCT(P12:S12,Selection!$B$11:Selection!$E$11)))))))) )SUMPRODUCT(P12:S12,Selection!$B$8:Selection!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:Selection !$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:Selection!$E$10),SUMPRODUCT(P12:S12,Selection !$B$11: 选择!$E$11)))))))))SUMPRODUCT(P12:S12,Selection!$B$8:Selection!$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:Selection !$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:Selection!$E$10),SUMPRODUCT(P12:S12,Selection !$B$11: 选择!$E$11)))))))))

4

3 回答 3

1

要回答您的问题“可以在 VBA 中完成吗?”,答案是肯定的。如果你可以用excel函数来做,你可以用VBA来做。虽然可能存在功能上的缺点,并且对函数进行编码将具有完全不同的语法(尽管使用谷歌搜索通常很容易翻译)。

不过,在使用 VBA 之前要考虑的一件事是,该函数是否可以分解为多个单元格?这可能适合您的需求并绕过字符限制,但如果它的长度为 30k 个字符,这可能不切实际甚至不可能做到这一点。

我建议您从字面上搜索“Excel 函数 XXXX 的 VBA 等效项”开始,为您使用的每个 excel 函数。然后从中间的括号内向外工作,以与 Excel 函数相同的顺序对输入执行操作。VBA 函数和 Excel 函数的主要区别在于,您可以逐行对同一个变量执行操作,而不是使用复杂的操作顺序。

例如,您可以输入:

Function Your_Function_Name1(Cell_one As Range, Cell_two As Range, _
                            Cell_three As Range, Cell_four As Range) As Double
    If Cell_four > 3 Then
        If Cell_three > 3 Then
            Your_Function_Name1 = (Cell_one.Value + 5) * (Cell_two.Value + 3)
        Else
            Your_Function_Name1 = (Cell_one.Value - 5) * (Cell_two.Value + 3)
        End If
    Else
        If Cell_three > 3 Then
            Your_Function_Name1 = (Cell_one.Value + 5) * (Cell_two.Value - 3)
        Else
            Your_Function_Name1 = (Cell_one.Value - 5) * (Cell_two.Value - 3)
        End If
    End If
End Function

并打电话给=Your_Function_Name1(B3,B2,A2,A1)。但它也是完全合法的,而且通常更容易做到这一点:

Function Your_Function_Name(Cell_one As Range, Cell_two As Range, _
                            Cell_three As Range, Cell_four As Range) As Double
    If Cell_three > 3 Then
        Your_Function_Name = Cell_one.Value + 5
    Else
        Your_Function_Name = Cell_one.Value - 5
    End If

    If Cell_four > 3 Then
        Your_Function_Name = Your_Function_Name * (Cell_two.Value + 3)
    Else
        Your_Function_Name = Your_Function_Name * (Cell_two.Value - 3)
    End If

End Function

这两个函数将以相同的方式调用并产生相同的结果。

我认为这应该足以让您入门,尽管一旦您进入并开始调试,您最终可能会发布另一个或两个问题,但至少您会有特定的代码要询问。VBA 一开始很难,但值得你花时间去做。

祝你好运!

于 2015-03-12T22:43:30.100 回答
0

以下指南是重构现有代码和将来编写新代码的好方法:

对于每个具有或大到足以具有描述性注释的代码块,创建一个子例程并用描述性注释命名(在PascalCase中)。识别所有局部变量并在新的子程序中重新声明它们。将所有全局值作为命名参数传递。

冲洗并重复,直到所有子程序少于 40 行左右。

于 2015-03-12T22:44:13.557 回答
0

IFERROR您可以通过使用而不是也将您的功能减半IF(ISERROR ,您Selection!$B$4:Selection!$E$4可以减少到Selection!$B$4:$E$4

=IFERROR(IF(LEFT(C12,FIND(" ",C12,1))=$C$2,SUMPRODUCT(P12:S12,Selection!$B$4:$E$4),IF(LEFT(C12,FIND(" ",C12,1))=$C$3,SUMPRODUCT(P12:S12,Selection!$B$5:$E$5),IF(LEFT(C12,FIND(" ",C12,1))=$C$4,SUMPRODUCT(P12:S12,Selection!$B$6:$E$6),IF(LEFT(C12,FIND(" ",C12,1))=$C$5,SUMPRODUCT(P12:S12,Selection!$B$7:$E$7),IF(RIGHT(C12,LEN($C$6))=$C$6,SUMPRODUCT(P12:S12,Selection!$B$8:$E$8),IF(RIGHT(C12,LEN($C$7))=$C$7,SUMPRODUCT(P12:S12,Selection!$B$9:$E$9),IF(RIGHT(C12,LEN($C$8))=$C$8,SUMPRODUCT(P12:S12,Selection!$B$10:$E$10),SUMPRODUCT(P12:S12,Selection!$B$11:$E$11)))))))),1)

现在这对我有用,但你的测试LEFT(C12,FIND(" ",C12,1))=$C$2 似乎很可疑。如果 C12 在 House 中包含 Cat,则左侧将评估为“Cat”,末尾有一个空格。这在您测试的单元格最后包含一个空格时会很好,但我猜他们不会。您可能想要使文本 LEFT(C12,FIND(" ",C12,1)-1)=$C$2

于 2017-10-29T18:46:38.017 回答