Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/50: Рейтинг темы: голосов - 50, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17

Вставка элементов строки массива на лист Excel

21.07.2014, 10:05. Показов 10059. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

К примеру, есть массив data(1 To 3, 1 To n). Необходимо вставить на некоторое место листа все элементы от data(2,1) по data(2,n) друг за другом.
Есть ли возможность обратиться сразу к ряду элементов массива? Или единственный вариант - перебор массива:
Visual Basic
1
2
3
For i = 1 To n
   ActiveSheet.Cells(i, 1).Value = data(2, i): i = i + 1
Next
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2014, 10:05
Ответы с готовыми решениями:

Вставка картинок в лист Excel по номеру в соседнем столбце
Добрый день! Столкнулась с проблемой вставки картинок в лист с данными по номеру, указанному в соседнем столбце. При записи макроса...

Поиск строк с нужным значением в листах книг Excel и вставка их в лист итоговой книги
Доброго времени суток. Я поискал, по форуму и не могу найти: Нужен макрос который открывал бы много файлов и копировал только ту строку в...

Нахождение строки по артикулу и вставка всех её значений на новый лист
Добрый день. Прошу помощи в решение следующей задачи. Есть прайс - лист товаров с уникальным артикулом, ценой, описанием... необходима...

6
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
21.07.2014, 11:01
Fandorin_E, в VBA такой возможности (обратиться сразу к ряду элементов массива), насколько мне известно, не существует.
Однако в Excel такая возможность есть, на основании чего предлагаю следующий трюк:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Insert2RowToExcel()
    Const n = 50000
    Dim i As Long, j As Long, data(1 To 3, 1 To n) As Variant, t As Double
    'Çàïîëÿåì ìàññèâ ïðèìåðíûìè äàííûìè.
    For i = 1 To 3
        For j = 1 To n
            data(i, j) = (i - 1) * n + j
        Next j
    Next i
    'Èñïûòûâàåì ïåðâûé ñïîñîá çàíåñåíèÿ äàííûõ - ÷åðåç öèêë.
    t = Timer
    For i = 1 To n
        Cells(i, 1).Value = data(2, i)
    Next
    Debug.Print "Âðåìåíè ïîòðà÷åíî íà êîïèðîâàíèå â öèêëå: " & Format(Timer - t, "0.00")
    Cells.Clear
    'Èñïûòûâàåì âòîðîé ñïîñîá çàíåñåíèÿ äàííûõ - áåç öèêëà.
    t = Timer
    Cells(1).Resize(n, 2).Value = Application.Transpose(data)
    Cells(1).Resize(n).Value = Cells(1, 2).Resize(n).Value
    Cells(1, 2).Resize(n).Value = Empty
    Debug.Print "Âðåìåíè ïîòðà÷åíî íà êîïèðîâàíèå áåç öèêëà: " & Format(Timer - t, "0.00")
End Sub
С уважением,
Aksima
1
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
21.07.2014, 12:07
Третий вариант (я бы делал так) - создаём пустой массив нужного вида, в цикле перекладываем данные из середины исходного массива в созданный, его одним действием выгружаем на лист.
Код не сложный, выполнится быстро, думаю быстрее чем варианты Aksima (не могу потестить - в 2003 маловато столбцов чтоб оценить).
2
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
21.07.2014, 15:49  [ТС]
Спасибо за идеи!
Результаты тестов показали, что третий способ, который предложл Hugo121, самый быстрый.

Итоги по времени:
№1 1,58984
№2 0,19141
№3 0,09156

Aksima, к сожалению, остроумный способ №2, который Вы предложили, плох тем, что данные массива необходимо непосредственно выгружать на лист. Что не всегда может быть удобно, если массив имеет большую разрядность, или на листе уже есть какие-то другие данные. Только если добавлять в книгу пустой лист специально для этой операции.

Было бы здорово, если бы в excel была возможность оперировать с виртуальной таблицей, но, как я понимаю, именно из-за ее отсутствия нельзя выделить диапазон массива...

