Всем добрый вечер.
Собственно, проблема вот в чем, пользователь вводит количество столбцов и строк массива, после чего сам же вводит значения
Как сделать так, чтобы это выводилось на лист excela?
Visual Basic | ||
|
Заранее благодарю за помощь
Добавлено через 15 минут
Visual Basic | ||
|
Вроде бы добавил это после next i, выводит на лист, но проблема теперь в другом, почему при вводе первых трех значений — например ввожу подряд 1-2-3-4 с матрицей 2х2, он выдает на лист 0 0 0 и 4-ый элемент 1, не понимаю, к сожалению
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
Вывод массива
Для
распечатки полученного массива на
рабочий лист 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
- #
- #
- #
Функция 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
Return to VBA Code Examples
In this Article
- Output (Print) Array to Range
- Output Data to a Different Range
- Looping Through an Array and Outputting the data
- Transpose Array Data
- Output to Debug.Print
This tutorial will demonstrate how to output an array to a range using VBA.
Output (Print) Array to Range
Data that is stored in an array can easily be outputted into an Excel sheet. There are 3 ways to do this.
Output Data to a Different Range
We could populate an array with data from one range in Excel, and then output the data to a different range in Excel.
Public Sub TestOutput()
'declare the array
Dim rnArray() As Variant
'populate the array with the range
rnArray = Range("A1:H24")
'output the array to a different range of cells
Range("J1:Q24") = rnArray()
End Sub
The entire array is copied in one line of code to the array, and then outputted in it’s entirety to a different range of cells on the sheet.
Looping Through an Array and Outputting the data
This example will loop through an array, outputting the array to a range.
Public Sub TestLoopArray()
'declare the array
Dim rnArray() As Variant
'Declare the integer to store the number of rows
Dim iRw As Integer
'Assign range to a the array variable
rnArray = Range("A1:A10")
'loop through the values in the array
For iRw = LBound(rnArray) To UBound(rnArray)
'populate a different range with the data
Cells(iRw, 2).Value = rnArray(iRw, 1)
Next iRw
End Sub
LBound and UBound returns the Starting index (Lower Bound) and Ending index (Upper Bound) of an array, in this case 1 and 10.
Transpose Array Data
We can also transpose the data in the Array to the Excel sheet. Transpose allows you to display the data horizontally across the Excel sheet.
For example, if we have a list of states in Excel and wish to transpose them.
We could then run the following code:
Public Sub TestOutputTranspose()
'declare the array
Dim rnArray() As Variant
'populate it with the range
rnArray = Range("A1:A38")
'transpose the data
Range(Cells(1, 3), Cells(1, 40)).Value = Application.Transpose(rnArray)
End Sub
Which would result in the following:
Output to Debug.Print
We can also output the array values to the debug window.
Public Sub TestLoopArray()
'declare the array
Dim rnArray() As Variant
'Declare the integer to store the number of rows
Dim iRw As Integer
'Assign range to a the array variable
rnArray = Range("A1:A10")
'loop through the rows - 1 to 10
For iRw = 1 To UBound(rnArray)
'output to the immediate window
Debug.Print rnArray(iRw, 1)
Next iRw
End Sub
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Василий, в 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