几年前我转用 Numbers 后,现在又开始学习 Microsoft Excel。我有一个想法,想付诸实践,但做起来却相当困难。我不确定这是否可行,但如果我没记错的话,应该是可以的。
假设我有一份出发地和目的地的清单,每个出发地和目的地都有自己的关税。
CGK-SIN = 0.25 美元
SIN-CGK = 0.50 美元
CGK-KUL = 1.10 美元
KUL-CGK = 1.50 美元
KUL-SIN = 0.75 美元
SIN-KUL = 0.85 美元
以上是关税表的示例。我知道我可以在单独的表格中准备此表格并参考此表格,但是我在尝试为两个单元格(出发地、目的地)设置条件以获取费率时遇到了麻烦。
我希望关税字段能够比较原产地和目的地字段的数据。有点像:
if
origin = "CGK"
destination = "SIN"
then
tariff = "$0.25"
Elseif...
等等等等。我希望我已经清楚地表达了我想要实现的目标。如果代码有误,请见谅,我已经很多年没有写代码了!(小时候自己思考过 VB 和 C++,但不是很深入)
任何有关此事的建议都将不胜感激。
答案1
在 H1 中将是:
=INDEX($B$2:$D$4,MATCH(G1,$A$2:$A$4,0),MATCH(F1,$B$1:$D$1,0))
可以简单地复制下来...
不需要 VBA......但是如果您希望通过 VBA 来获取 UDF,则有两种方法可以做到。
#1 作为 Symbiotic sheet/VBA
Public Function getTarif(source, dest) As Double
With Sheet1
source = Application.Match(source, .Range("B1:D1"), 0)
dest = Application.Match(dest, .Range("B1:D1"), 0)
If IsNumeric(source) And IsNumeric(dest) Then getTarif = .Cells(source + 1, dest + 1).Value
End With
End Function
#2 完整的 VBA
Public Function getTarif(source, dest) As Double
Dim a, b
a = Array("CGK", "SIN", "KUL")
b = Array(Array(0, 0.5, 1.5), _
Array(0.25, 0, 0.75), _
Array(1.1, 0.85, 0))
source = Application.Match(source, a, 0) - 1
dest = Application.Match(dest, a, 0) - 1
If IsNumeric(source) And IsNumeric(dest) Then getTarif = b(source)(dest)
End Function
#1 需要像图中这样的表格(在工作表中,代号为 Sheet1,可以更改)
#1 和 #2 都不区分大小写,因此=getTarif("siN","kUl")
仍然会输出 0.85。