如何查找作为参数传入函数的范围中的最小值和最大值的行和列

我正在尝试在VBA中编写特殊的VLookup函数,而不是在列范围内查找一个值,而是在多个列范围内查找多个值。 当所有“查找”值与列中的相应值匹配时,将返回指定列以外的值。 就像是

splvlookup(RngArea作为范围,OptionName作为string,StrikePrice作为单一的,TrdDate作为date,dcr作为整数,Columnref作为整数)

哪里

RngArea是总表的范围

名称,价格,Dt是在RngArea的相应列中查找的值(列号不作为参数传入函数,因为这不是必需的,列标题不会更改,并且所有列按照相同顺序排列总是)

dcr是一个递减计数器,这会使date递减几天。 因此,查找的date将是Dt -dcr

Columnref是一个引用号,它是RngArea中第一列的列数

在我的表RngArea中,每个variablesDt,Price,Name都有多个值。 但是,三者之间只有一个独特的组合。 其任务是find唯一的行,并在由columnref标识的列中find相应的值。

我的问题

如何查找最小和最大的行和列范围。 一旦我find这个,我可以使用这些最小和最大范围内的循环,并检查查找值。 我相信这对于职业球员来说是一个非常简单的窍门,但似乎超越了我。 任何帮助赞赏。 提前致谢。

这里是我根据PA的build议使用的代码,代码是固定的。

Function splVlookup(RngArea As Range, OptionName As String, StrikePrice As Single, TrdDate As Date, Datedecrement As Integer, Columnref As Integer) As Variant Dim i As Long i = 1 Do While i < RngArea.Rows.Count + 1 If (RngArea.Cells(i, 9) = StrikePrice) And (RngArea.Cells(i, 3) = OptionName) And (RngArea.Cells(i, 1) = (TrdDate - Datedecrement)) Then splVlookup = RngArea.Cells(i, Columnref) Exit Function End If i = i+1 Loop If i = RngArea.Rows.Count + 1 Then splVlookup = CVErr(xlErrNA) End If End Function 

表结构是这样的(用'|'分隔)

TrdDate | 选项|选项名称|调用量|调用Open.Int |调用投标|调用询问|交易date| StrikePrice |投标|投入问|投入量|投入Open.Int

给定一个Range ,你可以访问它的.Rows.Count.Columns.Count并使用简单的For循环遍历它的.Cells属性。

 For i = 1 To rng.Rows.Count For j = 1 To rng.Columns.Count set Val = rng.Cells(i, j).Value Next j Next i 

尝试使用不同范围的代码。

您会注意到.Cells是指范围中相对于其原点的单元格。 因此,对于Range("B2:C4") ,它的.Cells(1,2)将参考"C2"

它也处理包含非连续单元格的范围。 对于Range("B2:C4","D2:E4") ,其.Cells(1,3)将参考"D2"

如果你只是在一个范围内寻找第一个和最后一个单元格,你可以尝试如下所示:

 Dim RR As Range Set RR = Range("B2:D7") MsgBox "First Cell: " & RR(1).Address & vbCrLf & _ "Last Cell: " & RR(RR.Count).Address 'You can also use RR(#).Row or RR(#).Column if you need those values instead 

如果你试图在范围内search一个值,请看下面的例程,看看你是否可以修改你的代码…

 Sub test() MsgBox FindValue(Sheet1.Range("B2:D7"), "X") End Sub Function FindValue(RngArea As Range, strSearch As String) Dim rCL As Range Dim sFirstAddress As String Dim rRES As Range Set rCL = Nothing Set rRES = Nothing Set rCL = RngArea.Find(strSearch, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False) If rCL Is Nothing Then FindValue = CVErr(xlErrNA) sFirstAddress = rCL.Address Do If rRES Is Nothing Then Set rRES = rCL Else Set rRES = Application.Union(rRES, rCL) End If Set rCL = RngArea.FindNext(rCL) Loop While Not rCL Is Nothing And rCL.Address <> sFirstAddress FindValue = rRES.Address End Function