Перенос двумерного массива на лист Excel

Функция 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

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

добрый день. Пытаюсь освоить предложенный вами метод заполнения ячеек. У меня есть 2-хмер массив(результат SQL-запроса). При попытке занести его происходит заполнение диапазона только первым элементом массива.Может есть какие-либо тонкости? Спасибо

Зачем так сложно?
http://support.microsoft.com/ kb/246335/ru или на вашем же сайте http://excelvba.ru/code/Transpose для "длинных" массивов

Вставка данных осуществляется в .Cells(1, 1).Resize(X, Y).Value
Где .Cells(1, 1) - ячейка для первого значения в массиве, X - первая размерность (строки), Y - вторая размерность (колонки).
Можно замечательно работать и с динамическими массивами.

В этом макросе не используются никакие разделители - ибо макрос этот предназначен для переноса двумерного МАССИВА (находящегося в оперативной памяти компьютера) на ЛИСТ Excel.
Ни в массиве, ни на листе Excel, никаких разделителей нет.

Если вы говорите про перенос CSV файла на лист Excel - то у меня на сайте есть другие, подходящие для этих целей, макросы, в которых этот самый разделитель можно указать в качестве параметра.

А если в файле в качестве разделителя - табуляция, то как прописать разбивку по столбцам?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____           ___    _        ___     ___  
| ___| __ __ / _ \ | |__ / _ \ / _ \
| |_ \ \/ / | (_) | | '_ \ | | | | | (_) |
| _| > < \__, | | |_) | | |_| | \__, |
|_| /_/\_\ /_/ |_.__/ \__\_\ /_/
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.