powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вставить данные из массива на лист Excel
36 сообщений из 36, показаны все 2 страниц
Вставить данные из массива на лист Excel
    #35881221
alex96822
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. помогите решить следующий вопрос, плиз.

Добавил данные с листа1 в массив

Dim a()
Dim r As Range

Sheets("Лист1").Select
Set r = [A1:D2000]
cc = r.Columns.Count
rc = r.Rows.Count
ReDim a(1 To rc, 1 To cc)
a = r.Value

затем произвел сданными к-л действия

Вопрос
Необходимо вставить изменённые данные обратно в Excel на лист2.
Какой самый простой и быстрый способ вставить данные из массива на лист Excel?
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35881272
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex96822,
есть такой способ, причем и для взять тоже..

dim arr
arr=[A1:D2000]
...
Sheets("Лист2").Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35881494
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex96822...Какой самый простой и быстрый способ вставить данные из массива на лист Excel?

Скажите пожалуйста, а ипользовать массив в Вашем примере - это религиозные убеждения
или техническое задание?

У объекта Range достаточно своих свойств и методов для озвученной функциональности.

Пример (упрощенный).

Берем Ваш исходный Range, вызываем на нем метод Copy с указанием целевой ячейки.
Создаем новый Range на основе скопированного диапазона.
Дальше Columns.Count и Rows.Count дают Вам границы.
Бегаем внутри Вашего нового Range с помощью свойства Cells и "фантазируем".
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35881560
alex96822
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, _slan_ . arr это как раз то что нужно.


Папа Игорь, нет не техническое задание, просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35881598
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex96822...просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь

Тестируйте. Но имейте ввиду, что Range - "родной" объект для объектной модели Excel,

а массив - это структура данных для VBA.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886399
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорьalex96822...просто с Range и Cells мне кажется макрос будет работать дольше, хотя возможно я ошибаюсь

Тестируйте. Но имейте ввиду, что Range - "родной" объект для объектной модели Excel,

а массив - это структура данных для VBA.

вот именно, а работает-то человек именно с VBA..

бывают разные случаи, но загрузка данных в массив и обработка этого массива - практически стандартный метод экономии времени, иногда на порядок..

попробуйте сами..

но в общем, к каждому конкретному случаю надо подходить отдельно - чаще всего наиболее эффективным является комбинация возможностей иксель и vba
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886577
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_...бывают разные случаи, но загрузка данных в массив и обработка этого массива - практически стандартный метод экономии времени, иногда на порядок..
Не надо быть столь категоричным.

_slan_...попробуйте сами..
Ну это... Регулярно пробуем.

_slan_...но в общем, к каждому конкретному случаю надо подходить отдельно ...
Мое предложение тестировать как бы этому не противоречит. Не находите?
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886734
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорь,
ваше утверждение, что обращение к Cells может быть быстрее обращения к массиву мягко говоря не совсем верно..

массив намного быстрее, это однозначно.

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

в общем, что спорить, предложите задачу, сделайте ее как вы считаете нужным, потом я сделаю по-своему - посмотрим?
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886747
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_Папа Игорь,
ваше утверждение, что обращение к Cells может быть быстрее обращения к массиву мягко говоря не совсем верно..
массив намного быстрее, это однозначно.


Возможно Вам поможет следующее:

1. Обращаясь к каждой ячейке через Cells автор вгоняет исходные данные в массив.

2. Идет обработка массива.

3. Обращаясь к каждой ячейке через Cells в новом диапазоне перегоняет обработанные данные.

Пункты 1 и 2 - это сценарий автора топика. Пунк три это то, чем ему хочется все завершить.

Надеюсь, очень надеюсь, что Вы внимательно это прочтете и поймете, что массив здесь - лишний .

Извините за "много жирным".
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886750
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_...Папа Игорь...

Как-то Вы "выборочно" меня читаете/цитируете. Приписывая мне то, что Вы увидели (просмотрели)

в моих высказываниях. Обращайте, пожалуйста, внимание на контекст .
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35886800
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькое замечание.

Вы заблуждаетесь, что обозвав переменную arr, Вы получаете массив.

Ваш пример,
_slan_
dim arr
arr=[A1:D2000]
...
Sheets("Лист2").Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr
противоречит документации от MS.

