首页 > 解决方案 > 在 Excel (VBA) 中使用 Vlookup 实现

问题描述

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

创建“vf”的公式:

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

Sheet1中的表1:

在此处输入图像描述

Sheet2中的表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$2:$K$7, i, FALSE) * v0 * v1 * (1/(1+v3)**(i-1));
        }      
    }
    else {
        vf += vlookup(v4, Sheet2!$A$2:$K$7, 2, FALSE) * v0 * v1 * v5;
    }
}

标签: excelvbavlookup

解决方案


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

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

  2. 单击插入模块

  3. 编写以下代码:

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


推荐阅读