2012-05-30 4 views
0

Я не могу найти документацию для поддержки моих результатов, но именно поэтому я здесь. В моих модулях я объявляю несколько глобальных массивов, это само по себе не проблема, но то, что, похоже, происходит, заключается в том, что если я попытаюсь объявить несколько массивов в одном выражении, то будет инициализировано только первое. Может ли кто-нибудь подтвердить это как поведение и/или указать мне на документацию, которая поддерживает это?Excel VBA Глобальные переменные

Пример не работает заявление

Global arr1, arr2, arr3 

Когда я иду в код, если я смотрю на определение arr1 его можно найти. Если я ищу либо arr2, либо arr3, я получаю сообщение о том, что «Идентификатор под cusor не распознается». Если я перемещу arr3 на новую линию и декальр как таковой:

Global arr1, arr2 
Global arr3 

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

+1

'Global а, б, c' прекрасно, все три должны быть определены без проблем, вам нужно будет для расширения вашего примера. Вы можете добавить 'option explicit' в начало модуля; это приведет к тому, что VBA поднимет ошибку, если вы попытаетесь использовать переменную uneclared/out of scope. (Его также лучше определить тип 'global a() как строка, b() как строка ...') –

+1

В обоих случаях все переменные '' arr1'', '' arr2'' и '' arr3'' if объявленный так, как вы указали, должен работать. И все это будет тип '' variant''. Если вы явно не объявляете какой-либо тип, все переменные становятся '' TypeOf''' 'variant'' по умолчанию. – Cylian

+0

Я также могу объявить переменные, как указано выше, и посмотреть их определения в следующем коде в том же и других модулях. Во второй рекомендации @AlexK. использовать Option Explicit. Одна вещь о глобальных переменных заключается в том, что они не могут быть объявлены внутри класса - он не будет компилироваться (но это явно не ваша проблема). –

ответ

0

Это работает

Global arr1, arr2, arr3 

Sub test() 

    Debug.Print CLng(arr1) 
    Debug.Print CLng(arr2) 
    Debug.Print CLng(arr3) 

End Sub 

Как печатает три нуля. Вы говорите «если я ищу определение», но я не уверен, что это значит. Если я поставлю точку останова в коде и наведите указатель мыши на переменные, все они вернутся «Пусто».

0

Я не уверен в использовании «Global» вместо «Public». Я не думаю, что первое действительно документировано. Но все равно, arrX - все варианты типа. они не являются массивами конкретно, пока не будут принуждаться. Как уже упоминалось в предыдущем комментарии, массивы могут быть объявлены следующим образом: Dim arr1(), как MyType Dim arr2 (от 1 до 10), как MyType

где-то в коде также необходимо инициализировать структуру arr1 Redim arr1 (i-j)

Это намного безопаснее и эффективнее, чем путать с вариантами. Варианты могут быть эффективными для чтения и записи блоков данных, но лучше всего конвертировать их в массивы, если вы собираетесь работать с ними много.

Вот несколько ссылок, кроме MSDN:

http://www.cpearson.com/excel/topic.aspx

http://fastexcel.wordpress.com/2011/05/25/writing-efficient-vba-udfs-part-1/

Смежные вопросы