excel vba中最大的值地址

时间:2018-02-18 11:47:47

标签: excel vba excel-vba

我有1列,有200个数字。 数字从零开始,到达最高点(X),然后减少到负值到最低点(Y)然后增加。最后它以零结束。 0 1 2 .... 10 3 2 -1 ....- 10 -9 -8 ... 0

我使用

获得了最大值
Sub Largest()
    Dim rng As Range
    Dim X As Double
        Set rng = Sheet2.Range("B2:B201")
        X = Application.WorksheetFunction.Max(rng)
        Worksheets(1).Range("D3").Value = X
End Sub

和最小值相同,Min(rng)为Y

我试图将找到的值X和Y的地址作为字符串。

例如

Xadd是一个字符串缩写; Yadd是一个字符串删除

Xadd = X值的地址; Yadd = Y值的地址

这样我就可以直接使用

进行进一步处理

范围(XADD:YADD)

大多数地方我只能通过使用msgbox而不是字符串找到教程来查找地址。你可以看到附图。 如果我绘制图形,它将是这样的。

enter image description here

所以如果我得到X和Y的范围地址,我可以将循环分成两条曲线

  • Y to X
  • X to Y

这就是为什么我需要将X和Y的地址作为字符串获取,以便我可以将它们输入循环并进行进一步处理。

如何将地址作为字符串获取,还是有其他方法可以解决问题?

2 个答案:

答案 0 :(得分:2)

此函数返回包含指定范围内最大值的单元格的地址(如果存在问题,则返回空字符串,例如,如果范围不包含值):

Function maxMatch(rge As Range) As String

    Dim fnd As Range, mx As Double

    'get maximum value in range
    mx = Application.WorksheetFunction.Max(rge)

    'get range object containing location of [mx]
    Set fnd = rge.Find(mx, , xlValues)

    'return address of first matched cell
    If Not fnd Is Nothing Then maxMatch = fnd.Address

End Function

它可以在VBA中使用或作为工作表函数使用。请注意,如果有多个值等于最大值,则该函数将仅查找第一个值。

用法示例:

工作表功能:

=MAXMATCH(A1:B50)

VBA功能:

Dim mySearchRange as Range
Set mySearchRange = Sheets("Sheet1").Range("A1:B50")
MsgBox MaxMatch(mySearchRange)

...或简化:

MsgBox MaxMatch(Sheets("Sheet1").Range("A1:B50"))

如果需要找到 后续匹配 ,则可以根据需要调整公式。它将使用Range.Find Method进行初始搜索,然后使用Range.FindNext Method循环连续匹配。 (不要与模仿 Tab 键的Range.Next Property混淆,返回对" next cell"的引用。)

更多信息:

答案 1 :(得分:1)

如果您认为自己是 VBA 的初学者,则可以大大缩短代码。在 C2 中输入:

=IF(B2=MAX(B$2:B$201),CELL("address",B2),"")

并复制下来。在 D2 中输入:

=SUBSTITUTE(TEXTJOIN(",",TRUE,C2:C201),"$","")

然后 VBA 可能是:

Sub qwerty()
    MsgBox "Maximums located at: " & Range("D2").Value
End Sub

enter image description here

修改#1:

上述方法假设您的Excel版本支持TEXTJOIN()

如果没有,则省略 D2 等式并改为使用此宏:

Sub qwerty2()
    With Application.WorksheetFunction
        arr = .Transpose(Range("C2:C200"))
        v = Replace(.Trim(Replace(Join(arr, " "), "$", "")), " ", ",")
        MsgBox v
    End With
End Sub