Всем добрый вечер.
Собственно, проблема вот в чем, пользователь вводит количество столбцов и строк массива, после чего сам же вводит значения
Как сделать так, чтобы это выводилось на лист excela?
Visual Basic | ||
|
Заранее благодарю за помощь
Добавлено через 15 минут
Visual Basic | ||
|
Вроде бы добавил это после next i, выводит на лист, но проблема теперь в другом, почему при вводе первых трех значений — например ввожу подряд 1-2-3-4 с матрицей 2х2, он выдает на лист 0 0 0 и 4-ый элемент 1, не понимаю, к сожалению
Вывод массива
Для
распечатки полученного массива на
рабочий лист Excel
используется следующая конструкция:
For i = 1 To n
Cells(k, i) = A(i) ‘
вывод массива в ячейки электронной
таблицы
Next
i ‘ k
– номер строки для заполнения ячеек.
Вместо
переменной k
можно использовать конкретное значение,
например 3, тогда массив распечатается
в третьей строке рабочего листа.
После
заполнения ячеек их содержимое можно
посмотреть, свернув окно программного
кода при помощи кнопки “Свернуть” или
переключившись в окно Excel
с помощью соответствующей кнопки на
панели задач.
В
VBA
удобно пользоваться различными рабочими
листами в одной программе. Для установки
нужного рабочего листа используется
следующая команда:
Worksheets(Имя
листа).Select
Например,
Worksheets(“Лист1”).Select
– переход на рабочий лист с именем
“Лист1”.
Пример 14.
Пусть одномерный
массив А, состоящий из десяти элементов,
находится на рабочем листе “Лист1”, а
массив В, состоящий из десяти элементов,
находится на рабочем листе “Лист2”.
Необходимо прочитать массив А с листа
“Лист1” и расположить его на листе
“Лист2” ниже массива В.
Программный
код
Option
Explicit
Sub
PR14 (
)
Dim
A(10) As Integer
Dim
B(10) As Integer
Dim
i As Integer
For
i = 1 To 10
Worksheets(«Лист1»).Select
‘ выбираем
Лист1
A(i)
= Worksheets(«Лист1»).Cells(1,
i) ‘ считываем
с
Лист1
массив
А
Worksheets(«Лист2»).Select
‘ выбираем
Лист2
Worksheets(«Лист2»).Cells(2,
i) = A(i) ‘ выводим
на
Лист2
массив
А
Next i
End Sub
Вычисление суммы, произведения и количества элементов в одномерном массиве
Вычисление
суммы, произведения и количества
элементов в одномерных массивах
производится обязательно в цикле, перед
которым сумма приравнивается к нулю,
произведение – к единице, количество
– к нулю.
Если
необходимо вычислить сумму, произведение
или количество элементов массива,
удовлетворяющих некоторому условию,
то в цикле следует записать условный
оператор, в котором проверяется это
условие.
Пример
15.
Задан
целочисленный массив А, состоящий из
N элементов. Вычислить среднее
арифметическое четных элементов и
среднее геометрическое нечетных
элементов.
Программный
код
Option
Explicit
Sub
PR15 (
)
Dim
i As Integer, S As Integer
Dim
K1, K2, N As Integer
Dim
PR, SA, SG As Double
Dim
A(50) As Integer
N
= Val(InputBox(«Введите
N»))
S
= 0: PR
= 1: K1
= 0: K2
= 0 ‘ начальные значения
For
i = 1 To N
A(i)
= Cells(1, i) ‘ ввод
массива
Next
i
For
i = 1 To N
If
A(i) mod 2 = 0 Then
S
= S
+ A(i)
‘ вычисление суммы
и
K1
= K1
+ 1 ‘ количества четных
элементов
End
If
If
A(i) mod 2 < > 0 Then
PR = PR *
A(i) ‘ вычисление
произведения
и
K2
= K2
+1 ‘ количества нечетных элементов
End
If
Next
i
MsgBox(«S=»
& S & » K1=» & K1)
MsgBox(«PR=»
& PR & » K2=» & K2)
If
K1
< > 0 Then
SA
= S
/ K1
‘ вычисление среднего
арифметического
MsgBox(«SA=»
& SA)
Else
MsgBox(«четных
элементов нет»)
End
If
If
K2 < > 0 And PR>0 Then
SG
= PR
^ (1 / K2)
‘ вычисление среднего геометрического
MsgBox(«SG=»
& SG)
Else
MsgBox(«нечетных
элементов нет»)
End
If
End
Sub
Соседние файлы в папке VBA
- #
- #
- #
I’ve written a macro that takes a 2 dimensional array, and «prints» it to equivalent cells in an excel workbook.
Is there a more elegant way to do this?
Sub PrintArray(Data, SheetName, StartRow, StartCol)
Dim Row As Integer
Dim Col As Integer
Row = StartRow
For i = LBound(Data, 1) To UBound(Data, 1)
Col = StartCol
For j = LBound(Data, 2) To UBound(Data, 2)
Sheets(SheetName).Cells(Row, Col).Value = Data(i, j)
Col = Col + 1
Next j
Row = Row + 1
Next i
End Sub
Sub Test()
Dim MyArray(1 To 3, 1 To 3)
MyArray(1, 1) = 24
MyArray(1, 2) = 21
MyArray(1, 3) = 253674
MyArray(2, 1) = "3/11/1999"
MyArray(2, 2) = 6.777777777
MyArray(2, 3) = "Test"
MyArray(3, 1) = 1345
MyArray(3, 2) = 42456
MyArray(3, 3) = 60
PrintArray MyArray, "Sheet1", 1, 1
End Sub
Функция Array2worksheet позволяет быстро сформировать лист на основании данных из двумерного массива
Sub Array2worksheet(ByRef sh As Worksheet, ByVal Arr, ByVal ColumnsNames) ' Получает двумерный массив Arr с данными, ' и массив заголовков столбцов ColumnsNames. ' Заносит данные из массива на лист sh If UBound(Arr, 1) > sh.Rows.Count - 1 Or UBound(Arr, 2) > sh.Columns.Count Then MsgBox "Массив не влезет на лист " & sh.Name, vbCritical, _ "Размеры массива: " & UBound(Arr, 1) & "*" & UBound(Arr, 2): End End If With sh .UsedRange.Clear ColumnsNamesCount = UBound(ColumnsNames) - LBound(ColumnsNames) + 1 .Range("a1").Resize(, ColumnsNamesCount).Value = ColumnsNames .Range("a1").Resize(, ColumnsNamesCount).Interior.ColorIndex = 15 .Range("a2").Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr .UsedRange.EntireColumn.AutoFit End With End Sub
Sub ПримерИспользованияФункции_Array2worksheet() ' формируем двумерный массив, и заполняем его данными ReDim MyArr(1 To 20, 1 To 3) For i = 1 To 20: For j = 1 To 3: MyArr(i, j) = "Ячейка " & i & " * " & j: Next j: Next i ' создаём новую книгу, а в ней - лист для массива Dim sh As Worksheet: Set sh = Workbooks.Add(-4167).Worksheets(1): sh.Name = "Массив" ' заносим данные из массива MyArr на лист sh Array2worksheet sh, MyArr, Array("Столбец 1", "Столбец 2", "Столбец 3") End Sub
Несколько модернизированный вариант функции — вставку на лист можно начинать с любой выбранной ячейки:
Sub Array2worksheetEx(ByRef FirstCell As Range, ByVal Arr, ByVal ColumnsNames) ' Получает двумерный массив Arr с данными, и массив заголовков столбцов ColumnsNames. ' Заносит данные из массива на лист, начиная с ячейки FirstCell Dim sh As Worksheet: Set sh = FirstCell.Worksheet If UBound(Arr, 1) > sh.Rows.Count - FirstCell.Row Or _ UBound(Arr, 2) > sh.Columns.Count - FirstCell.Column Then MsgBox "Массив не влезет на лист " & sh.Name, vbCritical, _ "Размеры массива: " & UBound(Arr, 1) & "*" & UBound(Arr, 2): End End If ColumnsNamesCount = UBound(ColumnsNames) - LBound(ColumnsNames) + 1 On Error Resume Next With FirstCell.Resize(1, ColumnsNamesCount) .ClearContents Intersect(sh.Range((FirstCell.Row + 1) & ":" & sh.Rows.Count), _ sh.UsedRange, .EntireColumn).ClearContents .Value = ColumnsNames .Interior.ColorIndex = 15: .Font.Bold = True FirstCell.Offset(1).Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr .EntireColumn.AutoFit End With End Sub
Василий, в VBA используются в основном два вида массивов (есть ещё трёхмерный и т.д.):
- одномерный;
- двумерный.
Одномерный массив можно мысленно представить как обычную таблицу, состоящую из одной строки.
Двумерный массив можно представить как обычную таблицу, состоящую из строк и столбцов.
Vba-функция «Array» создаёт одномерный массив. Когда вы его помещаете в Excel, то он и занимает соответствующие ячейки.
Чтобы вставить массив в несколько строк, нужно создать двумерный массив. Для этого можно использовать разные способы. Ниже используется эксель-функция «Transpose». В результате её использования будет создан двумерный массив, представляющий собой таблицу, состоящую из одного столбца и несколько строк. Функция «Transpose» меняет местами строки и столбцы.
Sub TABL()
Cells(1, 1).Resize(1, 7) = Array(«ФИО», «КД», «ТИП», «ПОД», «ОСЗ», «%%», «ПЕНИ»)
Cells(2, 1).Resize(5, 1) = WorksheetFunction.Transpose(Array(«Иванов», «Петров», «Сидоров», «Козлов», «Конев»))
End Sub