Excel vba option base

Permalink

Cannot retrieve contributors at this time

title keywords f1_keywords ms.prod ms.assetid ms.date ms.localizationpriority

Option Base statement (VBA)

vblr6.chm1008990

vblr6.chm1008990

office

21f45e9e-2cb2-3a45-0484-d23adae77e3e

12/03/2018

medium

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

Syntax

Option Base { 0 | 1 }

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.

[!NOTE]
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.

Option Base 1 ' Set default array subscripts to 1. 
 
Dim Lower 
Dim MyArray(20), TwoDArray(3, 4) ' Declare array variables. 
Dim ZeroArray(0 To 5) ' Override default base subscript. 
' Use LBound function to test lower bounds of arrays. 
Lower = LBound(MyArray) ' Returns 1. 
Lower = LBound(TwoDArray, 2) ' Returns 1. 
Lower = LBound(ZeroArray) ' Returns 0. 

See also

  • Data types
  • Statements

[!includeSupport and feedback]

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

Option Base {0 | 1}

Замечания
Поскольку по умолчанию используется значение 0, инструкция Option Base никогда не является обязательной. Однако если она используется, эта инструкция должна появляться в модуле перед любой процедурой. Инструкция Option Base может задаваться в модуле только один раз и должна предшествовать описаниям массивов, включающих размерности.
Предложение To в инструкциях Dim, Private, Public, ReDim и Static предоставляет более гибкий способ управления диапазоном индексов массива. Однако если нижняя граница индексов не задается явно в предложении To, можно воспользоваться инструкцией Option Base, чтобы установить используемую по умолчанию нижнюю границу индексов, равную 1. Нижняя граница значений индексов массивов, создаваемых с помощью функции Array, всегда равняется нулю; вне зависимости от инструкции Option Base.
Инструкция Option Base действует на нижнюю границу индексов массивов только того модуля, в котором расположена сама эта инструкция.

Пример
В данном примере инструкция Option Base используется для изменения нижней границы индексов массива, по умолчанию равной 0. Функция LBound возвращает минимальный доступный индекс указанной размерности массива. Инструкция Option Base используется только на уровне модуля.

Option base 1				' Устанавливает нижнюю границу индексов массива равной 1.
Dim Lower
Dim MyArray(20), TwoDArray(3, 4)		' Объявляет переменные-массивы.
Dim ZeroArray(0 To 5)			' Явно задает границы индексов массива.
					' Функция LBound определяет нижние границы индексов массивов.
Lower = LBound(MyArray)			' Возвращает 1.
Lower = LBound(TwoDArray, 2)		' Возвращает 1.
Lower = LBound(ZeroArray)			' Возвращает 0.

По аналогии с
работой с информацией в списках Excel,
массивы тоже представляют собой списки,
в которых каждый элемент имеет свой
индекс. Элементы массива воспринимаются
программой в виде обычных переменных,
но представленных в виде индексированного
списка. В вба массивы используются для
обработки списков, поскольку массивами
управлять в программном режиме гораздо
проще, чем списками. Правила
работы с массивами.
Option
Base
– определяет нижнюю границу изменения
индекса в массиве. Например, Option
Base1
– нижняя граница – 1. Эту строку в
программном коде пишут в общей области
модуля следом за оператором Option
Explicit.

В большинстве
экономических задач при написании
программного кода невозможно заранее
узнать количество элементов. Для этого
существует возможность вначале
программного кода не указывать при
объявлении массива точного размера.
(Dim
ProdCode
() As
Integer,
NProducts
As

Integer.)
Затем в теле процедуры, когда уже известно
необходимое количество элементов
массива, можно воспользоваться оператором
ReDim,
который выделяет для массива строго
необходимый объем памяти. With
ActiveWorkBook.WorkShits(«Продажи»).Range(“A3”)

NProducts=Range(.Offset(1,0),.End(xlDown)).

ReDim
ProdCode(NProducts),UnitPrise(NProducts)

For
i=1 to NProducts

ProdCode(i)=.Offset(i,0)

UnitPrise(i)=.Offset(i,1)

Next
i

End
With

