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

Вход

Регистрация

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

 

= Мир MS Excel/Как присвоить глобальной переменной указатель на массив? - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как присвоить глобальной переменной указатель на массив? (Макросы/Sub)
Как присвоить глобальной переменной указатель на массив?
Формуляр Дата: Воскресенье, 11.09.2011, 22:16 | Сообщение № 1
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Всем доброго времени суток!
Не соображу никак:
есть в модуле глобальный динамический массив,
процедура получает ссылку на внеш. массив (тоже динамич.) через аргумент,
как заставить глобальную ссылку указывать на этот внеш. массив?

[vba]
Код
Private gArr() as integer

Sub fillArray(ByRef xArr() as integer)
gArr=xArr
'А потом, например, вызывается рекурсивная процедура, которая этот массив меняет
ChangeArray(0)
end sub

sub ChangeArray(n as integer)
gArr(n, 1) = gArr(n, 2)    
ChangeArray(n+1)
end sub
[/vba]

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

Извиняюсь, если это - заезженная тема. Поиск всяко-разного вываливает кучу, но конкретного решения не нашёл, а теоретические справки типа
http://bbs.vbstreets.ru/viewtopic.php?t=26906
самому применить ума не хватает.


Excel 2003 EN, 2013 EN

Сообщение отредактировал Serge_007 - Четверг, 07.05.2015, 11:40
 
Ответить
СообщениеВсем доброго времени суток!
Не соображу никак:
есть в модуле глобальный динамический массив,
процедура получает ссылку на внеш. массив (тоже динамич.) через аргумент,
как заставить глобальную ссылку указывать на этот внеш. массив?

[vba]
Код
Private gArr() as integer

Sub fillArray(ByRef xArr() as integer)
gArr=xArr
'А потом, например, вызывается рекурсивная процедура, которая этот массив меняет
ChangeArray(0)
end sub

sub ChangeArray(n as integer)
gArr(n, 1) = gArr(n, 2)    
ChangeArray(n+1)
end sub
[/vba]

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

Извиняюсь, если это - заезженная тема. Поиск всяко-разного вываливает кучу, но конкретного решения не нашёл, а теоретические справки типа
http://bbs.vbstreets.ru/viewtopic.php?t=26906
самому применить ума не хватает.

Автор - Формуляр
Дата добавления - 11.09.2011 в 22:16
KuklP Дата: Воскресенье, 11.09.2011, 23:11 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Не очень-то понял. См. код.
Code
Option Explicit
Public arr(1 To 10)
Public Sub www()
     Dim i&
     For i = 1 To 10
         arr(i) = i
     Next
     Stop
End Sub
Public Sub www1()
     Dim i&
     For i = 1 To 10
         arr(i) = i * 2
     Next
     Stop
End Sub

Через add watch просматриваем массив arr.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеНе очень-то понял. См. код.
Code
Option Explicit
Public arr(1 To 10)
Public Sub www()
     Dim i&
     For i = 1 To 10
         arr(i) = i
     Next
     Stop
End Sub
Public Sub www1()
     Dim i&
     For i = 1 To 10
         arr(i) = i * 2
     Next
     Stop
End Sub

Через add watch просматриваем массив arr.

Автор - KuklP
Дата добавления - 11.09.2011 в 23:11
Формуляр Дата: Воскресенье, 11.09.2011, 23:18 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Не, KuklP,
это - не то.
Глобальный указатель на массив gArr будут потом использовать другие процедуры модуля.
Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.

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


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Воскресенье, 11.09.2011, 23:28
 
Ответить
СообщениеНе, KuklP,
это - не то.
Глобальный указатель на массив gArr будут потом использовать другие процедуры модуля.
Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.

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

Автор - Формуляр
Дата добавления - 11.09.2011 в 23:18
VovaK Дата: Понедельник, 12.09.2011, 06:42 | Сообщение № 4
Группа: Друзья
Ранг: Форумчанин
Сообщений: 116
Репутация: 41 ±
Замечаний: 0% ±

10
Формуляр, чтобы переменную сделать глобальной необходима директива в заголовке модуля:
Public gArr() as integer.
gArr() после такого объявления будет доступен во всех модулях...


Всем удачи. У нас все получится.
С уважением, Владимир.
 
