Как в цикле записать данные в массив VBA?
Как при помощи цикла через диалоговое окно заполнить массив в VBA?
Само задание звучит так Дан одномерный массив А размерности N. Найти сумму элементов, расположенных между максимальным и минимальным. Без подробностей Как я понимаю надо в textbox внести длину массива и потом в программе через цикл записывать в массив числа которые вроде как надо считать диалоговым окном по очереди. но опять же точных подробностей мне не дали
Ответы (1 шт):
Автор решения: Алексей Соболев
→ Ссылка
тут нужно уточнение от вас: решить задачу через Userforms, или все-таки при помощи диалогового окна. Банальное решение, простой алгоритм. По сути вот ваше решение:
Sub Массив()
Dim A() As Integer
Dim dblSum As Double, dblProduct As Double
Dim intMin_value As Integer, intMin_index As Integer
Dim intMax_value As Integer, intMax_index As Integer
Dim intFrom As Integer, intTo As Integer, i As Integer, n As Integer
Worksheets("Лист1").Range("A2:G30").Clear
' создали массив
n = InputBox("введите количество элементов:")
ReDim A(1 To n)
For i = 1 To n
A(i) = Int((10 - (-10) + 1) * Rnd + (-10))
Worksheets("Лист1").Cells(i + 1, 1) = A(i)
Next
' Поиск минимального и максимального (по модулю) элементов.
' Сначала за минимальный и максимальный принимается первый элемент,
' затем остальные элементы сравниваются с ним и если будет найден
' новый минимальный или максимальный, то он будет запомнен и затем
' уже другие элементы будут сравниваться с ним.
' Двоеточие используется для удобства написания кода - чтобы можно было записать две команды в одну.
intMin_value = VBA.Abs(A(1)): intMin_index = 1
intMax_value = VBA.Abs(A(1)): intMax_index = 1
' Можно начинать поиск прямо с первого элемента, хотя в этом нет смысла,
' т.к. он уже проанализирован, но это проще, если вдруг вам надо будет
' работать не с одномерным, а двумерным массивом.
For i = 1 To UBound(A) Step 1
If VBA.Abs(A(i)) < intMin_value Then
intMin_value = VBA.Abs(A(i))
intMin_index = i
End If
If VBA.Abs(A(i)) > intMax_value Then
intMax_value = VBA.Abs(A(i))
intMax_index = i
End If
Next i
' Если минимальный и максимальный элемент (по модулю) - это один и тот же элемент,
' то расчитывать нечего, т.к. нужно считать между.
If intMin_index = intMax_index Then
MsgBox "Между минимальным и максимальным элементом нет чисел.", vbExclamation
Exit Sub
End If
' Сумма элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
' Запись в переменную "dblProduct" единицы, иначе всегда будет 0, т.к. в пустой переменной
' с типом данных "Double" находится ноль.
dblProduct = 1
' Запись в переменные, с какой по какой элемент нужно двигаться.
If intMin_index < intMax_index Then
intFrom = intMin_index
intTo = intMax_index
Else
intFrom = intMax_index
intTo = intMin_index
End If
' Сумма элементов.
For i = intFrom + 1 To intTo - 1 Step 1
dblProduct = dblProduct + A(i)
Next i
' Здесь в переменной "dblProduct" содержится результат, который можно вставить в эксель.
End Sub