Оператор ReDim
относительно конкретного массива может
использоваться в программном коде
столько раз, сколько необходимо.
Единственной проблемой является то,
что при таком использовании массива,
все, что было в массиве, теряется. Чтобы
этого избежать, нужно в записи оператора
записать ключевое слово Preserve.
(ReDim
Preserve
Sum(NS)).
Обычно продолжением данного программного
кода является размещение данных, взятых
из ст. А и В списка в массивах ProdCode
и UnitPrice.
Для переноса данных из столбцов списка
в массив, нужно организовать цикл. Если
нужно перенести данные в столбцы списка,
размещенного на рабочем листе:

(NFound
– количество найденных записей)

For
i=1
to
NFound

With
Range(“E3”)

.Offset(j,
0)=ProdCodeFound(j) ‘код
товара

.Offset(j,
1)=Quontity(j)
‘количество товаров

.Offset(j,
2)=DollarsTotal(j)
‘стоимость продукции

End
With

End
Sub

Рассмотрим
конструкцию
Array. Рассмотрим
работу этой функции на примере. Данная
функция используется для заполнения
массива. Ее применении е рассмотрим в
программе «Ипотечный кредит».

Option
Base1

Sub
Array Function ()

Dim
Days As Variant

Days=Array(«Пн»,
«Вт»,
«Ср»,
«Чт»,
«Пт»,
«Сб»,
«Вс»)

MsgBox
“Первый день недели: ” & Days(1)

End
Sub

Ключевое слово
Array,
после которого указывается список в
скоках, используется для заполнения
значениями переменной Days.
Эта переменная – обычный массив, но в
операторе Dim
она указывается как обычная переменная
типа Variant,
а VBA
самостоятельно с использованием функции
Array
определяет эту переменную как массив.

16. Модульная
структура приложения на примере
программного кода задачи, определяющий
оптимальный маршрут перемещения
дистрибьютора фирмы. Пример

использования
переменных уровня модуля
.
При создании
больших процедур возникают такие
сложности, как сложность изучения,
отладки, повторного использования.
Намного предпочтительнее создавать
модульные приложения, которые представляют
собой набор относительно небольших
процедур, каждая из которых выполняет
небольшую подзадачу. Создается главная
процедура MainProcedure,
а из нее с помощью оператора Call
вызываются другие процедуры.

Sub
MainProcedure()

Call
Procedure1

Call
Procedure2

End
Sub

В качестве примера
рассмотрим программный код задачи,
определяющий оптимальный маршрут
перемещения.

Dim
Ncities As Integer, Visited() As Boolean, Route() As Integer, TotDist
As Integer

Sub
GenDistances()

Dim
I As Integer, j As Integer, Ncities As Integer

Randomize

With
Range(«DistMatrix»)

Ncities
= .Rows.Count

For
I = 1 To Ncities — 1

For
j = I + 1 To Ncities

.Cells(I,
j) = Int(Rnd * 100) + 1

Next
j

Next
I

For
I = 2 To Ncities

For
j = 1 To I — 1

.Cells(I,
j) = .Cells(j, I)

Next
j

Next
I

End
With

End
Sub

Sub
MainProcedure()

Call
GetProblemSize

Call
Initialize

Call
PerformHeuristic

Call
DisplayResults

Exit
Sub

End
Sub

Sub
GetProblemSize()

Ncities =
Range(«DistMatrix»).Rows.Count

ReDim
Visited(Ncities)

ReDim
Route(Ncities + 1)

End
Sub

Sub
Initialize()

Dim
I As Integer

Route(1) = 1

Route(Ncities + 1) = 1

Visited(1) = True

For
I = 2 To Ncities

Visited(I) = False

Next

TotDist = 0

End
Sub

Sub
PerformHeuristic()

Dim
Step As Integer, I As Integer, NowAt As Integer, NextAt As Integer,
MinDist As Integer

NowAt
= 1

For
Step = 2 To Ncities

MinDist = 10000

For
I = 2 To Ncities

If
I <> NowAt And Visited(I) = False Then

If
Range(«DistMatrix»).Cells(NowAt, I) < MinDist Then

NextAt
= I

MinDist =
Range(«DistMatrix»).Cells(NowAt, NextAt)

End
If

End
If

Next
I

Route(Step) = NextAt

Visited(NextAt) = True

TotDist = TotDist + MinDist

NowAt
= NextAt

Next
Step

TotDist = TotDist +
Range(«DistMatrix»). Cells(NowAt, 1)

End
Sub

Sub
DisplayResults()

Dim
Step As Integer

For
Step = 1 To Ncities + 1

Range(«B19»).Offset(Step,
0) = Route(Step)

Next
Step

MsgBox
«Общее
растояние:»
& TotDist, vbInformation, «общее
расстояние»

End Sub

Использование
переменных уровня модуля.

Рассмотрим программу, которая иллюстрирует
использование переменных уровня модуля.

На рабочем листе
Excel
создадим список и дадим ему имя – Name.

А

В

С

1

Фамилия

Имя,
Отчество

2

Dim
FirstName As String, LastName As String

Sub
Main ()

Dim
I As Integer

For
i=1 to 50

FirstName=Range(“Name”).Cells(i,
1)

LastName=Range(“Name”).Cells(i,
2)

Call
DisplayName

Next
i

End
Sub

Sub
DisplayName ()

Dim
FullName As String

FullName=FirstName+LastName

MsgBox
“Полное
имя
сотрудника:
” & FullName

End
Sub

17. Разраотка
пользовательского интерфейса: форма
как пользовательское окно диалога.
Разработка формы на примере формы
«Сведения о товарах». Отображение
пользовательской формы.
Пользовательское
окно диалога – это форма, содержащая
элементы управления, включая командные
кнопки, переключатели, текстовые поля
и другие. Оно обеспечивает пользователю
ввод информации, требуемой для работы
приложения.Рассмотрим типичный пример
формы, которая часто встречается в
приложениях.

В форме присутствуют
3 обработчика событий:

1.
UserForm_Initialize

2.
OkButton_Click

3.
CanselButton_Click

1 разработчик
определяет внешний вид формы при
открытии, а остальные обеспечивают
реакцию на щелчок по кн. «Ок» и «Отмена».

Код обработчика
UserForm_Initialize.

В этом приложении
при открытии формы нужно добиться
следующего поведения: переключатели
Москва и Поезд должны быть активны,
флажок Скоропортящийся установлен, а
Хрупкий – сброшен, список CostumerList
должен быть заполнен исходными данными.
При работе со списком, его можно заполнить
разными способами. Например, заполнить
его данными, расположенными в ячейках
рабочего листа. Для этого зоздать
диапазон на рабочем листе, дать ему
имя(Name
— Costumer).
При заполнении списка воспользоваться
AddItem.
Перед тем, как писать код для события
Initialize,
рассмотрим свойства элементов управления:
пользовательская форма – Ипотека;
текстовое поле – ProductBox;
переключатели – MoscowOption,
VoronegOption,
TrainOption,
TruckOption;
флажки – PerishBox,
FragilBox;
список – CostumersList.

Private
Sub UserForm_Initialize()

Dim
cell As Variant

ProductBox
= » «

MoscowOptions.Value
= True

TrainOptions.Value
= True

PerishBox
= True

FragilBox
= False

For
Each cell In Range(«Customers»)

CustomersList.AddItem
cell.Value

Next
cell

End Sub

Существует другой
способ заполнения списка. Свойство
RowSource,
откроется окно, из которого поочереди
надо внести элементы.

Отображение
формы.
В
отличии от VB
в VBA
форма в момент запуска приложения
автоматически на экране не появляется.
Для вызова формы на рабочий лист нужно
применить метод Show.
Для этого на рабочем листе создать
кнопку, которая выводит форму на рабочий
лист, и написать код:

Sub
Кнопка1_Щелкнуть ()

Ипотека. Show

End
Sub

18. Обработка
событий формы: создание кода обработки
событий
UserForm_Initialize,
CanselButton_Click
на примере обработки этих событий для
пользовательской формы «Сведения о
товарах».

Событие
представляет собой действие, распознаваемое
объектом, для которого можно
запрограммировать отклик.

Рассмотрим форму
«Сведения о товарах». В ней присутствуют
3 обработчика событий:

1.
UserForm_Initialize

2.
OkButton_Click

3.
CanselButton_Click

1 разработчик
определяет внешний вид формы при
открытии, а остальные обеспечивают
реакцию на щелчок по кн. «Ок» и «Отмена».

Код обработчика
UserForm_Initialize.

