Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Обмен знаниями: VBA-массивы на Tableau (Москва) - Страница 5 - Мир MS Excel

Старая форма входа
  • Страница 5 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
Модератор форума: китин  
Мир MS Excel » Работа и общение » Неформальное общение » Обмен знаниями: VBA-массивы на Tableau (Москва) (Предлагаю обменяться знаниями в формате личной встречи.)
Обмен знаниями: VBA-массивы на Tableau (Москва)
Gustav Дата: Среда, 11.06.2014, 13:10 | Сообщение № 81
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2757
Репутация: 1139 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
А есть способ отдельно записать ряд значений для первого "столбца" двумерного массива (1, 2, 3, 4), и отдельно для второго (10, 20, 30, 40)?

Такого способа не припомню. Но знаю, что решаема обратная задача - из двухмерного массива вырезать (тоже в виде массива) целиком отдельные строки или столбцы:
[vba]
Код
Sub io3()

     Dim SuperMassiv(1 To 4, 1 To 2)
     Dim arrCol1, arrCol2
     Dim arrRow3, arrRow4
     Dim i, j
      
     SuperMassiv(1, 1) = 1: SuperMassiv(1, 2) = 10
     SuperMassiv(2, 1) = 2: SuperMassiv(2, 2) = 20
     SuperMassiv(3, 1) = 3: SuperMassiv(3, 2) = 30
     SuperMassiv(4, 1) = 4: SuperMassiv(4, 2) = 40
     
     arrCol1 = WorksheetFunction.Index(SuperMassiv, 0, 1)
     arrCol2 = WorksheetFunction.Index(SuperMassiv, 0, 2)
     arrRow3 = WorksheetFunction.Index(SuperMassiv, 3)
     arrRow4 = WorksheetFunction.Index(SuperMassiv, 4)
         
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
А есть способ отдельно записать ряд значений для первого "столбца" двумерного массива (1, 2, 3, 4), и отдельно для второго (10, 20, 30, 40)?

Такого способа не припомню. Но знаю, что решаема обратная задача - из двухмерного массива вырезать (тоже в виде массива) целиком отдельные строки или столбцы:
[vba]
Код
Sub io3()

     Dim SuperMassiv(1 To 4, 1 To 2)
     Dim arrCol1, arrCol2
     Dim arrRow3, arrRow4
     Dim i, j
      
     SuperMassiv(1, 1) = 1: SuperMassiv(1, 2) = 10
     SuperMassiv(2, 1) = 2: SuperMassiv(2, 2) = 20
     SuperMassiv(3, 1) = 3: SuperMassiv(3, 2) = 30
     SuperMassiv(4, 1) = 4: SuperMassiv(4, 2) = 40
     
     arrCol1 = WorksheetFunction.Index(SuperMassiv, 0, 1)
     arrCol2 = WorksheetFunction.Index(SuperMassiv, 0, 2)
     arrRow3 = WorksheetFunction.Index(SuperMassiv, 3)
     arrRow4 = WorksheetFunction.Index(SuperMassiv, 4)
         
End Sub
[/vba]

