Я думаю, что это будет делать то, что вам нужно.Вы можете изменить его под свои нужды, но он отлично работает на моей стороне.Основной сабс для вызова - MoveMaxValuesFromColumns()
.Вы заметите, что я использовал, если dblTemp >= dblMax
, то добавить в список макс.это может быть изменено, чтобы получить максимум только один раз следующим dblTemp > dblMax
.Наконец, я сделал сравнение, используя double, однако вы можете изменить его, чтобы использовать любое значение, которое вы предпочитаете, даже варианты, если хотите.Надеюсь, это поможет.
Option Explicit
Public Sub MoveMaxValuesFromColumns()
Dim lngI As Long
Dim strSheet As String
Dim strCol As String
Dim strSplit() As String
Dim strFrom as string
Dim strTo as string
strFrom = "Sheet1"
strTo = "Sheet2"
With ThisWorkbook.Worksheets(strFrom)
For lngI = 2 To 100 Step 2
strCol = .Cells(1, lngI).Address(ColumnAbsolute:=True)
'Now, Parse the $'s out to get just the column!
strSplit = Split(strCol, "$")
strCol = strSplit(1)
'call the MoveMax routine
MoveMax strCol, strFrom, strTo
Next lngI
End With
End Sub
Private Sub MoveMax(strInColumn As String, strFromSheet As String, strToSheet As String)
Dim rng As Range
Dim dblMax As Double
Dim dblTemp As Double
Dim strMySheet As String
Dim strTransferSheet As String
Dim lngLastRow As Long
Dim lngI As Long
Dim lngJ As Long
Dim strOutVals() As String
Dim strTemp As String
Dim intCnt As Integer
Dim lngColOffset As Long
strMySheet = strFromSheet
strTransferSheet = strToSheet
With ThisWorkbook.Worksheets(strMySheet)
lngColOffset = .Range(strInColumn & ":" & strInColumn).Column
lngLastRow = .Range(strInColumn & .Range(strInColumn & ":" & strInColumn).Rows.Count).End(xlUp).Row
Set rng = .Range(strInColumn & "1:" & strInColumn & lngLastRow).Cells
dblMax = -1.79769313486231E+308 'Set the max to the double precision absolute minimum!
ReDim strOutVals(0 To (rng.Rows.Count - 1), 0 To 1)
For lngI = 1 To rng.Rows.Count
strTemp = rng.Cells(lngI, 1).Value
If IsNumeric(strTemp) Then
dblTemp = CDbl(strTemp)
If dblTemp >= dblMax Then
dblMax = dblTemp
End If
End If
Next lngI
'Now, loop through again and get the max's
intCnt = 0
For lngI = 1 To rng.Rows.Count
strTemp = rng.Cells(lngI, 1).Value
If IsNumeric(strTemp) Then
dblTemp = CDbl(strTemp)
If dblTemp >= dblMax Then
strOutVals(intCnt, 1) = rng.Cells(lngI, 1).Value
strOutVals(intCnt, 0) = rng.Cells(lngI, 1).Offset(0, -1).Value
intCnt = intCnt + 1
End If
End If
Next lngI
End With
'Finally, Write out to new Sheet
With ThisWorkbook.Worksheets(strTransferSheet)
For lngI = 0 To (intCnt - 1)
For lngJ = 0 To UBound(strOutVals, 2) 'This is just 1
.Cells(lngI + 1, lngColOffset + lngJ - 1).Value = strOutVals(lngI, lngJ)
Next lngJ
Next lngI
End With
Set rng = Nothing
End Sub