В этом приложении
при открытии формы нужно добиться
следующего поведения: переключатели
Москва и Поезд должны быть активны,
флажок Скоропортящийся установлен, а
Хрупкий – сброшен, список CostumersList
должен быть заполнен исходными данными.
Для заполнения списка на рабочем листе
создадим диапазон и дадим ему имя
Costumers.
В программном коде воспользуемся методом
AddItem.
Перед тем, как писать код для события
Initialize,
рассмотрим некоторые свойства элементов
управления: пользовательская форма –
Ипотека; текстовое поле – ProductBox;
переключатели – MoscowOption,
VoronegOption,
TrainOption,
TruckOption;
флажки – PerishBox,
FragilBox;
список – CostumersList.

Private
Sub UserForm_Initialize()

Dim
cell As Variant

ProductBox
= » «

MoscowOptions.Value
= True

TrainOptions.Value
= True

PerishBox
= True

FragilBox
= False

For
Each cell In Range(«Customers»)

CustomersList.AddItem
cell.Value

Next
cell

End Sub

Для кнопки «отмена»
запишем следующий код:

Private
Sub CanselButton_Click ()

Unload.Me

End

End
Sub

Unload.Me
– этот метод выгружает форму из
оперативной памяти и убирает ее с экрана.

19. Обработка
событий формы: создание кода обработки
события
OkButton_Click
на примере
обработки этого события для пользовательской
формы «Сведения о товарах».

Событие
представляет собой действие, распознаваемое
объектом, для которого можно
запрограммировать отклик.

Рассмотрим форму
«Сведения о товарах». В ней присутствуют
3 обработчика событий:

1.
UserForm_Initialize

2.
OkButton_Click

3.
CanselButton_Click

1 разработчик
определяет внешний вид формы при
открытии, а остальные обеспечивают
реакцию на щелчок по кн. «Ок» и «Отмена».

Код процедуры
OkButton_Click.
Обычно данный обработчик событий
используется для сохранения данный,
введенных в элементы управления. Как
правило, введенная информация в элементы
управления заносится в общедоступные
переменные, которые определены в модуле,
далее эти переменные используются в
программных кодах модуля. ProductСode
– код, введенный в поле; Region
– пункт отправления; Shipping
– транспорт; IsPerish
– скоропортящийся; IsFragil
– хрупкий; Customers
– смисок.

Dim
ProductCode As Integer, Region As String, Shipping As String,
IsPerish As Boolean, IsFragile As Boolean, Customers As String

Private
Sub OkButton_Click()

With
ProductBox

If
.Value = » » or not IsNewmeric(.Value) Then

MsgBox «Код товара
не введен или не числовой»

.SetFocus

Exit
Sub

End
If

ProductCode=ProductBox.
Value

If
ProductCode < 1 Or ProductCode > 1000 Then

MsgBox
«Код товара должен быть в диапазоне
от 1 до 1000»

.SetFocus
‘ставит курсор в поле

Exit
Sub
‘выход из процедуры

End
If

If
TrainOption.Value = True Then

Shipping
= «Poezd»

Else

Shipping
= «Gruzovik»

End
If

If
MoscowOption.Value = True Then

Region
= «Moscow»

Else

Region
= «Voroneg»

End
If

IsPerish
= PerishBox.Value

IsFragile
= FragilBox.Value

With
CostomerList ‘работа
со
списком

If
.ListIndex <> -1 Then

Customers
= CustomersList.Value

Else

MsgBox
«Элемент
в
списке
не
выбран»

.SetFocus

Exit
Sub

End
If

End
With

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

VBA Option Statement

The Option statement is used to set module-level options in VBA. There are four options that can be set: Explicit, Base, Compare, and Private Module.

Option Explicit

Option Explicit makes explicit variable declarations required for the module. If Option Explicit is declared at the top of a module and a variable is not declared a compile error will occur when trying to run the code. If Option Explicit is not used then variables do not need to be declared. Variables that are not declared are type Variant by default. It is recommended to always use Option Explicit.

Option Explicit

Public Sub Example()

    Dim i As Long

    i = 1

    j = 2 'Causes compile error because variable is not declared explicitly

End Sub

Option Base

The Option Base statement controls the default starting index for arrays. Option Base can be set to 1 or 0. If Option Base is omitted then arrays start at index 0 by default. Declaring Option Base 0 is unnecessary because arrays are 0-indexed by default. The Option Base statement does not affect the starting index for ParamArray parameters. ParamArrays always start at index 0.