Автор - Gustav
Дата добавления - 11.06.2014 в 13:10
Hugo Дата: Среда, 11.06.2014, 13:31 | Сообщение № 82
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Gustav, есть ещё copymemory для этого дела - но не освоил :(
А экселевский index медленный - быстрее в цикле переложить. Как-то замеряли, можете повторить.

Если использовать не в Экселе - то я бы вероятно заполнял небольшие прямо явно в коде, большие - парсингом текста с списком. Перекладывая в цикле по строкам/массиву_строк.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеGustav, есть ещё copymemory для этого дела - но не освоил :(
А экселевский index медленный - быстрее в цикле переложить. Как-то замеряли, можете повторить.

Если использовать не в Экселе - то я бы вероятно заполнял небольшие прямо явно в коде, большие - парсингом текста с списком. Перекладывая в цикле по строкам/массиву_строк.

Автор - Hugo
Дата добавления - 11.06.2014 в 13:31
RAN Дата: Среда, 11.06.2014, 14:11 | Сообщение № 83
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Протестировал, и обалдел!
a1 26,1406
a2 0,0156
[vba]
Код
Sub qq()
     Dim arr, a1(), a2(), a3()
     Dim i&, j&, t!
     arr = Range("A1").CurrentRegion.Value
     t = Timer
     ReDim a1(1 To UBound(arr))
     For i = 1 To UBound(arr)
         a1(i) = Application.Index(arr, i, 0)
     Next
     Debug.Print "a1  " & Format(Timer - t, "0.0000")
     t = Timer

     ReDim a2(1 To UBound(arr))
     For i = 1 To UBound(arr)
         ReDim a3(1 To UBound(arr, 2))
         For j = 1 To UBound(arr, 2)
             a3(j) = arr(i, j)
         Next
         a2(i) = a3

     Next
     Debug.Print "a2  " & Format(Timer - t, "0.0000")

End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПротестировал, и обалдел!
a1 26,1406
a2 0,0156
[vba]
Код
Sub qq()
     Dim arr, a1(), a2(), a3()
     Dim i&, j&, t!
     arr = Range("A1").CurrentRegion.Value
     t = Timer
     ReDim a1(1 To UBound(arr))
     For i = 1 To UBound(arr)
         a1(i) = Application.Index(arr, i, 0)
     Next
     Debug.Print "a1  " & Format(Timer - t, "0.0000")
     t = Timer

     ReDim a2(1 To UBound(arr))
     For i = 1 To UBound(arr)
         ReDim a3(1 To UBound(arr, 2))
         For j = 1 To UBound(arr, 2)
             a3(j) = arr(i, j)
         Next
         a2(i) = a3

     Next
     Debug.Print "a2  " & Format(Timer - t, "0.0000")

End Sub
[/vba]

Автор - RAN
Дата добавления - 11.06.2014 в 14:11
Rioran Дата: Среда, 11.06.2014, 14:38 | Сообщение № 84
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Надежда всё ещё живёт, поэтому снова напомню, что тема посвящена живому общению и обмену опытом =)

Пока разбираюсь с вариантом RAN, хотел бы кинуть затравку. Я слышал, что есть массивы, где по ключу подбираются уникальные записи. Давайте рассмотрим также подробно и классно, как Gustav и SkyPro делали в этой теме?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 11.06.2014, 14:39
 
Ответить
СообщениеНадежда всё ещё живёт, поэтому снова напомню, что тема посвящена живому общению и обмену опытом =)

Пока разбираюсь с вариантом RAN, хотел бы кинуть затравку. Я слышал, что есть массивы, где по ключу подбираются уникальные записи. Давайте рассмотрим также подробно и классно, как Gustav и SkyPro делали в этой теме?

Автор - Rioran
Дата добавления - 11.06.2014 в 14:38
SkyPro Дата: Среда, 11.06.2014, 15:19 | Сообщение № 85
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
По CopyMemory накидал пример:
[vba]
Код
Public Declare Sub CopyMemory Lib _
     "kernel32" Alias "RtlMoveMemory" _
     (Destination As Any, Source As Any, _
     ByVal Length As Long)
    
Sub testCopyMemory()
Dim i&
Dim arFrom1#(1000), arFrom2#(1000), arTo#(1000, 1 To 2) ' обьявили 3 массива _
                    2 откуда будем копировать (одномерные) _
                    1 куда будем копировать (двумерный)
Randomize ' заполним случайными числами с запятой (мы ведь массивы дабл обьявили)
     For i = LBound(arFrom1) To UBound(arFrom1)
         arFrom1(i) = Rnd
         arFrom2(i) = Rnd
     Next
'выведем на лист для последующей проверки
[a2].Resize(UBound(arFrom1)) = Application.Transpose(arFrom1)
[b2].Resize(UBound(arFrom2)) = Application.Transpose(arFrom2)

'А теперь копируем два одномерных массива в один двумерный
'           Куда,     Откуда,       Длинна (в байтах)
CopyMemory arTo(0, 1), arFrom1(0), 1000 * 8
CopyMemory arTo(0, 2), arFrom2(0), 1000 * 8
'Так как у нас даблы, то один дабл весит 8 байт. Соответственно умножаем на количество элементов.

'и выводим на лист для сверки :-)
[d2].Resize(UBound(arTo), 2) = arTo
End Sub
[/vba]

Точно так же из двумерного можно разложить на одномерные.


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Среда, 11.06.2014, 15:22
 
Ответить
СообщениеПо CopyMemory накидал пример:
[vba]
Код
Public Declare Sub CopyMemory Lib _
     "kernel32" Alias "RtlMoveMemory" _
     (Destination As Any, Source As Any, _
     ByVal Length As Long)
    
Sub testCopyMemory()
Dim i&
Dim arFrom1#(1000), arFrom2#(1000), arTo#(1000, 1 To 2) ' обьявили 3 массива _
                    2 откуда будем копировать (одномерные) _
                    1 куда будем копировать (двумерный)
Randomize ' заполним случайными числами с запятой (мы ведь массивы дабл обьявили)
     For i = LBound(arFrom1) To UBound(arFrom1)
         arFrom1(i) = Rnd
         arFrom2(i) = Rnd
     Next
'выведем на лист для последующей проверки
[a2].Resize(UBound(arFrom1)) = Application.Transpose(arFrom1)
[b2].Resize(UBound(arFrom2)) = Application.Transpose(arFrom2)

'А теперь копируем два одномерных массива в один двумерный
'           Куда,     Откуда,       Длинна (в байтах)
CopyMemory arTo(0, 1), arFrom1(0), 1000 * 8
CopyMemory arTo(0, 2), arFrom2(0), 1000 * 8
'Так как у нас даблы, то один дабл весит 8 байт. Соответственно умножаем на количество элементов.

'и выводим на лист для сверки :-)
[d2].Resize(UBound(arTo), 2) = arTo
End Sub
[/vba]

Точно так же из двумерного можно разложить на одномерные.

Автор - SkyPro
Дата добавления - 11.06.2014 в 15:19
Hugo Дата: Среда, 11.06.2014, 15:38 | Сообщение № 86
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
SkyPro, спасибо. А если стринги? :)
А если вариант? Не, проще циклом...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеSkyPro, спасибо. А если стринги? :)
А если вариант? Не, проще циклом...

Автор - Hugo
Дата добавления - 11.06.2014 в 15:38
SkyPro Дата: Среда, 11.06.2014, 15:46 | Сообщение № 87
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Hugo, нужно считать длинну копируемого участка в байтах. Для этого тоже есть апи, но я еще не разобрался :)
Я о CopyMemory узнал два часа назад.


skypro1111@gmail.com
 
Ответить
СообщениеHugo, нужно считать длинну копируемого участка в байтах. Для этого тоже есть апи, но я еще не разобрался :)
Я о CopyMemory узнал два часа назад.

Автор - SkyPro
Дата добавления - 11.06.2014 в 15:46
Hugo Дата: Среда, 11.06.2014, 15:56 | Сообщение № 88
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Так если берём с листа неизвестно что (variant) - определить длину нужно перебором? В общем я узнал давно - но не применял, т.к. такие гарантированные числа бывают редко.
Попробовал воткнуть в пример empty и строку - в результате перенеслось всё в нулях... :(
Видать к массивам вариант нужны другие числа...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеТак если берём с листа неизвестно что (variant) - определить длину нужно перебором? В общем я узнал давно - но не применял, т.к. такие гарантированные числа бывают редко.
Попробовал воткнуть в пример empty и строку - в результате перенеслось всё в нулях... :(
Видать к массивам вариант нужны другие числа...

Автор - Hugo
Дата добавления - 11.06.2014 в 15:56
SkyPro Дата: Среда, 11.06.2014, 16:08 | Сообщение № 89
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
В любом случае кому-нибудь пригодится. :)


skypro1111@gmail.com
 
Ответить
СообщениеВ любом случае кому-нибудь пригодится. :)

Автор - SkyPro
Дата добавления - 11.06.2014 в 16:08
RAN Дата: Среда, 11.06.2014, 18:58 | Сообщение № 90
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Я слышал, что есть массивы, где по ключу подбираются уникальные записи.

Это не массивы, а словари
Как раз на них и реализован макрос здесь


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Я слышал, что есть массивы, где по ключу подбираются уникальные записи.

Это не массивы, а словари
Как раз на них и реализован макрос здесь

Автор - RAN
Дата добавления - 11.06.2014 в 18:58
Формуляр Дата: Понедельник, 16.06.2014, 10:51 | Сообщение № 91
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Видать к массивам вариант нужны другие числа...

Каждый элемент массива Variant может содержать не только данные, но и ссылки на размещённые в других участках памяти объекты и массивы (понятно-дело, на то он и Variant). При копировании массива подобным "пиратским" способом VBA остаётся в неведении, о копировании ссылки на объект, следовательно указываемый участок памяти в любой момент может оказаться очищен. :(
Таким образом применять CopyMemory можно только для данных фиксированной длины.
Ну или отслеживать все ссылки и дублировать их вручную. :D


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 16.06.2014, 10:52
 
Ответить
Сообщение
Видать к массивам вариант нужны другие числа...

Каждый элемент массива Variant может содержать не только данные, но и ссылки на размещённые в других участках памяти объекты и массивы (понятно-дело, на то он и Variant). При копировании массива подобным "пиратским" способом VBA остаётся в неведении, о копировании ссылки на объект, следовательно указываемый участок памяти в любой момент может оказаться очищен. :(
Таким образом применять CopyMemory можно только для данных фиксированной длины.
Ну или отслеживать все ссылки и дублировать их вручную. :D

Автор - Формуляр
Дата добавления - 16.06.2014 в 10:51
Hugo Дата: Понедельник, 16.06.2014, 11:07 | Сообщение № 92
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Т.е. CopyMemory в работе с данными листа практически неприменим...
Или сперва взять данные в массив, его циклом перебрать и преобразовать что можно/нужно в определённый тип в другой массив, затем уже CopyMemory, что уже и не нужно.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеТ.е. CopyMemory в работе с данными листа практически неприменим...
Или сперва взять данные в массив, его циклом перебрать и преобразовать что можно/нужно в определённый тип в другой массив, затем уже CopyMemory, что уже и не нужно.

Автор - Hugo
Дата добавления - 16.06.2014 в 11:07
Rioran Дата: Среда, 25.06.2014, 14:23 | Сообщение № 93
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Предложение вводного курса в Tableau по-прежнему актуально.

Возможно, у Вас есть интересные спецефические знания, которыми Вы готовы поделиться?

В данный момент интересуют Access, VBA & Access, VBA & PowerPoint, MDX.

Полагаю, что гуру Excel наверняка знакомы с чем-то из этого набора :D


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеПредложение вводного курса в Tableau по-прежнему актуально.

Возможно, у Вас есть интересные спецефические знания, которыми Вы готовы поделиться?

В данный момент интересуют Access, VBA & Access, VBA & PowerPoint, MDX.

Полагаю, что гуру Excel наверняка знакомы с чем-то из этого набора :D

Автор - Rioran
Дата добавления - 25.06.2014 в 14:23
Мир MS Excel » Работа и общение » Неформальное общение » Обмен знаниями: VBA-массивы на Tableau (Москва) (Предлагаю обменяться знаниями в формате личной встречи.)
  • Страница 5 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!