更好的方法来实现计费表?

时间:2015-11-27 14:12:31

标签: excel vba excel-formula

我正在尝试制作帐单表。它具有Cust_ID(唯一字段),区域,模式,重量,金额列。我有不同的Excel工作簿,每个客户都有费率和区域。数量取决于区域,重量和&区。

现在,假设我有10个客户,他们分别有10个区域,分别为10种模式和10种重量板块。我从中获得金额:

=INDIRECT("'[Customer_Rate_2015.xlsx]"&A2&"'!"&O2)

A2 - 客户ID,O2 - 计费表中的单元格,根据模式引用权重区域并返回单元格地址

选择O2:

=IF(F2="air",IF(E2=0.1,CONCATENATE(LEFT(RIGHT(CELL("address",'[Customer_Rate_2015.xlsx]1001'!$E$3),3),1),RIGHT(CELL("address",'[Customer_Rate_2015.xlsx]1001'!$E$3),1)),""))

现在,对于每种模式和区域和重量,都有单独的费率 我必须通过上面的公式获得每个细胞的价值。

是否有更好的或替代的方式,因此可以选择间接公式中O2的值,所以我不必编写那些100多个IF语句?

1 个答案:

答案 0 :(得分:0)

使用数据库存储数据,然后使用“区域”,“重量”和“模式”参数创建查询,以获取计算金额的速率。如果你不知道如何使用数据库,学习,它并不难,它是你可以给自己的最好的礼物,你可以亲吻怪物嵌套if语句再见..(几乎:)

也可以使用VBA查询您的Excel工作表。

执行此操作的功能看起来像这样(需要参考 Microsoft ActiveX数据对象

Function GetRate(Weight, Zone, Mode)
    On Error GoTo errorhandler
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    Set rs = New ADODB.Recordset

    con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=""Excel 8.0;HDR=Yes;"";"

    SqlState = "Select Rate FROM [MyRatesSheet$] WHERE [Zone]=" & Zone & _
              " AND [Weight]=" & Weight & _
              " AND [Mode]='" & Mode & "'"

    rs.Open SqlState, con, adOpenForwardOnly, adLockReadOnly

    If Not rs.EOF Then GetRate = rs(0)

    GoTo cleanup
errorhandler:
    GetRate = Err.Description
cleanup:
    If rs.State = adStateOpen Then rs.Close
    If con.State = adStateOpen Then con.Close
    If Not rs Is Nothing Then Set rs = Nothing
    If Not con Is Nothing Then Set con = Nothing
End Function

您将在工作表中使用

引用
=GetRate(H18,I18,J18)