Если кому-то пригодится, листинг:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub Insert2RowToExcel()
    Const n = 50000
    Dim i As Long, j As Long, data(1 To 3, 1 To n), temp(1 To n) As Variant, t As Double
    'Заполяем массив примерными данными.
    For i = 1 To 3
        For j = 1 To n
            data(i, j) = (i - 1) * n + j
        Next j
    Next i
    '№1. Занесение данных через цикл, перебор ячеек.
    t = Timer
    For i = 1 To n
        Cells(i, 1).Value = data(2, i)
    Next
    Cells.Clear
    MsgBox "Времени потрачено на №1: " & Format(Timer - t, "0.00000")
    '№2. Занесение данных без цикла, через частичное копирование массива.
    t = Timer
    Cells(1).Resize(n, 2).Value = Application.Transpose(data)
    Cells(1).Resize(n).Value = Cells(1, 2).Resize(n).Value
    Cells(1, 2).Resize(n).Value = Empty
    Cells.Clear
    MsgBox "Времени потрачено на №2: " & Format(Timer - t, "0.00000")
    '№3. Занесение данных через цикл, использование промежуточного массива.
    t = Timer
    For i = 1 To n
     temp(i) = data(2, i)
    Next
    ActiveSheet.Range("A1").Resize(n) = Application.Transpose(data)
    Cells.Clear
    MsgBox "Времени потрачено на №3: " & Format(Timer - t, "0.00000")
End Sub
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
21.07.2014, 16:26
Есть ещё CopyMemory - но там нужно быть железно уверенным в данных.

Добавлено через 3 минуты
Упс, не заметил - третий вариант у Вас неправильный. Почти вообще. Перекладываете не туда, выгружаете не то, и не так...
Перекладывать нужно сразу в двумерный массив - чтоб его не "транспозить" зазаря, раз уж меряемся скоростями.
0
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
21.07.2014, 16:30
Visual Basic
1
2
3
4
5
6
7
8
Sub test()
  Dim a(1 To 3, 1 To 4), i&, j&
  For i = 1 To UBound(a)
    For j = 1 To UBound(a, 2)
      a(i, j) = (i - 1) * 10 + j
  Next j, i
  [a1].Resize(, UBound(a, 2)).Value = Application.Index(a, 2, 0)
End Sub
2
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
21.07.2014, 19:46  [ТС]
Hugo121, прошу прощения, опечатка:
Visual Basic
1
ActiveSheet.Range("A1").Resize(n) = Application.Transpose(temp)
Переделала как Вы сказали:
Visual Basic
1
2
3
4
5
Dim temp(1 To n, 1 To 1) As Variant
For i = 1 To n
   temp(i, 1) = data(2, i)
Next
ActiveSheet.Range("A1").Resize(n) = temp
Действительно, еще быстрее: 0,070313

Добавлено через 52 минуты
ikki, в данной задаче требуется вставлять данные в столбец (не упомянула в описании), поэтому скорее так:
Visual Basic
1
2
3
Dim temp As Variant
temp = Application.Index(data, 2, 0)
[a1].Resize(UBound(data, 2)).Value = Application.Transpose(temp)
По времени 0,10938

Кстати, когда копирушь в строку, почему-то выполняется дольше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2014, 19:46
Помогаю со студенческими работами здесь

Импорт данных из Access в Excel (вставка данных в лист)
Добрый день Уважаемые Гуру VBA. Выгружаю данные из Access в Excel, для анализа загружаю таблицы Access в разные листы Excel. ...

Одномерные массивы. Вставка, удаление элементов массива. Перестановка элементов массива. Сортировка массива методом пузырька
Помогите пожалуйста! Дан массив, состоящий из N букв латинского алфавита а) Заполнить массив датчиком случайных чисел б)...

Вывод массива на лист Excel
Всем добрый день, Помогите пожалуйста разобраться: Вывожу одномерный массив на лист Excel (1 строка и 374 колонки) Часть колонок...

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

Вывод строки из таблицы Access на лист Excel по запросу
делаю так! Sub test3() Dim adodb_connection As New ADODB.Connection Dim ado_recordset As New ADODB.Recordset adodb_connection.Open...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru