для чего служит команда option base 1

Option Base statement

Used at the module level to declare the default lower bound for array subscripts.

Syntax

Remarks

Because the default base is 0, the Option Base statement is never required. If used, the statement must appear in a module before any procedures. Option Base can appear only once in a module and must precede array declarations that include dimensions.

The To clause in the Dim, Private, Public, ReDim, and Static statements provides a more flexible way to control the range of an array’s subscripts. However, if you don’t explicitly set the lower bound with a To clause, you can use Option Base to change the default lower bound to 1. The base of an array created with the ParamArray keyword is zero; Option Base does not affect ParamArray (or the Array function, when qualified with the name of its type library, for example VBA.Array).

The Option Base statement only affects the lower bound of arrays in the module where the statement is located.

Example

This example uses the Option Base statement to override the default base array subscript value of 0. The LBound function returns the smallest available subscript for the indicated dimension of an array. The Option Base statement is used at the module level only.

See also

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Инструкция Option Base

для чего служит команда option base 1 для чего служит команда option base 1 для чего служит команда option base 1 для чего служит команда option base 1

для чего служит команда option base 1

для чего служит команда option base 1

Объявление массива

Вот пример описания одномерного массива для данных типа Integer.

Dim ЧисловойМассив(10) As Integer

Оно ничем не отличается от описания переменной, которое обсуждалось ранее, за единственным исключением — после имени переменной вводится число в круглых скобках, указывающее VBA, что Вы объявляете не одиночную переменную, а массив, и определяющее его структуру. Здесь мы задали только одно число, значит, будет создан одномерный массив ЧисловойМассив, предназначенный для хранения 10 целых чисел. В действительности число 10 определяет верхнюю границу индексов массива. Если Вы указываете, что массив должен содержать 10 элементов, VBA по умолчанию полагает, что номер первого элемента — 1.

Объявление двухмерного массива выглядит так:

Dim ДвухмерныйМассив (10,20) As String

Таблица ДвухмерныйМассив состоит из 10 строк и 20 столбцов и содержит до 200 строковых переменных.

И еще один пример — описание трехмерного массива типаVariant:

Dim ТрехмерныйМассив(5,50,100) As Variant

Массив ТрехмерныйМассив состоит из пяти таблиц, каждая из которых содержит по 50 строк и 100 столбцов. Он может содержать до 25 000 элементов.

Как видите, при увеличении размерности быстро возрастают и требования к объему памяти. При определении массива VBA выделяет достаточно места для всех его элементов. Точный объем выделяемой памяти зависит от размера массива и типа данных в нем. Например, для целочисленного массива, содержащего 10 элементов, требуется 20 байт, поскольку каждое целое число занимает 2 байта. Трехмерный массив ТрехмерныйМассив, описанный выше и состоящий из значений типа Variant, займет не менее 400 000 байт (25 000 раз по 16 байт). Имейте в виду, что массивы с большим числом измерений займут много памяти и сильно снизят производительность. При попытке объявить массив с объемом, превышающим доступную память компьютера, Вы увидите на экране сообщение «Недостаточно памяти» (Out of Memory).

Нумерация массивов VBA может начинаться с 0 или 1. Конкретный способ указан в инструкции Option Base в начале модуля. Так, Option Base 0 задает нумерацию всех массивов по умолчанию с 0, a Option Base 1 — с 1. В отсутствие инструкции Option Base нумерация массивов по умолчанию начинается с 0. Но в следующих примерах мы для простоты считаем, что она начинается с 1.

Источник

Для чего служит команда option base 1

Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и тебе необходимо как-то поместить их в памяти, что-бы потом с ними работать. Без использования массива, ты должен объявить пятьдесят переменных и в каждую записать имя файла. Это безумие. Но еще большее безумие потом работать с этими переменными, пытаясь найти в них нужные нужные тебе данные. Иное дело массив. Имея его (в хорошем смысле), можно под одним именем запомнить все твои пятьдесят имен файлов и перебирать их сколько угодно, в любом цикле, меняя лишь индекс члена массива. Т.е., другими словами,

Dim Chislo(9) As Long

Option Explicit
Option Base 1
Dim Chislo(10) As Long
‘так как мы используем оператор Option Base, то элементы массива нумеруются с единицы
Dim x As Long

Private Sub Form_Load()
Text1.Text = «»
For x = 1 To 10
Chislo(x) = x * 8
Next x
End Sub

Как видите, в цикле мы вместо номера элемента просто используем значение x, и таким образом перебираются все элементы массива. Теперь мы выведем значения элементов массива в Text1 в процедуре Command1.

Private Sub Command1_Click()
For x = 1 To 10
Text1.Text = Text1.Text & Chislo(x) & vbCrLf
Next x
End Sub

Таким образом наш одномерный массив представляет собой аналог таблицы с одной строчкой:

Теперь переделаем его в двухмерный массив, чтобы в еще одну строчку записать множитель, на который умножается число 8. Переделаем наш код на такой:

Option Explicit
Option Base 1
Dim Chislo(10, 2) As Long
Dim x As Long

Private Sub Form_Load()
Text1.Text = «»
For x = 1 To 10
Chislo(x, 1) = x
Chislo(x, 2) = x * 8
Next x

Private Sub Command1_Click()
For x = 1 To 10
Text1.Text = Text1.Text & «8 x » & Chislo(x, 1) & » = » & Chislo(x, 2) & vbCrLf
Next x
End Sub

И наш массив будет представлять собой следующее

Часто возникает ситуация, когда мы не знаем заранее, сколько элементов массива мы будем использовать заранее. Поэтому массив объявляется без размерности, например
Dim Mass () as String
Но, перед его непосредственным использованием, его надо переобъявить c указанием размерности. Делается это с помощью оператора Redim.

Redim Mass (5) as String

Redim Preserve Mass (5) as String

Идем дальше. Поместим на форму объекты Dir1 и Text1. Начнем писать код. Обратите внимание, что процедуры Form_Load у нас не будет, так как под это событие обрабатывать нам нечего. Ну-с, фигачим

Dim Attr As Long ‘числовая, для атрибута файла
Dim AttributFile As String ‘строковая, для записи атрибута в виде слов

Private Sub Dir1_Change()
Text1.Text = «»
FileName = «»
X = 0
OurDir = Dir1.Path
ScanDir ‘переходим к процедуре сканирования файлов
End Sub

Далее в процедуре ScanDir все, с учетом комментариев, понятно:

Private Sub ScanDir()
FileName = Dir(OurDir & «\*.*», 0) ‘присваиваем переменной значение функции Dir для всех файлов
ReDim Files(2, 1) ‘переобъявляем массив с минимальной размерностью, иначе может возникать ошибка
Do Whil e FileName <> «» ‘запускаем цикл, до тех пор, пока Dir не вернет пустую строку
X = X + 1 ‘счетчик элементов массива
ReDim Preserve Files(2, X) ‘переобъявляем массив по счетчику, сохраняя уже имеющиеся в нем данные
AttributFile = «» ‘обнуляем переменные
Attr = 0
‘проверяем файл на атрибут архивный
Attr = GetAttr(OurDir & «\» & FileName) And vbArchive
If Attr > 0 Then AttributFile = AttributFile & » Архивный»
‘проверяем файл на атрибут только для чтения
Attr = GetAttr(OurDir & «\» & FileName) And vbReadOnly
If Attr > 0 Then AttributFile = AttributFile & » Только чтение»
‘проверяем файл на атрибут скрытый для порядка, Бейсик все равно не видит такие файлы
Attr = GetAttr(OurDir & «\» & FileName) And vbHidden
If Attr > 0 Then AttributFile = AttributFile & » Скрытый»

Files(1, X) = FileName ‘пишем в массив имя файла
Files(2, X) = AttributFile ‘пишем в массив атрибут файла
FileName = Dir() ‘запускаем функцию Dir без атрибутов
Loop ‘и так в цикле, пока файлы в директории не закончатся

If X > 0 Then
Sort ‘ если хоть один файл найден,
‘отправляемся к процедуре сортировки
Else
Text1.Text = «Файлов не найдено» ‘в противном случае выводим сообщение.
End If
End Sub


Основная прелесть массивов в том, что с данными, записанными в них, можно что угодно делать: сортировать, разбивать на группы, осуществлять поиск, делать выборки и т.п. Сейчас мы наш массив отсортирум по возрастанию имен файлов. Скажу сразу, что алгоритмы сортировки разработаны и существуют давно. Приводимый в примере был разработан лично мною, а возможное совпадение его с другими алгоритмами совершенно случайно. Но прежде, чем перейти к сортировке, я хочу рассказать вот о чем.
Поскольку количество элементов нашего массива меняется, а для сортировки его с помощью циклов For. Next нам надо точно знать минимальный (нижняя граница) и максимальный (верхняя граница) доступные значения индекса массива, то я использую функции LBound для определения минимального индекса и UBound для определения максимального индекса указанной размерности. Синтаксис их такой

Переменная=LBound(Massive,1) ‘возвращает в Переменную минимальный индекс массива Massive по размерности 1.
Переменная=UBound(Massive,1) ‘возвращает в Переменную максимальный индекс массива Massive по размерности 1
.

If Files(1, N) Then ‘если значение в массиве меньше, чем в переменной
Peremen = Files(1, N) ‘то присваиваем переменным Peremen и Peremen2 новые, меньшие значения
Peremen2 = Files(2, N)
K = N ‘присваиваем номер найденного элемента массива переменной K
End If
Next N
‘конец вложенного цикла
NomerPerem = Files(1, y) ‘сохраняем в переменных старые значения строки массива
NomerPerem2 = Files(2, y)
Files(1, y) = Peremen ‘ и присваиваем этой строке массива новые
Files(2, y) = Peremen2
If K > 0 Then ‘если K не ноль,
Files(1, K) = NomerPerem ‘то строке К присваиваем старые значения из строки y
Files(2, K) = NomerPerem2
End If
Peremen = «» ‘обнуляем переменные
Peremen2 = «»
K = 0
Next y
‘конец сортировки
‘просто выводим в Text1 отсортированные значения массива
For X = 1 To UBound(Files, 2)
Text1.Text = Text1.Text & Files(1, X) & Files(2, X) & vbCrLf
Next X
End Sub

