VBA,在列(C)中找到最大值,然后返回其值和相邻单元格的值

时间:2018-08-23 02:11:31

标签: vba excel-vba

Image of my spreadsheet

我正在做一个需要解决方案使用VBA的作业,所以我不能在工作表页面上使用索引或其他选项...我一直在寻找答案,也许我只是在问问题不正确。

在K列中有股票代码,即A,ABM等。 在L列中有一个数字(我一直被分类为Long)

我想在Range("O2")的L列中放置最高的数字,在Range("N2")的左列中放置标签。

我找到了很多方法来标识L列中的高数字,但无法弄清楚如何返回相邻单元格的值...

这是我一直在尝试的最新代码,无法正常工作。当我删除标记引用时,代码可以正常运行,但是我也需要相邻的值。

谢谢

Sub attempt38()

Dim sheet As Worksheet
Dim i As Long
Dim firstRow As Integer
Dim columnNumber As Integer
Dim max As Long
Dim tag As Long

firstRow = 2
columnNumber = 12

Set sheet = ActiveSheet

If sheet.UsedRange.Rows.Count <= 1 Then max = 0 Else max = sheet.Cells(2, 12)

For i = firstRow To 300
    If sheet.Cells(i, 12) > max Then max = sheet.Cells(i, 12) & (tag = sheet.Cells(i, 11))

Next

sheet.Cells(3, 14) = max
sheet.Cells(4, 14).Value = tag

End Sub

2 个答案:

答案 0 :(得分:1)

您不需要VBA。您可以只使用常规的excel。

=LARGE(L:L,1)

将返回最大的数字。

要获取相应的内容,只需使用索引加匹配项即可。

=INDEX(K:K,MATCH(LARGE(L:L,1),L:L,FALSE),1)

如果您真的想使用VBA,则将代码调整为两行,如下所示:

For i = firstRow To 300
    If sheet.Cells(i, 12) > max Then 
       max = sheet.Cells(i, 12)
       tag = sheet.Cells(i, 11)
    Endif

Next

或者,如果您想显得精致:

For i = firstRow To 300
   With sheet.Cells(i, 12)

     If .Value > max Then 
       max = .Value
       tag = .Offset(0,-1).Value
     Endif
   End With     
Next i

答案 1 :(得分:1)

遍历一个范围可能很耗时,在这种情况下也很浪费。

如果您的最大值实际上存在于第一循环行中,该怎么办?现在,您将无休止地浏览299行。

以下方法将更快并且不需要循环。

Option Explicit

Sub Mad_Max()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim MyMax As Long, MaxCell As Range

MyMax = Application.WorksheetFunction.Max(ws.Range("L:L"))
Set MaxCell = ws.Range("L:L").Find(MyMax, Lookat:=xlWhole)

ws.Range("N3") = MyMax
ws.Range("N4") = MaxCell.Offset(, -1)

End Sub