Ответить
СообщениеФормуляр, чтобы переменную сделать глобальной необходима директива в заголовке модуля:
Public gArr() as integer.
gArr() после такого объявления будет доступен во всех модулях...

Автор - VovaK
Дата добавления - 12.09.2011 в 06:42
RAN Дата: Понедельник, 12.09.2011, 09:51 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Quote (Формуляр)
Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.

А как этот адрес выглядит?


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Quote (Формуляр)
Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.

А как этот адрес выглядит?

Автор - RAN
Дата добавления - 12.09.2011 в 09:51
KuklP Дата: Понедельник, 12.09.2011, 10:51 | Сообщение № 6
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Quote (Формуляр)
Глобальный указатель на массив gArr будут потом использовать другие процедуры модуля. Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.
А у меня что сделано? В одной процедуре присваиваем значения массиву, в другой меняем эти значения. В третьей можем делать с ним-же еще что-то и т.д. А массив один и тот же.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Quote (Формуляр)
Глобальный указатель на массив gArr будут потом использовать другие процедуры модуля. Поэтому нужно просто присвоить ему адрес массива xArr, определённого где-то вовне.
А у меня что сделано? В одной процедуре присваиваем значения массиву, в другой меняем эти значения. В третьей можем делать с ним-же еще что-то и т.д. А массив один и тот же.

Автор - KuklP
Дата добавления - 12.09.2011 в 10:51
RAN Дата: Понедельник, 12.09.2011, 11:19 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Сергей! Ты работаешь с массивом.
А Формуляр хочет с его адресом!?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеСергей! Ты работаешь с массивом.
А Формуляр хочет с его адресом!?

Автор - RAN
Дата добавления - 12.09.2011 в 11:19
Формуляр Дата: Понедельник, 12.09.2011, 12:07 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Quote (VovaK)
Формуляр, чтобы переменную сделать глобальной необходима директива в заголовке модуля: Public gArr() as integer. gArr() после такого объявления будет доступен во всех модулях...

Верное замечание, но сути проблемы не меняет. С областью видимости проблем нет, массив xArr для процедуры fillArray - доступен. Вопрос - как присвоить одной переменной динамич. массива адрес другого, уже существующего.

Quote (KuklP)
А массив один и тот же.

Массив-то и должен быть тот же, только обращаться я к нему хочу не напрямую, а через промежуточный указатель. (Может, не совсем точно выражаюсь, уж не знаю как иначе сформулировать)

Quote (RAN)
А как этот адрес выглядит?

Не очень понял вопрос.
В процедуру, где должно происходить присваивание он попадает как аргумент ByRef xArr() as integer
В вышестоящей процедуре формируется так:
Code
Private Sub test()
Dim bTree() As Integer
      ReDim bTree(5, 2)
      fillArray bTree
End Sub


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 12.09.2011, 12:11
 
Ответить
Сообщение
Quote (VovaK)
Формуляр, чтобы переменную сделать глобальной необходима директива в заголовке модуля: Public gArr() as integer. gArr() после такого объявления будет доступен во всех модулях...

Верное замечание, но сути проблемы не меняет. С областью видимости проблем нет, массив xArr для процедуры fillArray - доступен. Вопрос - как присвоить одной переменной динамич. массива адрес другого, уже существующего.

Quote (KuklP)
А массив один и тот же.

Массив-то и должен быть тот же, только обращаться я к нему хочу не напрямую, а через промежуточный указатель. (Может, не совсем точно выражаюсь, уж не знаю как иначе сформулировать)

Quote (RAN)
А как этот адрес выглядит?

Не очень понял вопрос.
В процедуру, где должно происходить присваивание он попадает как аргумент ByRef xArr() as integer
В вышестоящей процедуре формируется так:
Code
Private Sub test()
Dim bTree() As Integer
      ReDim bTree(5, 2)
      fillArray bTree
End Sub

Автор - Формуляр
Дата добавления - 12.09.2011 в 12:07
RAN Дата: Понедельник, 12.09.2011, 12:32 | Сообщение № 9
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Ниченепонимаю! surprised
Code
Dim xArr

Sub qqq()
xArr = [a1:a10].Value
Call www(xArr)
[b1:b10] = xArr
End Sub