Option Base 0

Public Sub Example()

    Dim Arr()

    Arr = Array(1, 2, 3)

    Debug.Print LBound(Arr) 'Prints 0

End Sub

Option Base 1

Public Sub Example()

    Dim Arr()

    Arr = Array(1, 2, 3)

    Debug.Print LBound(Arr) 'Prints 1

End Sub

Option Compare

The Option Compare statement controls the way strings are compared when using comparison operators. Option Compare can be set to Binary or Text. Binary comparison compares text according to the binary representations of the string’s characters which means that string comparison will be case-sensitive. Text comparison does case-insensitive comparison of strings using the sort order of the system locale. If Option Compare is omitted then Binary is the default comparison method. Declaring Option Compare Binary is unnecessary because Binary is the default comparison mode. Option Compare Database can be used in Microsoft Access only which compares strings using the sort order according to the locale Id of the database where the string comparison occurs.

Option Compare Binary

Public Sub Example()

    Debug.Print "A" = "a" 'Prints False

End Sub

Option Compare Text

Public Sub Example()

    Debug.Print "A" = "a" 'Prints True

End Sub

Option Private Module

Option Private Module makes all Public members in a module only available to the project in which the module is located.

Option Private Module

Public Sub Example()

    'This procedure is only available inside the
    'VBA project in which it is declared.

    Debug.Print "Hello, World!"

End Sub

Example

Option Base is used to declare the default lower bound of array elements. It is declared at module level and is valid only for the current module.

By default (and thus if no Option Base is specified), the Base is 0. Which means that the first element of any array declared in the module has an index of 0.

If Option Base 1 is specified, the first array element has the index 1

Example in Base 0 :

Option Base 0

Sub BaseZero()

    Dim myStrings As Variant
    
    ' Create an array out of the Variant, having 3 fruits elements
    myStrings = Array("Apple", "Orange", "Peach")
    
    Debug.Print LBound(myStrings) ' This Prints "0"
    Debug.Print UBound(myStrings) ' This print "2", because we have 3 elements beginning at 0 -> 0,1,2
            
    For i = 0 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
    
    Next i

End Sub

Same Example with Base 1

Option Base 1

Sub BaseOne()

    Dim myStrings As Variant
    
    ' Create an array out of the Variant, having 3 fruits elements
    myStrings = Array("Apple", "Orange", "Peach")
    
    Debug.Print LBound(myStrings) ' This Prints "1"
    Debug.Print UBound(myStrings) ' This print "3", because we have 3 elements beginning at 1 -> 1,2,3
            
    For i = 0 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This triggers an error 9 "Subscript out of range"
    
    Next i

End Sub

The second example generated a Subscript out of range (Error 9) at the first loop stage because an attempt to access the index 0 of the array was made, and this index doesn’t exists as the module is declared with Base 1

The correct code with Base 1 is :

    For i = 1 To UBound(myStrings)
    
        Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
    
    Next i

It should be noted that the Split function always creates an array with a zero-based element index regardless of any Option Base setting. Examples on how to use the Split function can be found here

Split Function
Returns a zero-based, one-dimensional array containing a specified number of substrings.

In Excel, the Range.Value and Range.Formula properties for a multi-celled range always returns a 1-based 2D Variant array.

Likewise, in ADO, the Recordset.GetRows method always returns a 1-based 2D array.

One recommended ‘best practice’ is to always use the LBound and UBound functions to determine the extents of an array.

'for single dimensioned array
Debug.Print LBound(arr) & ":" & UBound(arr)
Dim i As Long
For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next i

'for two dimensioned array
Debug.Print LBound(arr, 1) & ":" & UBound(arr, 1)
Debug.Print LBound(arr, 2) & ":" & UBound(arr, 2)
Dim i As long, j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
    For j = LBound(arr, 2) To UBound(arr, 2)
         Debug.Print arr(i, j)
    Next j
Next i

The Option Base 1 must be at the top of every code module where an array is created or re-dimensioned if arrays are to be consistently created with an lower boundary of 1.

Like this post? Please share to your friends:
  • Excel vba for loop with if
  • Excel vba open sub
  • Excel vba for loop in for loop
  • Excel vba open file if not open
  • Excel vba for loop cell