You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property.
You do not have to type the word "Range" or use quotation marks, as shown in the following examples.
Код: plaintext
1.
2.
3.
4.
5.
6.
Sub ClearRange()
    Worksheets("Sheet1").[A1:B5].ClearContents
End Sub

Sub SetValue()
    [MyRange].Value =  30 
End Sub

Массивы в VBA объявляются с "кругленькими" скобочками.
Код: plaintext
Dim MyArray( 10 ,  10 ) As Integer

То, что VBA может неявно преобразовывать типы данных - это хорошо, но лучше делать это самому. Так надежнее.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887217
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорь,


спасибо, что просветили насчет круглых скобочек :) (это сарказм без малейшей обиды)

тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив , что , конечно, несколько проигрывает при обработке, но выигрывает при обмене с листом иксель - это как раз вариант комбинированного подхода. Если бы я генерировал массив в vba, то ,несомненно ,
определил бы его как положено.

далее :)

противоречит документации от MS.

You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property.
You do not have to type the word "Range" or use quotation marks, as shown in the following examples
.

где же противоречие?

ведь это переводится как:

вы можете использовать как a1-стиль так и именованные диапазоны в квадратных скобках..
вы не обязаны писать слово range или использовать апострофы
..(я немножко знаю английский :) )

далее

- если противоречит документации, но работает, то тем хуже для документации, нет?

и все таки - давайте проверим наши подходы на задачке? если вы не хотите выбирать "оружие", то
я сам через некоторое время предложу вариант..
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887229
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, про самое последнее - в принципе верно, я и спользую опцию explicit и определяю типы данных заранее, но бывают варианты (:) простите за каламбур), когда надо использовать именно тип вариант, который является типом по умолчанию, и его необъявление явно - это просто знание умолчаний и, конечно, лень.. :)
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887367
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот "распечатка" окна вычислений примера
1 - результаты варианта с массивом
2 - вариант с range.cells
код во вложении - суть примера: 20000 строк заполнены тестовыми строками, состоящими из 7 латинских "a". в одной из них вместо латинской стоит русская "а". задача - найти эту ячейку.

Код: plaintext
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.
33.
34.
35.
36.
 1 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 046875 
  19977           время -  0 , 046875 
  19977           время -  0 , 046875 
  19977           время -  0 , 03125 
  19977           время -  0 , 046875 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
 2 
  19977           время -  0 , 421875 
  19977           время -  0 , 40625 
  19977           время -  0 , 40625 
  19977           время -  0 , 421875 
  19977           время -  0 , 421875 
  19977           время -  0 , 421875 
  19977           время -  0 , 40625 
  19977           время -  0 , 4375 
  19977           время -  0 , 421875 
  19977           время -  0 , 453125 
  1 
  19977           время -  0 , 03125 
  19977           время -  0 , 046875 
  19977           время -  0 , 03125 
  19977           время -  0 , 03125 
  19977           время -  0 , 046875 
 2 
  19977           время -  0 , 421875 
  19977           время -  0 , 421875 
  19977           время -  0 , 40625 
  19977           время -  0 , 40625 

как и говорилось, разница на порядок

конечно, можно решить это и другим способом.., но хотелось проиллюстрировать именно перебор с помощью range.cells
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887399
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и возьмем мой начальный пример:
Код: plaintext
1.
2.
3.
dim arr
arr=[A1:D2000]
...
Sheets("Лист2").Range("a1").Resize(UBound(arr), UBound(arr,  2 )) = arr

как бы вы определили arr иначе?
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887451
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, такой "икселевский" способ, как формула, уступает вба:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub test3()
Dim rng As Range, t!
t = Timer
Set rng = Cells( 1 ,  3 )
    rng.FormulaArray = "=MATCH(1,IF(RC[-2]:R[19999]C[-2]>""aaaaaaa"",1),0)"
    rng.Copy
    rng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
Debug.Print "  время - " & Timer - t
End Sub
результаты:
время - 0,0625
время - 0,0625
время - 0,0625
время - 0,0625
время - 0,046875
время - 0,046875
время - 0,046875
время - 0,0625
время - 0,0625
время - 0,078125
время - 0,046875
время - 0,046875
время - 0,0625
время - 0,046875
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887590
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати :)
такой способ перебора вдвое быстрее

Sub test4()
Dim arr As Range, t!, i&, x As Range
t = Timer
Set arr = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
For Each x In arr.Cells
If x > "aaaaaaa" Then
i = x.Row
Cells(1, 2) = i
Exit For
End If
Next
Debug.Print i, " время - " & Timer - t
End Sub

но все равно значительно уступает массиву
(это иллюстрация тому, что сама запись cells(a,b) - это не просто ссылка, а вычисление)
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887604
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_Папа Игорь,
спасибо, что просветили насчет круглых скобочек :) (это сарказм без малейшей обиды)
Да пожалуйста. И без всякого сарказма.

_slan_тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив
Какая наивность. Вашу ошибку Вы поймете из дальнейшего.

_slan_You can use either the A1 reference style or a named range within brackets as a shortcut for the Range property.
ведь это переводится как:
вы можете использовать как a1-стиль так и именованные диапазоны в квадратных скобках..

Вы остановились в своем переводе именно на значимом месте. Хотя чему удивляться - ведь это противоречит Вашей позиции.

Это переводится так:

Для обращения к свойству Range вы можете использовать любой из двух подходов - стиль А1 или
или краткую нотацию внутри квадратных скобок. Далее по тексту.

Как видим, к массивам это не имеет никакого отношения.

А вот используя затем функцию UBound() Вы заставляете VBA неявно преобразовать Range в
массив и вернуть Вам значения границ. А это лишнее. Учите матчасть (без обид).

_slan_...(я немножко знаю английский :) )
Как видите "немножко" иногда приводит к "множким" заблуждениям.

_slan_...и все таки - давайте проверим наши подходы на задачке?
Мерятся чем-либо у меня нет никакого желания. У нас различаются не подходы, а уровни знаний предмета.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35887789
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_...и все таки - давайте проверим наши подходы на задачке?...

Чтобы окончательно показать Вам Ваши танцы с неявными преобразованиями, я изменил
Ваш пример для большей ясности.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Sub Test()
    Dim arr ' здесь Ваша Variant переменная и ее лучше объявить As Range
    Set arr = [A1:A10]
    Debug.Print arr.Rows.Count
    Debug.Print arr.Columns.Count
    arr.Copy Destination:=Sheets("Лист2").Range("A1")
End Sub

Теперь, надеюсь, Вам понятно.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35888045
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_...и все таки - давайте проверим наши подходы на задачке?...

И о тестировании.

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

Вот тест измеряющий Ваш и мой "подходы".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public Sub Test()
    '
    Dim MyArr As Range
    Set MyArr = [A1:A10]
    '
    Dim arr
    arr = [A1:A10]
    '
    Dim Counter As Long
    '
    Dim tm: tm = VBA.Now()
    '
    For Counter =  1  To  20000  Step  1 
        MyArr.Copy Destination:=Sheets("Лист2").Range("A1")
    Next Counter
    Debug.Print (VBA.Now() - tm)
    '
    tm = VBA.Now()
    '
    For Counter =  1  To  20000  Step  1 
        Sheets("Лист2").Range("A1").Resize(UBound(arr), UBound(arr,  2 )) = arr
    Next Counter
    Debug.Print (VBA.Now() - tm)
End Sub

Результат в окне отладки.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35888370
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорь
_slan_тут как раз вы не разобрались - да, я получаю не чистый массив, а вариант-массив
Какая наивность. Вашу ошибку Вы поймете из дальнейшего.

Почти по Шекспиру ;)
Код: plaintext
1.
2.
3.
4.
5.
Sub ArrayOrNotArray()
  Dim arr
  arr = [A1:D2000]
  Debug.Print IsArray(arr)
End Sub
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35888480
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI...Почти по Шекспиру ;)
Код: plaintext
1.
2.
3.
4.
5.
Sub ArrayOrNotArray()
  Dim arr
  arr = [A1:D2000]
  Debug.Print IsArray(arr)
End Sub


Да нет там Шекспира, чистый " лояльный VBA".

