提问人:C504 提问时间:1/3/2023 最后编辑:ClemsangC504 更新时间:1/3/2023 访问量:57
VBA代码在使用Index-Match-Function时无法识别表中的某些数字
VBA Code does not recognize certain numbers from table when using Index-Match-Function
问:
我有一个值表,这些值是我的 VBA - 代码中后面的长计算因素。为了提取正确的值,我在代码中使用了 index-match 函数。
但是,我不得不对代码进行一些操作,以便能够在值之间进行插值。
除非我的 RoundUp 值是 0.3 或 0.8,负值和正值,否则代码工作正常。
当 psi_up = 0.3 时,即使它在表中,也存在错误 1004。
当 psi_down = 0.3 时,没有问题,索引匹配函数不会引起问题。alpha_up = -0.3 和 -0.8 也是如此
这是我使用的代码,也是我需要从中提取值的表:
Dim alpha_0 As Double
Dim psi As Double
Dim psi_down As Double
Dim psi_up As Double
Dim alpha_down As Double
Dim alpha_up As Double
Dim xp01 As Double
Dim xp02 As Double
Dim xp1 As Double
Dim xp03 As Double
Dim xp04 As Double
Dim xp2 As Double
Dim C1_0 As Double
```
If MyA = 0 And MyB = 0 Then
psi = 0
Else
psi = MyA / MyB
End If
If My0 >= Abs(MyB) Then
alpha_0 = MyB / My0
Else
alpha_0 = My0 / MyB
End If
'Parameter to Interpolate
alpha_down = WorksheetFunction.RoundDown(alpha_0, 1)
psi_down = WorksheetFunction.RoundDown(psi, 1)
alpha_up = WorksheetFunction.RoundUp(alpha_0, 1)
psi_up = WorksheetFunction.RoundUp(psi, 1)
If psi_up = 1 Then
psi_down = 0.9
End If
If psi = 1 Then
psi_down = 0.9
End If
If psi_down = psi_up Then
psi_up = psi_down + 0.1
End If
If alpha_0 = -1 Then
alpha_down = -0.9
End If
If alpha_down = alpha_up Then
alpha_up = alpha_down - 0.1
End If
If alpha_0 = -0 Then
alpha_0 = 0
End If
' My0 = 0
If My0 = 0 Then
xp01 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_0, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp02 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_0, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_up, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
C1_0 = xp01 + (xp02 - xp01) * ((psi - psi_down) / (psi_up - psi_down))
'If My0 >= abs(MyB)
ElseIf My0 >= Abs(MyB) Then
xp01 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I50:T61"), _
Application.WorksheetFunction.Match(alpha_down, Sheets("C1,0 & C2,0").Range("I50:I61"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp02 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I50:T61"), _
Application.WorksheetFunction.Match(alpha_down, Sheets("C1,0 & C2,0").Range("I50:I61"), 0), _
Application.WorksheetFunction.Match(psi_up, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp1 = xp01 + (xp02 - xp01) * ((psi - psi_down) / (psi_up - psi_down))
xp03 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I50:T61"), _
Application.WorksheetFunction.Match(alpha_up, Sheets("C1,0 & C2,0").Range("I50:I61"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp04 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I50:T61"), _
Application.WorksheetFunction.Match(alpha_up, Sheets("C1,0 & C2,0").Range("I50:I61"), 0), _
Application.WorksheetFunction.Match(psi_up, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp2 = xp03 + (xp04 - xp03) * ((psi - psi_down) / (psi_up - psi_down))
C1_0 = xp1 + (xp2 - xp1) * ((Abs(alpha_0) - Abs(alpha_down)) / ((Abs(alpha_up) - Abs(alpha_down))))
' abs(MyB) > My0
ElseIf My0 < Abs(MyB) Then
xp01 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_down, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp02 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_down, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_up, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp1 = xp01 + (xp02 - xp01) * ((psi - psi_down) / (psi_up - psi_down))
xp03 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_up, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp04 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I61:T71"), _
Application.WorksheetFunction.Match(alpha_up, Sheets("C1,0 & C2,0").Range("I61:I71"), 0), _
Application.WorksheetFunction.Match(psi_up, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
xp2 = xp03 + (xp04 - xp03) * ((psi - psi_down) / (psi_up - psi_down))
C1_0 = xp1 + (xp2 - xp1) * ((Abs(alpha_0) - Abs(alpha_down)) / ((Abs(alpha_up) - Abs(alpha_down))))
Else
End If
非常感谢您阅读本文,也许可以帮助我!
答:
0赞
wrbp
1/3/2023
#1
假设您的右上角单元格位于 I50 中,包括轴在内的整个数组表从 I50:T71 开始,您的行轴从 I50:I71 开始,您的列轴从 I50:T50 开始。
因此,索引索引函数应如下所示:
xp01 = _
WorksheetFunction.Index(Sheets("C1,0 & C2,0").Range("I50:T71"), _
Application.WorksheetFunction.Match(alpha_down, Sheets("C1,0 & C2,0").Range("I50:I71"), 0), _
Application.WorksheetFunction.Match(psi_down, Sheets("C1,0 & C2,0").Range("I50:T50"), 0))
评论
0赞
C504
1/3/2023
不幸的是,范围是这样设置的,否则我将有两个 alpha 值。奇怪的是,除非我的psi_up = 0.3 或 psi_up = 0.8 以及 alpha_up = -0.3 或 alpha_up = -0.8,否则代码工作正常
0赞
wrbp
1/3/2023
显示您的真实 excel 表格 showing.line 和列名称,因为显然您可以在您使用的范围内拥有负数和正数
0赞
C504
1/3/2023
我刚刚设法解决了它,谢谢:)事实证明,当我设置“psi_up = psi_down + 0.1”时,对于某些值,结果显示“psi_up= 0.3”(例如),但它没有被识别为这样。我将VBA中的值粘贴到我的工作表中,并尝试将index-match-function与粘贴的值一起使用,但它无法匹配。但是,当我直接写入单元格时,索引匹配功能起作用了。所以现在我定义了变量,没有加减 0.1。非常感谢您的帮助!
上一个:这里的类型匹配是什么?
下一个:在匹配多个条件的范围内搜索行
评论