Поменять местами максимальный элемент массива и минимальный элемент части массива, расположенной после максимального. VBA

возникла проблема при решении данной задачи. Почему-то неверно определяется максимальный элемент, который нужно заменить. Вместо этого заменяется минимальный элемент. Хотя походу где-то еще накосячил. Код:

Sub n28()
    Dim i As Double, k As Double, j As Double
    Dim max As Double, min As Double
    Dim A(1 To 10) As Double

    For i = 1 To 8
        A(i) = Cells(i, 1)
    Next
    max = A(1)
    For i = 2 To 8
        If A(i) > max Then
            k = i
            max = A(i)
        End If
    Next
    min = A(k + 1)
    For i = k + 1 To 8 Step 1
        If A(i) < min Then
            j = i
            min = A(i)
        End If
    Next
    Cells(j + 1, 2) = min
    Cells(k + 1, 2) = max
End Sub

Заранее спасибо.

UPD: Так, разобрался сам. вот решение, может кому понадобиться...

Sub n28()
    Dim i As Double, k As Double, j As Double
    Dim max As Double, min As Double
    Dim A(1 To 10) As Double
    For i = 1 To 8
        A(i) = Cells(i, 1)  
    Next
    max = A(1)
    For i = 2 To 8
        If A(i) > max Then
            k = i
            max = A(i)
        End If
    Next
    min = A(k)
    For i = k + 1 To 8 Step 1
        If A(i) < min Then
            j = i
            min = A(i)
        End If
    Next
    Cells(j, 2) = max
    Cells(k, 2) = min
End Sub

Ответы (1 шт):

Автор решения: vikttur

По Вашем коду значения не меняются местами, а в соседний столбец выводятся максимальное возле минимального и наоборот. Если нужна замена в исходном диапазоне, указвывать первый столбец в ссылках на ячейки.

Где-то так...

Sub n28()
    Dim A()
    Dim dMax As Double, dMin As Double
    Dim i As Long, n As Long, k As Long

    A = Range("A1:A8").Value
    dMin = 99999 ' больше максимального значения в диапазоне'
    
    For i = 2 To 8
        If A(i, 1) > dMax Then k = i: dMax = A(i, 1)
        If A(i, 1) < dMin Then n = i: dMin = A(i, 1)
    Next i
    
    Cells(n, 2).Value = dMax
    Cells(k, 2).Value = dMin
End Sub

В начале процедуры максимальное для dMin = 99999 - или взять намного больше возможного максимального, или вычислить с помощью функции листа:

dMax = Application.Max(Range("A1:A8"))
dMin = dMax

Кстати, и минимальное можно так же определить (Application.Min), а в цикле находить только их положение в диапазоне

P.S. Пропустил условие "минимальный элемент... после максимального". Тогда так (заодно вариант без использования двух переменных):

Sub n28_2()
    Dim A()
    Dim i As Long, n As Long, k As Long
    
    A = Range("A1:A8").Value
    k = 1
    
    For i = 2 To 8
        If A(i, 1) > A(k, 1) Then k = i
    Next i
    
    n = k
    
    For i = k To 8
        If A(i, 1) < A(n, 1) Then n = i
    Next i

    Cells(n, 2) = A(k, 1)
    Cells(k, 2) = A(n, 1)
End Sub
→ Ссылка