Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как объединить 2 динамических массива в VBA / 10 сообщений из 10, страница 1 из 1
12.10.2010, 08:17
    #36893842
Komil_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Please, подскажите как объединить 2 динамических массива в VBA.
Массив № 1 имеет N произвольное количество элементов,
Массив № 2 имеет M произвольное количество элементов.
Мне нужно получить Массив № 3, который с 1 по N должен иметь одинаковые элементы с Массивов № 1, а начиная с N+1 по N+M должен иметь одинаковые элементы с Массивов № 2.
Как это делается я забыл.

Заранее благодарю за скорейший ответ!
...
Рейтинг: 0 / 0
12.10.2010, 08:40
    #36893857
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Komil_,

Код: plaintext
1.
2.
3.
select * from tab1
union all
select * from tab2

хотя задание воспринимается весьма туго
...
Рейтинг: 0 / 0
12.10.2010, 08:48
    #36893867
Komil_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
ПЕНСИОНЕРКАKomil_,

Код: plaintext
1.
2.
3.
select * from tab1
union all
select * from tab2

хотя задание воспринимается весьма туго

Мне нужно объединить массива в VBA , а не в таблицах. Как в таблицах я знаю!
...
Рейтинг: 0 / 0
12.10.2010, 08:52
    #36893871
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Komil_,

Объявляете третий массив с длинной суммой этих двух
Или копимемори или перебором пихаете туда элементы
В чем проблема?

Код: plaintext
Dim Массив3(Lbound(Массив1) to Ubound(Массив1)+Ubound(Массив2)) As BlaBlaBla
...
Рейтинг: 0 / 0
12.10.2010, 08:55
    #36893875
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
точнее даже правильнее так

Код: plaintext
Dim Массив3(Lbound(Массив1) to Ubound(Массив1)+Ubound(Массив2)-Lbound(Массив2)) As BlaBlaBla
...
Рейтинг: 0 / 0
12.10.2010, 08:55
    #36893876
Komil_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
ShamanusKomil_,

Объявляете третий массив с длинной суммой этих двух
Или копимемори или перебором пихаете туда элементы
В чем проблема?

Код: plaintext
Dim Массив3(Lbound(Массив1) to Ubound(Массив1)+Ubound(Массив2)) As BlaBlaBla


А что означает "копимемори"? Это как? Я прошу прошения, но я не знаток по VBA.
...
Рейтинг: 0 / 0
12.10.2010, 08:58
    #36893880
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Komil_,

Копимемори это функция АПИ

MSDNСовет 171. Используйте функцию CopyMemory из Win32 API

При разработке приложений довольно часто встречается простая задача пересылки N последовательных байтов из одной области оперативной памяти в другую. В VB проблема возникает, когда такая область памяти определена не именем переменной, а в виде адреса (указателя — Pointer). К сожалению, встроенные средства VB не позволяют работать с адресами, а порой это крайне необходимо.

Так, некоторые функции Win API, используемые для получения информации о ресурсах системы (например, VerQueryValue), возвращают в качестве параметра адрес области памяти FiAddr&, где лежит искомая информация. Но как переписать эти данные, к примеру, в целочисленный массив для дальнейшей обработки в среде VB? Это можно сделать с помощью функций Win API.

В составе Win16 API для этого имелась функция HMemCpy:
Листинг 1.

Код: plaintext
1.
Declare Sub HMemCpy Lib "kernel"_
  (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Она появилась только в расширенном варианте функций в Windows 3.1 (в версии 3.0 ее не было), а в пакете VB 3.0 ее описание было приведено только в файле WIN31WH.HLP.

Что же касается Win32 API, то в описании WIN32API.TXT для VB 4.0 и 5.0 о функции HMemCpy или ее аналоге даже и не упоминается. Более того, в книге Дэна Эпплмана по Win32 API, на которую мы часто ссылаемся (о ней мы писали в Совете 133), ничего не говорится о подобной функции. Однако, поскольку такая функция действительно очень нужна, Дэн предлагает использовать процедуру agCopyData из его собственной библиотеки APIGI32.DLL, которая приводится на прилагаемом компакт-диске.

Все это выглядит весьма странно. Более тщательный поиск, проведенный с помощью специалиста московского отделения Microsoft Юрия Томашко, увенчался успехом — в Win32 есть функция копирования байтов CopyMemory и ее описание появилось в VB 6.0 в файле WIN32API.TXT. Почему Microsoft скрывает от пользователей VB 4.0 и 5.0 ее существование, и почему Дэн Эпплман хранит эту тайну — можно только гадать. Кстати, настоящее имя функции в библиотеке KERNEL32 — RtlMoveMemory:
Листинг 2.

Код: plaintext
1.
2.
3.
Public Declare Sub CopyMemory Lib _
  "kernel32" Alias "RtlMoveMemory" _
  (Destination As Any, Source As Any, _
  ByVal Length As Long)

Вот типичный пример применения этой функции:
Листинг 3.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Di& = VerQueryValue(VerBuf( 0 ), "\", FiAddr&, FiLen&)
' Возвращаются:
' FiAddr& - адрес области с информацией 
' о версии файла
' FiLen& - длина области в байтах
CopyMemory ByVal FiAddr&, Ffi,  52 
' Ffi - структура данных для информации о версии
' 52 - ее длина
CopyMemory можно использовать для создания очень полезных функций преобразования типов данных (см. Совет 172), а также для ускорения в сотни и даже тысячи раз выполнения операций, реализуемых традиционными средствами VB. Например, для копирования целых массивов или их фрагментов:
Листинг 4.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim Arr1!( 1000 ), Arr2!( 2000 ), i%
For i =  1  To  1000 : Arr1(i) = i +  0 . 1 : Next
' Вместо:
' For i = 1 To 1000: Arr2(1000 + i) = Arr1(i): Next
' Использовать:
CopyMemory Arr2( 1001 ), Arr1( 1 ),  1000  *  4 
'
MsgBox ("result =" & Arr2( 1600 ))
...
Рейтинг: 0 / 0
12.10.2010, 09:20
    #36893904
Komil_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Shamanus,

Спасибо большое!
...
Рейтинг: 0 / 0
12.10.2010, 11:25
    #36894203
aetak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
to Shamanus: один из лучших ответов, которые я встречал на этом сайте.
...
Рейтинг: 0 / 0
12.10.2010, 15:53
    #36895076
Cursky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить 2 динамических массива в VBA
Shamanus,

+1
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как объединить 2 динамических массива в VBA / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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