Excel查找大于参考值的第一个实例

时间:2016-07-26 14:51:27

标签: excel vba excel-vba

快速提问。我正在尝试创建一个程序,该程序找到的值的第一个实例大于I8中坦克的最大体积。我想将I13:I80中Vol列中的音量与I8中的最大音量进行比较。然后我想要excel输出B13列中的相应Strap:B80作为消息框。所以在这种情况下会输出一个消息框,上面写着“墙的高度是16英寸”。因为B20是与第一个体积相对应的带子的值大于最大值。

Public Sub dimensionInput()

Dim wallWidth As Double 'Get Wall Width Input
wallWidth = Application.InputBox("Input Desired Secondary Containment Wall Width in Inches", "Wall Width", 1)
If wallWidth = False Then
    Call zeroFill
    Exit Sub
Else
Application.Worksheets("Sheet1").Range("D3").Value = wallWidth
End If

Dim wallLen As Variant 'Get Wall Length Input
wallLen = Application.InputBox("Input Desired Secondary Containment Wall Width in Inches", "Wall Width", 1)
If wallLen = False Then
    Call zeroFill
    Exit Sub
Else
Application.Worksheets("Sheet1").Range("E3").Value = wallLen
End If

Dim arrayDia() As String
Dim diameter As Variant 'Get Diameter Input
diameter = Application.InputBox("Input Tank(s) Diameter Seperated by a Comma and Space e.g. N1, N2, N3, ...", "Diameter", 1)
arrayDia() = Split(diameter, ",")
For i = LBound(arrayDia) To UBound(arrayDia)
    Cells(6, i + 3).Value = arrayDia(i)
Next i

Dim arrayLen() As String
Dim length As Variant 'Get Lenth Input
length = Application.InputBox("Input Desired Length Seperated by a Comma and Space e.g. N1, N2, N3, ...", "Length", 1)
arrayLen() = Split(length, ",")
For i = LBound(arrayLen) To UBound(arrayLen)
    Cells(7, i + 3).Value = arrayLen(i)
Next i

'Dim arrayOrient() As String
'Dim orient As Variant 'Get Orient Input
'orient = Application.InputBox("Input Desired Orient", "Orient", H)
'arrayOrient() = Split(orient, ",")
'For i = LBound(arrayOrient) To UBound(arrayOrient)
'    Cells(9, i + 3).Value = arrayOrient(i)
'Next i

Dim arrayOffset() As String
Dim offset As Variant 'Get Offset Input
offset = Application.InputBox("Input Desired Offset Seperated by a Comma and Space e.g. N1, N2, N3, ...", "Offset", 0)
arrayOffset() = Split(offset, ",")
For i = LBound(arrayOffset) To UBound(arrayOffset)
    Cells(10, i + 3).Value = arrayOffset(i)
Next i

End Sub

Public Sub zeroFill()

Application.Worksheets("Sheet1").Range("C6:H7").Value = "0"
'Application.Worksheets("Sheet1").Range("C9:H9").Value = "H"
Application.Worksheets("Sheet1").Range("C10:H10").Value = "0"

End Sub

enter image description here

2 个答案:

答案 0 :(得分:1)

假设我们在 I3 I19 的列 I 中有值。将参考值放在单元格 K3 中。在 J3 中输入:

=IF(I3>$K$3,I3,"")

J4 中输入:

=IF(AND(I4>$K$3,COUNT($J$3:$J3)=0),I4,"")

并复制下来。最后在 L3 中输入:

=MAX(J:J)

enter image description here

(此方法避免使用数组公式)

答案 1 :(得分:1)

建议公式:

="The height of the wall is"&INDEX(B13:B80,MATCH(I8,I13:I80,1)+1)&""""  
OP表示会对此有所解释。

MATCH

I8范围内查找相关值(I13:I80)。由于单个单元格需要结果(不涉及公式拖动),因此不需要锚点($用于修复引用)。

每M $的第三个参数(此处1):

  

找到小于或等于lookup_value的最大值。

所以给定872.9(在I8中)'匹配'值794.4是范围中的第七项(倒计时)。这还不够(我们正在寻找大于参考值的第一个实例),因此我们使用+1逐步降低一行(因为数据按升序排序)。所以我们现在得到范围内相关行的索引(8)。这适用于:

INDEX(数组形式)

考虑范围(此处为B13:B801)并从中选择n条目的值(从范围顶部开始计数的row_number)。这里n = 8,这是16

对于消息框,需要比普通16多一点,并且可以使用concatenation添加说明文字。

OP要求Inches而不是",但是对于我来说,"消息框似乎已经足够了,并且大写不合适。