Вывод массива на лист excel vba

Студворк — интернет-сервис помощи студентам

Всем добрый вечер.
Собственно, проблема вот в чем, пользователь вводит количество столбцов и строк массива, после чего сам же вводит значения
Как сделать так, чтобы это выводилось на лист excela?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub massiv()
Dim A() As Integer
Dim i, j As Integer
Dim n, m As Single
n = InputBox("Введите кол-во столбцов массива")
m = InputBox("Введите кол-во строк массива")
ReDim Preserve A(n, m)
For i = 1 To n
  For j = 1 To m
  A(i, j) = InputBox("Введите значения массива  А ")
Next j
Next i
 
End Sub

Заранее благодарю за помощь

Добавлено через 15 минут

Visual Basic
1
Worksheets("Лист1").Cells(1, 1).Resize(n, m).Value = A

Вроде бы добавил это после 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

Оптимальный путь вывода большого одномерного массива на лист

SkyPro

Дата: Пятница, 08.11.2013, 02:22 |
Сообщение № 1

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Придумал такой алгоритм:

Процедура выводит одномерный массив на лист через функцию листа Transpose.
Подскажите, пожалуйста, как можно этот код улучшить и оптимизировать?
Или есть более быстрые варианты?
ЗЫ: Планируется выгружать около 1 млн. значений.


skypro1111@gmail.com

Сообщение отредактировал SkyProПятница, 08.11.2013, 02:31

 

Ответить

RAN

Дата: Пятница, 08.11.2013, 02:54 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Хитрый ты наш. Cам себя перехитрил.
[vba]

Код

ReDim tmp(1 To UBound(arArray), 1 to 1)
         For i = 1To UBound(arArray)
             tmp(i, 1) = arArray(i)
         Next

[/vba]
И никаких Transpose.


Быть или не быть, вот в чем загвоздка!

 

Ответить

PowerBoy

Дата: Пятница, 08.11.2013, 06:20 |
Сообщение № 3

Группа: Проверенные

Ранг: Участник

Сообщений: 100


Репутация:

31

±

Замечаний:
0% ±


2003

Миллионы записей надо выводить запросами.


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)

 

Ответить

MCH

Дата: Пятница, 08.11.2013, 08:39 |
Сообщение № 4

Группа: Админы

Ранг: Старожил

Сообщений: 2002


Репутация:

751

±

Замечаний:
±


т.к. исходный массив arArray() и массив ar() объявлены как Variant,
то выводить можно сразу квадратом, с учетом пустых значений в конце массива ar(), ячейки будут пустыми:

[vba]

Код

Option Explicit

Sub proverka()
Dim i&
Dim x(1 To 777777)
For i = LBound(x) To UBound(x)
     x(i) = i
Next
arToRange x, 1, 1
End Sub

Public Sub arToRange(ByVal arArray, startRow&, startColumn&)
     Application.ScreenUpdating = False
     Application.Calculation = xlCalculationManual

           Dim maxRow&, maxCol&, i&, j&, k&
     maxRow = 50000
     ‘maxRow = Rows.Count — startRow + 1
     maxCol = (UBound(arArray) — LBound(arArray)) maxRow + 1
     ReDim ar(1 To maxRow, 1 To maxCol)
     j = 1
     For k = LBound(arArray) To UBound(arArray)
         i = i + 1
         If i > maxRow Then i = 1: j = j + 1
         ar(i, j) = arArray(k)
     Next k

     Cells(startRow, startColumn).Resize(maxRow, maxCol) = ar

           Application.ScreenUpdating = True
     Application.Calculation = xlCalculationAutomatic
End Sub

[/vba]

Сообщение отредактировал MCHПятница, 08.11.2013, 08:42

 

Ответить

RAN

Дата: Пятница, 08.11.2013, 09:00 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Насколько я понял — нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.


Быть или не быть, вот в чем загвоздка!

 

Ответить

MCH

Дата: Пятница, 08.11.2013, 09:17 |
Сообщение № 6

Группа: Админы

Ранг: Старожил

Сообщений: 2002


Репутация:

751

±

Замечаний:
±


Насколько я понял — нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.

А я даже не обратил на это внимание, думал нужно по столбцам раскидать, макрос ведь не запускал :(
а так, нужно переложить из одномерного массива в двухмерный и выложить целиком на лист,

но в моем варианте есть небольшое плюс, можно массивы более миллиона записей выкладывать, раскидывая их по столбцам

 

Ответить

SkyPro

Дата: Пятница, 08.11.2013, 11:07 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Да. Выводить нужно в столбец.
Андрей, никак не пойму, как с твоим способом обойтись без транспоза?
Александр, чуток уточнить направление поиска «выводить запросами»? Насколько я понял, вы имели ввиду SQL ?


skypro1111@gmail.com

Сообщение отредактировал SkyProПятница, 08.11.2013, 11:09

 

Ответить

SkyPro

Дата: Пятница, 08.11.2013, 11:19 |
Сообщение № 8

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

«дурная голова рукам покоя не дает»
Я думал, что массив на лист вывести можно либо циклом по ячейкам (что ооооочень долго), либо транспозом (что быстро).
Вот и выбрал быстрый вариант и голову себе вчера ломал.
А всего-то нужно было сделать из одномерного массива двумерный =
Андрей, Михаил, спасибо вам, что просветили :)


skypro1111@gmail.com

Сообщение отредактировал SkyProПятница, 08.11.2013, 11:22

 

Ответить

PowerBoy

Дата: Пятница, 08.11.2013, 12:33 |
Сообщение № 9

Группа: Проверенные

Ранг: Участник

Сообщений: 100


Репутация:

31

±

Замечаний:
0% ±


2003

Александр, чуток уточнить направление поиска «выводить запросами»? Насколько я понял, вы имели ввиду SQL ?

Я так понимаю чтобы вывести быстро миллион записей, их еще надо быстро прочитать.
Оптимально конечно с помощью SQL, ADO.

Если лень писать макрос, можно воспользоваться моей надстройкой «Активные таблицы»:
http://www.excelworld.ru/forum/3-5665-68943-16-1383896892


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)

 

Ответить

SkyPro

Дата: Пятница, 08.11.2013, 13:15 |
Сообщение № 10

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Спасибо.
В моем случае массив фомируется, а не считывается. Так что вывод проще организовать «обычным» способом.
А вашу надстройку, при возможности, обязательно попробую :)


skypro1111@gmail.com

 

Ответить

RAN

Дата: Пятница, 08.11.2013, 16:12 |
Сообщение № 11

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Надо было вчера еще строчку кода добавить. Но не подозревал, что проблема в этом.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Выведите фио менеджера показавшего худшие показатели excel
  • Вывод массива в ячейки excel vba
  • Выведение среднего значения в excel
  • Вывод курса валют в excel
  • Выбросы в диаграммах excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии