Страницы: 1
RSS
Упорядочивание массива по содержимому, массивы
 

Уважаемые форумчане, очень прошу помочь в решении следующей задачи:

Есть объявленный массив SL(1 To 11), которому уже присвоены значения из целых чисел. Например, SL(1) = 20, SL(2) = 45, SL(3) = 10, SL(4) = 19 и т.д. Из этого массива нужно определить максимальное значение и присвоить его номер массиву  HB() под первым номером. Например, максимальное значение в массиве SL() равно 45, тогда HB(1) = 2 (так как SL(2) = 45). Далее нужно определить какое из оставшихся значений массива SL() (за вычетом SL(2) ) максимальное. В нашем примере это 20 (SL(1) = 20). Теперь нужно присвоить номер этого массива в HB(2) то есть HB(2) = 1 . Из приведённого примера выходит, что значение HB(3) будет равно 4, так как следующее максимальное значение из массива SL() будет SL(4), значит HB(3) = 4, и соответственно, HB(4) = 3.

Резюмирую: В массиве SL() все значения присвоены не по порядку возрастания.

А в массиве HB() мы вычисляем этот порядок.

То есть в итоге мы должны получить массив HB(), в котором будут отражаться номера массива SL() в порядке возрастания.

В нашем примере:

SL(1) = 20, SL(2) = 45, SL(3) = 10, SL(4) = 19

HB (1) = 2, HB (2) = 1, HB (3) = 4, HB (4) = 3

Изменено: Victor - 10.07.2022 00:59:29
 
Массив SL() уже назначен с присвоением данных:

Sub Numbers()

Dim SL() As Integer
ReDim SL(1 To 11)

Dim g As Integer, u As Integer

u = 0
For g = 1 To 33 Step 3
u = u + 1
SL(u) = Application.Min(Range(Cells(g, 2), Cells(g + 5, 2)))
Next g


End Sub
 
Если в вашем массиве чисел нет одинаковых чисел, то можно так
Код
Sub Numbers()
    Dim SL As Variant, HB As Variant
    Dim i As Long, n As Long
    
    SL = Array(20, 45, 10, 19)
    ReDim HB(LBound(SL) To UBound(SL))
    
    For i = LBound(SL) To UBound(SL)
        HB(i) = WorksheetFunction.Match(WorksheetFunction.Large(SL, i + 1), SL, 0)
        n = n + 1
    Next i
    MsgBox Join(HB, ", "), , ""
End Sub

P.S. Код макросов на форуме оформляется вот так
Изменено: New - 10.07.2022 02:12:58
 
New,  благодарю за ответ))) Но в массиве могут быть и повторяющиеся значения. Из-за этого задача сильно усложняется? В случае повторения чисел, присвоение значения тогда может идти любым способом - следующий индекс (номер) массива, рандомно или ещё как-либо.
 
ну, вы потестируйте мой макрос, он же как-то присвоит индексы задвоенным числам. Может вас это устроит)
 
Цитата
написал:
MsgBox Join(HB, ", "), , ""
Протестировал. К сожалению, считает порядок не правильно((
И к тому же только до 4-х значений, а в массиве их 11 должно быть.
 
мне кажется, не предоставив своих данных - вам никто не поможет. Вдруг у вас на листе всего 4 значения, а мы тут будем гадать, почему из 4 значений не делается 11.
А так же хотелось бы от вас получить - какой результат нужно получить на ваших данных, которые вы предоставите. Т.е. не так - вот файл и дальше сами разбирайтесь. А вот мой файл и хотел бы получить результат вот такой 1,2,3,4,5, и т.д.
Изменено: New - 10.07.2022 17:07:45
 
Мне уже помогли с решением)))
На всякий случай, мало ли, кому понадобиться аналогичное однажды, выкладываю рабочий код по своей задаче:

Sub Numbers()
Dim SL() As Integer
ReDim SL(1 To 11)

Dim g As Integer, u As Integer, HB() As Integer

u = 0
For g = 1 To 33 Step 3
u = u + 1
SL(u) = Application.Min(Range(Cells(g, 2), Cells(g + 5, 2)))
Next g

HB = GetHB(SL)
' дальше делайте с этим HB  что хотите

End Sub


Private Function GetHB(SL() As Integer) As Integer()
   Dim HB() As Integer, TM() As Integer, tmp As Integer, i As Integer, j As Integer
   ReDim HB(1 To UBound(SL)), TM(1 To UBound(SL))
   For i = 1 To UBound(SL)
     TM(i) = SL(i)
     HB(i) = i
   Next
   For j = 1 To UBound™
       For i = 1 To UBound™ - 1
          If TM(i) < TM(i + 1) Then
             tmp = TM(i): TM(i) = TM(i + 1): TM(i + 1) = tmp
             tmp = HB(i): HB(i) = HB(i + 1): HB(i + 1) = tmp
          End If
       Next
   Next
   GetHB = HB
End Function
 
сейчас придёт модератор и скажет вам, что вы плохо прочитали сообщение номер 3
Страницы: 1
Наверх