在 Excel (VBA) 中使用 Vlookup 实现

Actualization with Vlookup in Excel (VBA)

我有两个表,Sheet2 中的 table2 和 Sheet1 中的 table1。我需要计算“vf”列 在表 1 中。所有值都是随机的,除了 vf 是所有其他值的函数(下面的公式)。实际公式工作正常,但我必须将 table2 扩大到第 100 列(在本例中使用其他随机值)。问题是:当我必须向 table2 添加 100 列时,如何重写“vf”的公式以使其更短更易于理解?

创建“vf”的公式:

=IF(AND(A2="s2",E2>1),(C2*D2*VLOOKUP(G2,Sheet2!$A:$K,2,FALSE)+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,3,FALSE)*(1/(1+F2)^2)*(IF(E2>=2,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,4,FALSE)*(1/(1+F2)^3)*(IF(E2>=3,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,5,FALSE)*(1/(1+F2)^4)*(IF(E2>=4,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,6,FALSE)*(1/(1+F2)^5)*(IF(E2>=5,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,7,FALSE)*(1/(1+F2)^6)*(IF(E2>=6,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,8,FALSE)*(1/(1+F2)^7)*(IF(E2>=7,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,9,FALSE)*(1/(1+F2)^8)*(IF(E2>=8,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,10,FALSE)*(1/(1+F2)^9)*(IF(E2>=9,1,0))+C2*D2*VLOOKUP(G2,Sheet2!$A:$K,11,FALSE)*(1/(1+F2)^10)*(IF(E2>=10,1,0))),C2*D2*H2*VLOOKUP(G2,Sheet2!$A:$K,2,FALSE))

工作表 1 中的表 1:

工作表 2 中的表 2:

要翻译成 VBA 的伪代码(c++ 风格):

double VF(std::string c1, int year, double v1, double v2, double v3, double v4, double v5) {

    double vf = 0; //initialize vf
    int initialtableLookUpColumnNo = 2;

    if ((c1 == "s2") && (v2 > 1)) {   
        for (int i=initialtableLookUpColumnNo; i=v2+1; i++) {
            vf += vlookup(v4, Sheet2!$A:$K, i, FALSE) * v0 * v1 * (1/(1+v3)**(i-1));
        }      
    }
    else {
        vf += vlookup(v4, Sheet2!$A:$K, 2, FALSE) * v0 * v1 * v5;
    }
}

首先,您需要从公式中删除 vlookup。您可以将它们放在新的单独列中。然后通过将 vlookups 替换为对新列的引用来重写您的公式。

在此之后,将您的新公式转换为内置函数。

您可以将此函数命名为 Vf 或您喜欢的名称。在 excel sheet 中删除您的长公式并使用其参数键入新函数,例如:=Vf(A2,C2,D2,G2,F2)

好的,这里最好的解决方案是用 VBA 制作一个 UDF 函数。对于像我这样不了解 VBA 的人,我将 post 详尽的步骤和代码。

  1. 点击Alt+11进入Visual Basic for Applications

  2. 单击插入模块

  3. 编写如下代码:

请注意,函数中参数的顺序由您自行决定,您还可以指定参数的类型,例如:c1 为 String,v2 为 Integer,v5 为 Double。