Исходник программы можно, как всегда, скачать вверху страницы.

Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу.

Вопрос посетителя сайта Cubic: Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу?

Присвоение массивов.
Visual Basic 6.0 и версии выше дают возможность проводить операции присваивания с массивами точно также, как с переменными. Теперь нет необходимости создавать цикл For. Next для присваивания одного массива другому по каждому элементу. Достаточно написать такой оператор
NewMassive=OldMassive
и содержимое массива OldMassive присвоится массиву NewMassive.
Однако при этом следут учитывать, что для исключинения ошибок при таком присвоении, желательно соблюдать одинаковую размерность и тип массивов. Хотя при присвоении динамического массива динамическому массиву, массив в левой части оператора изменяется, как бы подстраивается под оператор в правой части. Однако при работе со статическими массивами возможна ошибка компиляции. Кроме того при присвоении, например массива типа Long типу Integer может возникнуть ошибка переполнения (Owerflow). В программе операция присвоения может выглядеть приблизиельно так (на форме должны быть кнопка Command1 и текстбокс Text1):

Option Explicit
Dim OldMassive() As Long
Dim NewMassive() As Long

Private Sub Command1_Click()
Dim x As Long

For x = 0 To 999 ‘просто заполнение массива цифрами
ReDim Preserve OldMassive(x)
OldMassive(x) = x
Next x

NewMassive = OldMassive ‘присоение массивов

For x = 0 To UBound (NewMassive) ‘ считывание нового массива в Text1
Text1.Text = Text1.Text & NewMassive(x) & vbCrLf
Next x
End Sub

Я думаю, особых комментариев здесь не требуется.

Источник

Оператор Option Base

Используется на уровне модуля для объявления нижней границы по умолчанию для подскрипников массива.

Синтаксис

Примечания

Поскольку база по умолчанию равна 0, оператор Option Base никогда не требуется. Если используется, оператор должен находиться в модуле до всех процедур. Оператор Option Base может указываться в модуле только один раз и должен предшествовать объявлениям массивов, включающим размерности.

Пункт To в тусклом, частном, публичном, reDim и static заявлениях обеспечивает более гибкий способ управления диапазоном подзаписей массива. Однако, если вы явно не установите нижнюю границу с пунктом To, вы можете использовать базу опций для изменения нижней границы по умолчанию на 1. База массива, созданного с ключевым словом ParamArray, ноль; База опций не влияет на ParamArray (или функцию Array, если она имеет имя библиотеки типов, например VBA. Array).

Оператор Option Base влияет только на нижнюю границу массивов в модуле, где находится данный оператор.

Пример

В этом примере оператор Option Base используется для переопределения значения базового индекса массива, равного 0. Функция LBound возвращает наименьший доступный подскрипник для указанных размеров массива. Оператор Option Base используется только на уровне модуля.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Оператор Option Base

Дата добавления: 2015-08-31 ; просмотров: 1215 ; Нарушение авторских прав

Обычно в Visual Basic используются массивы с нулевой базой. В системе нумерации с нулевой базой индекс для первого элемента в любом измерении массива является равным 0; массив с 10 элементами имеет индексы от 0 до 9. Очевидно, что система нумерации с нулевой базой может быть непонятной, потому что индекс 0, в действительности, обозначает 1-й элемент массива, индекс 5 обозначает 6-й элемент массива и так далее.

Было бы гораздо удобнее, если бы элементы массива нумеровались, начиная с 1, а не с 0. Если бы нумерация элементов начиналась с 1, то индекс 1 обозначал бы 1-й элемент массива, индекс 5 — 5-ый и так далее.

Visual Basic позволяет задавать начальное число для элементов массива либо при объявлении массива, либо с использованием директивы компилятора Option Base для указания того, должна ли нумерация индексов начинаться с 0 или с 1.

Директива компилятора Option Base имеет следующий синтаксис:

Оператор Option Base позволяет задавать 0 или 1 как начальное число по умолчанию для индексов массива. Если оператор Option Base не используется, Visual Basic начинает нумерацию индексов массива с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлениями любых переменных, констант или процедур. Нельзя помещать оператор Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле. Оператор Option Base влияет на все массивы, объявляемые в модуле, независимо от того, являются ли они локальными в процедуре или объявляются на модульном уровне.

Следующие два оператора являются примерами директивы компилятора Option Base:

Option Base 0 ‘установка по умолчанию

Option Base 1 ‘индексы массивов начинаются с 1

Источник


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *