В начале опять немного "эмоций". Судя по всему Вы абсолютный ноль в VBA. И это нормально. Все такими были, и во многом остаемся. Век живи - век учись. Но при этом не надо делать широковещательных заявлений типа:
А басик - он как был 20 лет назад примитивным так и остается
Хотя это и очень по нашенски:
Пастернака я не читал, но гневно осуждаю.
У людей, мало-мальски понимающих о чем идет речь, ничего кроме раздражения такой подход к дискуссии вызвать не может. Повторюсь: в предмете надо разбираться, а критиковать аргументированно.
По сути. Так дело у Вас не пойдет. Метод научного тыка конечно самый лучший метод, но вначале разберитесь с основными понятиями языка: переменные и константы, их типы, "время жизни" и "область видимости", процедуры, функции, события уровня приложения, документа и т. п. Лучше всего почитать что-нибудь из разряда "VBA для чайников".
Далее небольшой ликбез, коротенько. В модуле есть область описания (Declarations) в которой и объявляются константы, переменные и функции, и определенные разработчиком процедуры (функции), в которых эти самые константы, переменные, функции используются. После того как Вы объявили (инициализировали) переменную ей присваивается значение "по умолчанию": String - пустая строка, Boolean - False, Long - 0, Variant - Empty и т. д. "Свое" значение им присваивается в определенной Вами процедуре (функции). После чего в зависимости от "времени жизни" и "области видимости" ("локальная" или "глобальная" переменная) она и используется в других процедурах (функциях). Лично я предпочитаю не использовать "глобальных" переменных, а получать их значения так, как и описал в > bender (2004-07-17 14:03:34). Но это дело вкуса и привычек. Public конечно проще. Ну а Вы пытаетесь присвоить ей в цикле значения в области описания. Естественно будет ошибка. Ну а Ваш код будет приблизительно такой.
Option Explicit
Option Base 0
Option Compare Text
'Объявляем глобальную переменную
Public myArr As Variant
'Записываем данные в объявленную переменную
Public Sub createMyArr()
Const myPrompt = "Введите верхнюю границу массива"
Dim upperBound As Integer, i As Integer, tempArr() As Integer
'Получаем верхнюю границу массива
upperBound = ThisDrawing.Utility.GetInteger(vbCr & myPrompt & " - ")
If IsNumeric(upperBound) = True Then
For i = 0 To upperBound
ReDim Preserve tempArr(0 To i) As Integer
tempArr(i) = i
Next
myArr = tempArr
Else
MsgBox "Очепятка, однако!", vbCritical, myPrompt
End If
End Sub
'Читаем данные. Эта процедура может быть в другом модуле.
Public Sub readMyArr()
Const myPrompt = "Чтение массива из глобальной переменной"
Dim i As Integer, tempStr As String
If IsArray(myArr) = True Then
tempStr = "В массив записаны следующие значения:" & vbCr & vbTab
For i = LBound(myArr, 1) To UBound(myArr, 1)
tempStr = tempStr & myArr(i) & vbCr & vbTab
Next
MsgBox tempStr, vbInformation, myPrompt
Else
MsgBox "Ошибка инициализации массива.", vbCritical, myPrompt
End If
End Sub
Еще пару слов. Опять же на мой вкус лучше не использовать динамические, а тем паче статические массивы. Возникают трудности с их проверкой. А лучше использовать переменные типа Variant (так, как в приведенном коде). Это первое. И второе. По поводу использования переменных "всегда и везде". Буду очень рад ошибиться, но по моему уважаемый 3dcad не прав. Повторю: переменную, объявленную как Public в каком-нибудь модуле проекта, можно использовать во всех других процедурах (функциях) этого самого проекта, но нельзя использовать в другом проекте. Поправьте меня, если я заблуждаюсь.
И последнее. Вы просили
где разжиться исходниками высокого качества и уровня с комментариями, чтобы изучать приёмы программирования на этом ..., ......., ..., но очень любимом в Редмонде языке.
http://www.cad.dp.ua/stats/a_vba/
Очень хорошие примеры, практически энциклопедия по программированию на VBA для АКАДа. Ну и справка, конечно.