powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вставить данные из массива на лист Excel
11 сообщений из 36, страница 2 из 2
Вставить данные из массива на лист 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
11 сообщений из 36, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вставить данные из массива на лист Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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