Вначале, по обращению [A1:D2000], VBA неявно создает Range потом перегоняет его в Variant массив arr.
В итоге, да, человек имеет массив, который потом, опять неявно , VBA перегоняет в Range
при вызове Sheets("Лист2").Range("A1").Resize(UBound(arr), UBound(arr, 2)) = arr

Здесь "лишние" телодвижения с массивом. На что и указывалось.

P.S. Заниматься неявным преобразованием = возможность наступить на грабли.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35888669
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI...Почти по Шекспиру ;)
Код: plaintext
1.
2.
3.
4.
5.
Sub ArrayOrNotArray()
  Dim arr
  arr = [A1:D2000]
  Debug.Print IsArray(arr)
End Sub


И чтобы окончательно разобраться с литературой.
Код: plaintext
1.
2.
3.
4.
5.
Public Sub ArrayOrNotArray2()
    Dim MyArr As Range
    Set MyArr = [A1:A10]
    Debug.Print IsArray(MyArr)
End Sub
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35889123
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорь_slan_...и все таки - давайте проверим наши подходы на задачке?...

Чтобы окончательно показать Вам Ваши танцы с неявными преобразованиями, я изменил
Ваш пример для большей ясности.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Sub Test()
    Dim arr ' здесь Ваша Variant переменная и ее лучше объявить As Range
    Set arr = [A1:A10]
    Debug.Print arr.Rows.Count
    Debug.Print arr.Columns.Count
    arr.Copy Destination:=Sheets("Лист2").Range("A1")
End Sub

Теперь, надеюсь, Вам понятно.

нифига себе изменил! а нафига?

вы между двумя этими строчками разницу понимаете?

arr=[a1:a10]

и

set arr=[a1:a10]

?


на грабли наступает тот, кто не знает, что такое грабли..

я сознательно пользуюсь неявными преобразованиями- и мой код быстрее.
решите ту же задачу, что я предложил. Сравнивать-то можно только на одинаковых задачах.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35889207
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа Игорь_slan_...и все таки - давайте проверим наши подходы на задачке?...

И о тестировании.

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

Вот тест измеряющий Ваш и мой "подходы".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public Sub Test()
    '
    Dim MyArr As Range
    Set MyArr = [A1:A10]
    '
    Dim arr
    arr = [A1:A10]
    '
    Dim Counter As Long
    '
    Dim tm: tm = VBA.Now()
    '
    For Counter =  1  To  20000  Step  1 
        MyArr.Copy Destination:=Sheets("Лист2").Range("A1")
    Next Counter
    Debug.Print (VBA.Now() - tm)
    '
    tm = VBA.Now()
    '
    For Counter =  1  To  20000  Step  1 
        Sheets("Лист2").Range("A1").Resize(UBound(arr), UBound(arr,  2 )) = arr
    Next Counter
    Debug.Print (VBA.Now() - tm)
End Sub

Результат в окне отладки.

куда же Вы дели те самые ... из первоначального топика. Ведь в них-то и суть. Без этого не стоило и затевать ничего.
а значения с одного места на другое я могу перенести в два раза быстрее:

Sheets("Лист2").Range("A1").Resize(myarr.rows.count,myarr.columns.count).value=myarr.value

а зачем вам нужно было копировать и форматы Вы нам объясните..
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35889220
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... понимать как "затем произвел сданными к-л действия"
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35889479
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экий Вы задорный. Завидно просто.

По-порядку. Вначале Вы "наехали" на меня с этим:
_slan_ Папа Игорь,
ваше утверждение, что обращение к Cells может быть быстрее обращения к массиву мягко говоря не совсем верно..

Где я это утверждал не вижу. Возможно вы неправильно поняли вот это:
Папа ИгорьТестируйте. Но имейте ввиду, что Range - "родной" объект для объектной модели Excel,
а массив - это структура данных для VBA.

но это Ваши проблемы.

И затем разразились доказательствами того, что обращение к данным массива
быстрее обращения через объекты. Уважаемый, это и ежу понятно.

Мы ведь обращаемся к разным вещам. И организация доступа к ним в памяти

различаются.

Мой тест был направлен на Ваше:

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

Тест показал, что "...время на чтение в массив и обратно..." всегда больше.

О переводе документации умолчу - здесь Вы не спорите.

Ваши рассуждения о "чистых" и "не чистых" массивах, тоже оставим без внимания.

Вашу приверженность неявным преобразованиям оставляю за Вами, грабли, на которые
Вы наступите в связи с этим, еще впереди.

Желаю Вам всяческих успехов (без иронии).
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35891951
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папа ИгорьТест показал, что "...время на чтение в массив и обратно..." всегда больше.

Надо быть честным перед собой. Здесь я был НЕ ПРАВ .
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35891994
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ешкин кот! :)

жалко, что не хотите соревноваться. вот это было бы бесспорно.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35892041
Фотография Папа Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_...жалко, что не хотите соревноваться...

А мой бизнес тануть кого попросим? Не до олимпиад мне нынче.

Сейчас вот температура, а вынужден составлять планы для команды. И болеть некогда.
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35892177
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дуэль.
- Ваш выбор: сабля или пистолет?
- Сабля
- Хорошо, тогда я выбираю пистолет
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35892941
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI, или саблю,
но с 20 шагов :)
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35892953
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,


кстати, ZVI, не прокомментируете различия в коде?
это работает:
Sub d()
ReDim arr(1 To 5, 1 To 1), arr2(1 To 5)
arr = Range("a1:a2").Value
arr2 = arr
End Sub

а это нет:
Sub d()
Dim arr(1 to 2,1 to 1)
arr = Range("a1:a2").Value
End Sub
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35894877
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для массива фиксированного размера отводится определенный неперемещаемый фрагмент памяти. По определению, изменение размера такого массива недопустимо.
Динамический массив при переопределении его размера (ReDim) размещается в другом участке памяти (на это кстати требуется доп.время, чтобы найти свободный участок памяти требуемого размера и скопировать).
В этом, собственно, и разница.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub Test()
  Dim arr()	' должен быть динамический массив или хотя бы переменная Variant
  ReDim arr( 0  To  1 )
  Debug.Print LBound(arr,  1 ), UBound(arr,  1 )
  ' Предудущее переопределение массива будет проигнорировано
  arr = Range("A1:C2").Value
  Debug.Print LBound(arr,  1 ), UBound(arr,  1 ), LBound(arr,  2 ), UBound(arr,  2 )
End Sub

Приведу пример заполнения списка ListBox или ComboBox без тормознутого цикла с Add
Данный вариант не работает:
Код: plaintext
1.
2.
3.
Private Sub UserForm_Initialize()
  ComboBox1.List = Sheets( 1 ).[A1:A1000]
End Sub

А этот вариант с дополнительной переменной arr работает:
Код: plaintext
1.
2.
3.
4.
5.
Private Sub UserForm_Initialize()
  Dim arr
  arr = Sheets( 1 ).[A1:A1000]
  ComboBox1.List = arr
End Sub
Казалось бы, разница небольшая, но первый вариант это "почти выжил, но умер".

Что касается, квадратных скобок в [A1:A100], то это просто другая форма записи метода Evaluate().
Т.е. выражения arr = Sheets(1).[A1:A100] и arr = Sheets(1).Evaluate("A1:A100") равнозначны.
В определенных ситуациях я использую и [A1:A100], когда требуется наглядность, и Range(“A1:A100”), когда требуется скорость.
Не помню, чтобы когда-либо наступал при этом на грабли :)

В общем случае, конечно, лучше использовать явные преобразования, а в VB.NET в С++ без этого просто ничего не получится.
Но как говорил поручик Ржевский, случаи бывают разные ;)
Иногда, например, для совместимости с MS Excel97 и с MAC Excel приходится специально закладываться на неявные преобразования типов.
Дискутировать по этому поводу ни с кем не хочу, т.к. у каждого свой опыт, предпочтения и грабли :)
...
Рейтинг: 0 / 0
Вставить данные из массива на лист Excel
    #35896246
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVI,
спасибо, весьма популярно :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вставить данные из массива на лист Excel
    #38930434
msleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По теме ссылка - Перенос двумерного массива на лист Excel
http://excelvba.ru/code/Array2worksheet

Функция Array2worksheet позволяет быстро сформировать лист на основании данных из двумерного массива

Код: vbnet
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.
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



Несколько модернизированный вариант функции - вставку на лист можно начинать с любой выбранной ячейки:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вставить данные из массива на лист Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]