VBA代码在使用Index-Match-Function时无法识别表中的某些数字

VBA Code does not recognize certain numbers from table when using Index-Match-Function

提问人:C504 提问时间:1/3/2023 最后编辑:ClemsangC504 更新时间:1/3/2023 访问量:57

问:

我有一个值表,这些值是我的 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

在此处输入图像描述 在此处输入图像描述

非常感谢您阅读本文,也许可以帮助我!

Excel VBA 匹配 多索引

评论


答:

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。非常感谢您的帮助!