Sub www(ByRef xArr)
For i = 1 To UBound(xArr)
xArr(i, 1) = xArr(i, 1) * 2
Next
End Sub


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Понедельник, 12.09.2011, 12:33
 
Ответить
СообщениеНиченепонимаю! surprised
Code
Dim xArr

Sub qqq()
xArr = [a1:a10].Value
Call www(xArr)
[b1:b10] = xArr
End Sub

Sub www(ByRef xArr)
For i = 1 To UBound(xArr)
xArr(i, 1) = xArr(i, 1) * 2
Next
End Sub

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

Excel 2003, 2013
Quote (RAN)
Сергей! Ты работаешь с массивом. А Формуляр хочет с его адресом!?
Мне показалось, что вы как раз верно меня поняли.

Если на примере последнего кода, то как-то так:
Code
'=== Module1
Dim xArr

Sub qqq()
xArr = [a1:a10].Value
Call www(xArr)
[b1:b10] = xArr
End Sub

'=== Module2
Dim gArr
Sub www(ByRef xArr)
Set gArr = xArr 'Так, конечно, нельзя - ошибка
call eee
End Sub

Sub eee()
For i = 1 To UBound(gArr)
gArr(i, 1) = gArr(i, 1) * 2
Next
End Sub


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 12.09.2011, 12:58
 
Ответить
Сообщение
Quote (RAN)
Сергей! Ты работаешь с массивом. А Формуляр хочет с его адресом!?
Мне показалось, что вы как раз верно меня поняли.

Если на примере последнего кода, то как-то так:
Code
'=== Module1
Dim xArr

Sub qqq()
xArr = [a1:a10].Value
Call www(xArr)
[b1:b10] = xArr
End Sub

'=== Module2
Dim gArr
Sub www(ByRef xArr)
Set gArr = xArr 'Так, конечно, нельзя - ошибка
call eee
End Sub

Sub eee()
For i = 1 To UBound(gArr)
gArr(i, 1) = gArr(i, 1) * 2
Next
End Sub

Автор - Формуляр
Дата добавления - 12.09.2011 в 12:56
KuklP Дата: Понедельник, 12.09.2011, 13:03 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Quote (RAN)
Сергей! Ты работаешь с массивом. А Формуляр хочет с его адресом!?
Зачем? Я понимаю, если работа с массивом ведется через API (rtlmovememory и т.д.). А VBA сам определяет нужные ему параметры через простую ссылку. Как у тебя:
Sub www(xArr)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Quote (RAN)
Сергей! Ты работаешь с массивом. А Формуляр хочет с его адресом!?
Зачем? Я понимаю, если работа с массивом ведется через API (rtlmovememory и т.д.). А VBA сам определяет нужные ему параметры через простую ссылку. Как у тебя:
Sub www(xArr)

Автор - KuklP
Дата добавления - 12.09.2011 в 13:03
Формуляр Дата: Понедельник, 12.09.2011, 13:06 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Коллеги!
Поймите меня правильно: я не то, что не могу справиться с задачей вцелом - я не могу справиться с ней именно этим способом (который по ряду обстоятельств кажется наиболее подходящим).
Форум ведь не только для спасения утопающих, но и для взаимного развития тоже (пусть поправит меня Сергей, если не так).
А потребность передать адрес массива в др. переменную у меня возникает регулярно - и каждый раз приходится как-то изголяться... sad


Excel 2003 EN, 2013 EN
 
Ответить
СообщениеКоллеги!
Поймите меня правильно: я не то, что не могу справиться с задачей вцелом - я не могу справиться с ней именно этим способом (который по ряду обстоятельств кажется наиболее подходящим).
Форум ведь не только для спасения утопающих, но и для взаимного развития тоже (пусть поправит меня Сергей, если не так).
А потребность передать адрес массива в др. переменную у меня возникает регулярно - и каждый раз приходится как-то изголяться... sad

Автор - Формуляр
Дата добавления - 12.09.2011 в 13:06
KuklP Дата: Понедельник, 12.09.2011, 13:16 | Сообщение № 13
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Формуляр, мы просто не понимаем Вас:-) Ну вот пример с Вашим кодом(исправленым). Чего не хватает?
К сообщению приложен файл: 7215022.xls (25.5 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Понедельник, 12.09.2011, 13:22
 
Ответить
СообщениеФормуляр, мы просто не понимаем Вас:-) Ну вот пример с Вашим кодом(исправленым). Чего не хватает?

Автор - KuklP
Дата добавления - 12.09.2011 в 13:16
KuklP Дата: Понедельник, 12.09.2011, 13:26 | Сообщение № 14
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Или зачем передавать массив в качестве параметра, VBA и так хранит в памяти ссылку на массив.
К сообщению приложен файл: 8477580.xls (26.0 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеИли зачем передавать массив в качестве параметра, VBA и так хранит в памяти ссылку на массив.

Автор - KuklP
Дата добавления - 12.09.2011 в 13:26
Формуляр Дата: Понедельник, 12.09.2011, 14:30 | Сообщение № 15
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
KuklP,
немного подкорректировал 7215022.xls, чтоб был 2-мерный массив (для чистоты эксперимента).
Но принципиальное отличие здесь:
Code
Call www(xArr)
[c1:d10] = xArr

Как видите - с исходным массивом ничего не происходит.
eee() работает с его копией.
К сообщению приложен файл: 7429820.xls (25.0 Kb)


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 12.09.2011, 14:55
 
Ответить
СообщениеKuklP,
немного подкорректировал 7215022.xls, чтоб был 2-мерный массив (для чистоты эксперимента).
Но принципиальное отличие здесь:
Code
Call www(xArr)
[c1:d10] = xArr

Как видите - с исходным массивом ничего не происходит.
eee() работает с его копией.

Автор - Формуляр
Дата добавления - 12.09.2011 в 14:30
Формуляр Дата: Понедельник, 12.09.2011, 16:38 | Сообщение № 16
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Вот что удалось нарыть на данный момент:
http://www.vbnet.ru/articles/Showarticle.aspx?id=205
http://base.vingrad.ru/view/2048-Kak-ispolzovat-Assembler-v-VB
Это уже "теплее", но присобачить эти идеи к собственному коду пока не выходит.
В частности, не находится ф-ция GetMem4(), а VarPtr() отказывается кушать массив. sad

PS: Ага - разобрался с GetMem4() и VarPtr()! Накосячил с непривычки с объявлением внеш. ф-ций.
Похоже, дело пошлО! smile


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 12.09.2011, 18:21
 
Ответить
СообщениеВот что удалось нарыть на данный момент:
http://www.vbnet.ru/articles/Showarticle.aspx?id=205
http://base.vingrad.ru/view/2048-Kak-ispolzovat-Assembler-v-VB
Это уже "теплее", но присобачить эти идеи к собственному коду пока не выходит.
В частности, не находится ф-ция GetMem4(), а VarPtr() отказывается кушать массив. sad

PS: Ага - разобрался с GetMem4() и VarPtr()! Накосячил с непривычки с объявлением внеш. ф-ций.
Похоже, дело пошлО! smile

Автор - Формуляр
Дата добавления - 12.09.2011 в 16:38
KuklP Дата: Понедельник, 12.09.2011, 16:44 | Сообщение № 17
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Quote (Формуляр)
Как видите - с исходным массивом ничего не происходит. eee() работает с его копией.

А что с ним должно произойти? Вы его никак не меняли. Я опять ничего не понял. Вот пример, где меняется исходный.
К сообщению приложен файл: 7859926.xls (25.5 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Quote (Формуляр)
Как видите - с исходным массивом ничего не происходит. eee() работает с его копией.

А что с ним должно произойти? Вы его никак не меняли. Я опять ничего не понял. Вот пример, где меняется исходный.

Автор - KuklP
Дата добавления - 12.09.2011 в 16:44
Формуляр Дата: Понедельник, 12.09.2011, 18:17 | Сообщение № 18
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Quote (KuklP)
А что с ним должно произойти? Вы его никак не меняли. Я опять ничего не понял. Вот пример, где меняется исходный.

Да. Мне нужно, чтоб менялся исходный.
Но, при этом, eee() не должна ничего заранее знать про обрабатываемый массив. Ф-ция www() должна быть универсальной и вызываться из любого модуля, чтобы передать адрес обрабатываемого массива в eee().

Даже если вы меня убедите в том, что в данном случае такой подход неэффективен, я всё равно, споткнусь об эту же техническую проблему через месяц-другой. Мне нужно решить именно техническую проблему, а не найти оптимальное решение всей задачи. (Именно поэтому я привёл абстрактный короткий пример, а не реальный громоздкий код.)
Тем более, что к решению я, похоже, уже близок. smile


Excel 2003 EN, 2013 EN
 
Ответить
Сообщение
Quote (KuklP)
А что с ним должно произойти? Вы его никак не меняли. Я опять ничего не понял. Вот пример, где меняется исходный.

Да. Мне нужно, чтоб менялся исходный.
Но, при этом, eee() не должна ничего заранее знать про обрабатываемый массив. Ф-ция www() должна быть универсальной и вызываться из любого модуля, чтобы передать адрес обрабатываемого массива в eee().

Даже если вы меня убедите в том, что в данном случае такой подход неэффективен, я всё равно, споткнусь об эту же техническую проблему через месяц-другой. Мне нужно решить именно техническую проблему, а не найти оптимальное решение всей задачи. (Именно поэтому я привёл абстрактный короткий пример, а не реальный громоздкий код.)
Тем более, что к решению я, похоже, уже близок. smile

Автор - Формуляр
Дата добавления - 12.09.2011 в 18:17
RAN Дата: Понедельник, 12.09.2011, 18:57 | Сообщение № 19
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Здесь функция и процедура в модуле2 ничего не знают о модуле1
Но все работает
К сообщению приложен файл: 9517809.xls (41.0 Kb)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Понедельник, 12.09.2011, 19:09
 
Ответить
СообщениеЗдесь функция и процедура в модуле2 ничего не знают о модуле1
Но все работает

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

Excel 2003, 2013
Ну вот, разобрался, кажись.

Получилось как-то так
Code

'=== Module1
Public xArr() As Variant

Sub qqq()
xArr = [a1:b10].Value
Call www(xArr)
[c1:d10] = xArr
End Sub

Code

'=== Module2
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
Declare Sub GetMem4 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)

Private gArr() As Variant

Sub www(ByRef arr() As Variant)
Dim adrLng As Long
        GetMem4 VarPtrArray(arr), VarPtrArray(gArr)
        Call eee
        adrLng = 0
        GetMem4 VarPtr(adrLng), VarPtrArray(gArr) 'Думаю, важно обнулить указатель, чтобы избежать влияния gArr на внеш.массив
End Sub

Sub eee()
Dim i&
        For i = 1 To UBound(gArr)
            gArr(i, 1) = gArr(i, 1) * 2
        Next
End Sub


Пожалуй, тему можно на этом закрыть.

Спасибо RAN и KuklP за искреннее стремление убедить меня не заниматься глупостями.
Искомое решение и в самом деле - далеко не самое простое и корректное. Но важно было его найти, хотя бы для того, чтобы иметь возможность от него отказаться. smile
К сообщению приложен файл: 5510467.xls (27.5 Kb)


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Понедельник, 12.09.2011, 21:39
 
Ответить
СообщениеНу вот, разобрался, кажись.

Получилось как-то так
Code

'=== Module1
Public xArr() As Variant

Sub qqq()
xArr = [a1:b10].Value
Call www(xArr)
[c1:d10] = xArr
End Sub

Code

'=== Module2
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
Declare Sub GetMem4 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)

Private gArr() As Variant

Sub www(ByRef arr() As Variant)
Dim adrLng As Long
        GetMem4 VarPtrArray(arr), VarPtrArray(gArr)
        Call eee
        adrLng = 0
        GetMem4 VarPtr(adrLng), VarPtrArray(gArr) 'Думаю, важно обнулить указатель, чтобы избежать влияния gArr на внеш.массив
End Sub

Sub eee()
Dim i&
        For i = 1 To UBound(gArr)
            gArr(i, 1) = gArr(i, 1) * 2
        Next
End Sub


Пожалуй, тему можно на этом закрыть.

Спасибо RAN и KuklP за искреннее стремление убедить меня не заниматься глупостями.
Искомое решение и в самом деле - далеко не самое простое и корректное. Но важно было его найти, хотя бы для того, чтобы иметь возможность от него отказаться. smile

Автор - Формуляр
Дата добавления - 12.09.2011 в 21:35
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как присвоить глобальной переменной указатель на массив? (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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