使用VBA从选择中选择重复的最大数字

使用VBA从选择中选择重复的最大数字,vba,excel,Vba,Excel,这是我的代码: Sub Largest() Dim strData As String Dim rng As Range Dim vValue As Variant Dim rngCol As Range Dim lngRow As Long Dim rngAdd As Range 'Find desired range in which to find the largest value Dim selectionRange As Variant selectionRange = Se

这是我的代码:

Sub Largest()

Dim strData As String
Dim rng As Range
Dim vValue As Variant
Dim rngCol As Range
Dim lngRow As Long

Dim rngAdd As Range

'Find desired range in which to find the largest value
Dim selectionRange As Variant

selectionRange = Selection.Address(ReferenceStyle:=xlA1, _
                        RowAbsolute:=False, ColumnAbsolute:=False)
Set rng = Range(selectionRange)

'Determines largest value in range
vValue = Application.WorksheetFunction.Max(rng)

For Each rngCol In rng.Columns
    'Determines in case the largest value exists in a particular column
    If Application.WorksheetFunction.CountIf(rngCol, vValue) > 0 Then
        'Returns row number of the largest value, in the column which has the same
        lngRow = Application.WorksheetFunction.Match(vValue, rngCol, 0)

        'Returns cell address of the largest value
        Set rngAdd = rngCol.Cells(lngRow, 1)

        Dim cel As Range
        For Each cel In rng
            If (cel.Value = vValue) Then
                cel.Select
            End If
        Next cel
        Exit Sub
    End If
Next
End Sub
这是我的选择:

有两个最大的数字(重复)。此代码循环通过两个最大值,即111,但仅选择最大数值的最后一个循环单元格,即
D8

如何选择这两个单元格?我可以用颜色突出显示单元格,因为重复时它会循环遍历所有最大的数字。但是我不想用颜色来突出它们。我只想选择它们,比如按下
ctrl
按钮,然后选择
C6
D8
。 有什么帮助吗

Option Explicit

Public Sub TestMe()

    Dim inputRange As Range
    Set inputRange = Selection

    Dim largestNumber As Double
    largestNumber = WorksheetFunction.Max(inputRange)

    Dim myUnion As Range
    Dim myCell As Range

    For Each myCell In inputRange
        If myCell = largestNumber Then
            If Not myUnion Is Nothing Then
                Set myUnion = Union(myUnion, myCell)
            Else
                Set myUnion = myCell
            End If
        End If
    Next myCell

    myUnion.Select

End Sub
Union()
生成一系列单元格。因此,您只需要选择通过
Union()
创建的变量。
Union()
的棘手之处在于您添加到它的方式-您有两种情况:

If Not myUnion Is Nothing Then
    Set myUnion = Union(myUnion, myCell)
Else
    Set myUnion = myCell
End If

关于这个问题,你可能会读到这句话——比如按ctrl键并选择C6和D8

这是非常有用的,因为Excel拥有奇妙的“宏记录器”(这里没有讽刺)。因此,在这里,宏录制确实是一个好主意:

它产生
范围(“C6,D8”)。选择

现在,如果可以通过某种方式将
C6、D8
传递到某个范围,并选择该范围,则作业已经完成。因此,在每次迭代中,我们都会添加单元格的地址和后面的逗号。唯一的问题似乎是逗号,因为
C6,D8,
将无效。这是通过一些切片实现的:

toBeSelected = Left(toBeSelected, Len(toBeSelected) - 1)
这是全部代码:

Option Explicit

Public Sub TestMe()

    Dim inputRange As Range
    Set inputRange = Selection

    Dim largestNumber As Double
    largestNumber = WorksheetFunction.Max(inputRange)

    Dim toBeSelected As String
    Dim myCell As Range

    For Each myCell In inputRange
        If myCell = largestNumber Then
            toBeSelected = toBeSelected & myCell.Address & ","
        End If
    Next myCell

    toBeSelected = Left(toBeSelected, Len(toBeSelected) - 1)
    Range(toBeSelected).Select

End Sub

归功于@Vitaya。我把他的anwer做成了一个.findnext潜艇

Option Explicit

Dim inputRange As Range
Dim c As Range
Dim firstAddress As String
Dim myUnion As Range
Dim myCell As Range
Dim largestNumber As Long

Public Sub TestMe1()

    Set inputRange = Selection
    largestNumber = WorksheetFunction.Max(inputRange)

    With inputRange
        Set c = .Find(largestNumber, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                If Not myUnion Is Nothing Then
                    Set myUnion = Union(myUnion, c)
                Else
                    Set myUnion = c
                End If
                Set c = .FindNext(c)
            Loop While c.Address <> firstAddress
        End If
    End With

    myUnion.Select

End Sub
选项显式
Dim inputRange As范围
调光范围
将第一个地址设置为字符串
Dim myUnion As范围
暗淡的迈塞尔山脉
暗最大数等于长
公共子测试ME1()
设置输入范围=选择
最大数量=工作表函数.Max(输入范围)
带输入范围
集合c=.Find(最大数量,查找:=xlValues)
如果不是,那么c什么都不是
firstAddress=c.地址
做
如果不是我的联盟,那就什么都不是了
设置myUnion=Union(myUnion,c)
其他的
设置myUnion=c
如果结束
集合c=.FindNext(c)
在c.AddressFirstAddress时循环
如果结束
以
我的联盟。选择
端接头

非常感谢您。工作得很好。@AmanDevrath-另一个答案可能更好更容易实现。可爱的代码@Vityata:)。尽管你是完全正确的,但是如果用.findnext完成了呢?使用更大的数据集会更快吗?只是为了好玩,我做了一个比较。Findnext应该在单元格中循环(我会在回答中添加它)@JvdV-谢谢。一般来说,如果一个人真的有时间和欲望,我想最快的方法是将范围解析成一个数组,在数组中搜索并记住坐标。然后选择它们。@vityta其他代码运行正常。我不知道该把哪个标记为答案。告诉我,好吗?酷!:)没有
GoTo
它看起来更好。工作非常好。我会研究一下.FindNext,也会尝试理解你发布的代码,因为我对它一无所知。谢谢你的努力。我不知道哪一个应该被标记为答案。请告诉我