Excel массив элементов управления

0 / 0 / 0

Регистрация: 29.10.2015

Сообщений: 26

1

Динамическое создание массива кнопок

29.03.2016, 20:23. Показов 5076. Ответов 11


Студворк — интернет-сервис помощи студентам

Объясните, пожалуйста, подробнее, как создается массив кнопок и происходит к ним обращение.



0



Pro_grammer

Модератор

6792 / 2814 / 527

Регистрация: 24.04.2011

Сообщений: 5,308

Записей в блоге: 10

29.03.2016, 20:35

2

Вначале на форму устанавливаете первую кнопку. Потом копируете её при помощи контекстного меню, которое вызывается посредством кликания ПКМ.
После копирования вставляете эту копию в форму. На вопрос о создании массива кнопок отвечаете положительно. Вставляете столько, сколько надо.
Процедура обработки кнопок происходит стандартно, по индексу кнопки.

Visual Basic
1
2
3
Private Sub Command1_Click(Index As Integer)
MsgBox "Нажали кнопку с индексом " & Index
End Sub



1



Shersh

Заблокирован

29.03.2016, 20:43

3

Pro_grammer, для VBA это не подойдёт, как ни печально



0



M6fhysr

0 / 0 / 0

Регистрация: 29.10.2015

Сообщений: 26

29.03.2016, 20:50

 [ТС]

4

А почему не подойдет?
Нашел отрывок кода:

Visual Basic
1
2
3
4
5
6
7
Private Sub Form_Load()
Dim i As Byte
For i = 0 To 2
    Command1(i).Caption = "Кнопка № " & i
    Command1(i).ToolTipText = "Подсказка для кнопки № " & i
Next
End Sub

Но не понимаю, что такое Command1. Это как раз тот самый массив?
А как он объявляется в самом начале?



0



Shersh

Заблокирован

29.03.2016, 21:10

5

Цитата
Сообщение от M6fhysr
Посмотреть сообщение

Нашел отрывок кода:

Это как раз из VB, но не VBA.

Добавлено через 16 минут
Посмотрите вложение —

Цитата
Сообщение от аналитика
Посмотреть сообщение

вот пример из Уокенбаха



1



Модератор

6792 / 2814 / 527

Регистрация: 24.04.2011

Сообщений: 5,308

Записей в блоге: 10

29.03.2016, 21:22

6

Цитата
Сообщение от Shersh
Посмотреть сообщение

для VBA это не подойдёт

Тормознул, думал я в разделе VB6, что то там модерировал, ну и замодерировался



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

29.03.2016, 21:24

7

M6fhysr, создайте пустую форму, добавьте этот код и запустите.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim cmd() As msforms.CommandButton 'это массив
 
Private Sub UserForm_Initialize()
  Dim i&
  ReDim cmd(1 To 5)
  For i = 1 To 5
    Set cmd(i) = Me.Controls.Add("Forms.CommandButton.1", "Command" & i)
    With cmd(i)
      .Left = 5
      .Top = i * 20
      .Height = 18
      .Caption = "Кнопка " & i
    End With
  Next
End Sub



1



Pro_grammer

Модератор

6792 / 2814 / 527

Регистрация: 24.04.2011

Сообщений: 5,308

Записей в блоге: 10

29.03.2016, 21:27

8

Лучший ответ Сообщение было отмечено M6fhysr как решение

Решение

А вообще VBA не поддерживает массивы элементов управления. Если только самому какой нибудь костыль придумать.
Например использования свойства TAG

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CommandButton1_Click()
Dim Ctl As Control
Dim i As Integer
 
For Each Ctl In UserForm1.Controls
    If Not Ctl.Tag = "" Then ' If omitted, all controls in form must have a TAG value
        For i = 1 To 4
            If Ctl.Tag = i Then
                Ctl.BackColor = vbYellow
            End If
        Next
    End If
Next
 
End Sub



2



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

29.03.2016, 23:03

9

и происходит к ним обращение

Только обращение?
Это всё-таки кнопки! Их обычно нажимают.



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

30.03.2016, 00:08

10

Посмотрел и оценил работу

Цитата
Сообщение от аналитика
Посмотреть сообщение

multiple buttons.xls (38.0 Кб, 115 просмотров

А вот мой пример* (без объявления массива), так, для опытов, понажимайте кто смелый: https://www.cyberforum.ru/atta… 1450314657

________________
* [SIZE=»1″]попытка помощи газовщику dimmur (ждать которой ему было недосуг)



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

30.03.2016, 00:14

11

(Исправьте кто может!)



0



0 / 0 / 0

Регистрация: 29.10.2015

Сообщений: 26

01.04.2016, 18:20

 [ТС]

12

Спасибо, очень помогли



0



это решается с помощью модуля класса и withevents..  
вот пример:  

  в модуле класса:  

  Public WithEvents CommandBarEvents As CommandBarButton  

  Private Sub CommandBarEvents_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)  
   On Error Resume Next  
   If Ctrl.Tag = 256 Then  
       Application.Run Ctrl.OnAction  
       CancelDefault = True  
       Call Application.OnTime(Now + TimeValue(«0:00:01»), «Auto_open», Now + TimeValue(«0:00:05»))  

               End If  
End Sub  

  в стандартном модуле:  

  Global cm As C_event  
Sub Auto_open()  
   Call Register_Event_Handler  
end sub  

  Sub Register_Event_Handler()  
   Set cm = New C_event  
   set cm.CommandBarEvents=comandbars(..).control  
End Sub  

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

  от недостатка опыта

forum.sources.ru

Создание массива контролов в VBA -> Форум на Исходниках.Ру

Большая часть VB-примеров актуальна и для VBA-раздела

 Создание массива контролов в VBA, Управление массивом контролов по событию

Управление массивом контролов на примере текстбоксов

Создаем класс clsCtrlArr

В модуле класса пишем:

Public WithEvents ctl As MSForms.TextBox

Private Sub ctl_Change()

Cancel = True

MsgBox ctl.Name

End Sub

Ваяем форму с тремя ТехтБоксами

В модуле формы пишем:

Private Massiv() As New clsCtrlArr

Private Sub UserForm_Initialize()

Dim Contr As MSForms.Control, i As Long

For Each Contr In Me.Controls

    If Left(Contr.Name, 7) = «TextBox» Then

ReDim Preserve Massiv(0 To i)

        Set Massiv(i).ctl = Contr

        i = i + 1

    End If

Next

End Sub

Сайт автора: www.dimit.pochta.ru

Junior

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

Пример с четырьмя ComboBox:

В Class1:

Public WithEvents comb As MSForms.ComboBox

Private MyIndex As Integer

Private Sub comb_Change()

    MsgBox «Вы изменили ComboBox» & MyIndex

End Sub

Public Property Let Item(NewCtrl As MSForms.ComboBox)

    Set comb = NewCtrl

End Property

Public Property Let Index(NewIndex As Integer)

    MyIndex = NewIndex

End Property

Public Property Get Item() As MSForms.ComboBox

    Set Item = comb

End Property

Public Property Get Index() As Integer

    Index = MyIndex

End Property

В Module1:

В UserForm1:

Private Sub UserForm_Initialize()

Dim cm As ComboBox, i As Long

For i = 0 To 3

    Set cm = UserForm1.Controls.Add(«Forms.ComboBox.1»)

    With cm

        .AddItem «123»

        .Top = i * 30

    End With

ReDim Preserve Massiv(i)

    With Massiv(i)

        .Item = cm

        .Index = i

    End With

Next

End Sub

Событие comb_Change, конечно, можно изменить на другое. И реакция на него должна быть требуемая Вам.

Сообщения были разделены в тему «программное создание контролов»

Открываем, например, Аксесс. Создаём форму. На неё кидаем 5 лабелов (они получают имена «Надпись0…4») и кнопку (она получает имя «Кнопка5»). Открываем модуль формы и кидаем туда следующий код:

Private Sub Кнопка5_Click()

Dim ArrayOfControls(0 To 4) As Control

Dim i As Integer

For i = 0 To 4

    Set ArrayOfControls(i) = Me.Controls(«Надпись» & CStr(i))

Next

For i = 0 To 4

    ArrayOfControls(i).Properties(«Caption») = CStr(Rnd)

Next

End Sub

Полученную форму открываем на просмотр и убеждаемся, что каждое нажатие кнопки изменяет надписи. Есть желание — можно и потрассировать. Поскольку все контролы, складываемые в массив, есть надписи, можно было определить его и как ArrayOfControls(0 To 4) As Label, и не потребовалось бы дёргать коллекцию Properties — но я хотел показать универсальность метода.

Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.

0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

0 пользователей:

Добрый день!

Столкнулся с такой проблемой, точнее с отличием программирования в среде VB6 и VBA.

Чтобы создать массив элементов управления в среде VB6 достаточно просто скопировать данный элемент (copy) и вставить (paste) его на ту же самую форму. В этот момент ты сразу же получаешь сообщение с предупреждением-предложением «Вы уже имеете элемент управления с таким именем. Вы хотите создать массив элементов управления?».  После этого достаточно кликнуть по кнопке «ОК» и массив будет создан автоматически, причем одному из этих элементов будет автоматически назначено свойство Index, равное нулю, а другому  свойство Index, равное единице.

Сейчас понадобилось сделать то же самое в Экселе, но оказалось, что после проделывания вышеописанных действий массив не создается, а просто создается новый элемент управления с уникальным именем, например Label4 (если Label1, Label2 и Label3 уже имеются на данной форме).

Теперь вопрос.
Можно ли  в среде VBA Excel создавать массивы элементов управления во время «design time», или можно только во время «run time», или вообще нельзя?

How to loop through all controls in a UserForm; this allows you to do things like get values from the controls or to update them all at once.

fbab1537ad18e8d889351c0d1ff0dfb9.jpg

Sections:

Code to Loop through Controls

Control Loop Examples

List of Control Names

Notes

Code to Loop through Controls

For Each FormControl In Me.Controls

    'Do something with the controls here.
    'FormControl is the object that will contain references to the control.

Next

This is the basic loop code that you can use in any UserForm in order to loop through all of the controls within it.

Note: this code should be placed within the form where you want to loop through the controls. If you want to loop through another form, you should replace Me.Controls with UserFormName.Controls where UserFormName is the name of the form that you want to loop through.

Control Loop Examples

Once you know how to loop through the controls, you probably want to do something with those controls.

There are two basic ways to do something with controls, using their name or the type of control. The name comes from the Name property and it is something that you can change for each control. The type of control is specific to each control type, TextBox, CommandButton, etc.

Loop through Controls Using their Name

This kind of loop isn’t the most useful unless you are trying to get a list of the control names, but it’s worth mentioning.

For Each FormControl In Me.Controls

    'Do something with the controls here.
    'FormControl is the object that will contain references to the control.

    'Output the name of the control
    MsgBox FormControl.Name


Next

When you put this into your form and run it, a message box will appear with the name of each control in the form.

Note that controls do not all have the same properties. For instance, though each control has the Name property, as used in the loop above, but each control does not have the Text property. As a result of this, you cannot do something like a blanket reset of the form using a loop without having to make exceptions for each type of control.

To reset all controls in a form, view our tutorial: Reset All Values in a UserForm

Loop through Controls Using their Type

This is more useful as it allows you to do things like go through all of the textbox controls in a UserForm and clear them or go through the optionbutton controls or checkbox controls.

For Each FormControl In Me.Controls

    'Do something with the controls here.
    'FormControl is the object that will contain references to the control.


    'Check only OptionButtons
    If TypeName(FormControl) = "OptionButton" Then

        'Do something with the OptionButton Controls.

    End If

Next

TypeName(FormControl) is what returns the type of control in the form.

In the next section, you will see a list of all of the control types so that you can easily reference them within the loop. For instance, OptionButton in the above loop is the control type for the option button form control.

List of Control Names

These names are found when you view the toolbox in the VBA window and hover over the controls for the form.

  • Label
  • TextBox
  • ComboBox
  • ListBox
  • CheckBox
  • OptionButton
  • ToggleButton
  • Frame
  • CommandButton
  • TabStrip
  • MultiPage
  • ScrollBar
  • SpinButton
  • Image
  • RefEdit

Notes

Looping through the controls is the first part of the issue; next, you need to do something with the controls once you have located them. Here are some tutorials that will teach you how to access control properties and get data from as well as input data into form controls — all of this can be done within the above loops.

UserForm Control Properties Overview

Getting Data from a UserForm

Put Data into a UserForm

Make sure to download the sample file for this tutorial; all above code is contained in the form for the «Control Loop» button.

Similar Content on TeachExcel

Reset All Values in a UserForm

Tutorial: Clear or reset all values in a UserForm so that they contain only the default original val…

Quickly Reset All Form Controls in a Worksheet in Excel

Tutorial:
How to reset all Form Controls on a worksheet in Excel with the click of a button or two …

Put Data into a UserForm

Tutorial: How to take data from Excel and put it into a UserForm. This is useful when you use a form…

Multiple Selections in a ListBox

Tutorial: There are two different kinds of multiple item selections that you can have for a ListBox …

Select Ranges in the Worksheet from a UserForm

Tutorial: Select a range in Excel from a UserForm and have that range input into the form so that yo…

Getting Data from a UserForm

Tutorial: How to get data from a UserForm in Excel, including from: text inputs (TextBox), list boxe…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Содержание

  1. Массивы элементов управления
  2. Vba excel элементы управления массивы
  3. VBA Excel. Элемент управления ListBox (список)
  4. Элемент управления ListBox
  5. Свойства списка
  6. Способы заполнения ListBox
  7. VBA Excel. Массивы (одномерные, многомерные, динамические)
  8. Одномерные массивы
  9. Многомерные массивы
  10. Динамические массивы
  11. Максимальный размер
  12. Использование массивов
  13. Функции Array, LBound, UBound
  14. Функция Array

Массивы элементов управления

Создание массива элементов управления во время разработки

Если Вам известно конкретное количество тех или иных элементов управления, то будет целесообразней создать их во время разработки. Сделать это очень просто.
Создаем на форме, к примеру, элемент управления CommandButton1, убеждаемся, что он он выделен и копируем его в буфер обмена (Ctrl+C). Далее выполняя операцию Ctrl+V, получаем на форме еще один элемент управления CommandButton1. В результате этих действий Вы создали массив элементов из двух командных кнопок! Теперь внимательно просмотрите окно ‘Properties’, там Вы увидите,
что созданные командные кнопки, которые отличаются друг от друга только своим индексом. Index — это то свойство, которое позволяет элементам управления организовываться в массивы. Открыв окно кода, Вы увидете, что несмотря на то, что на форме находятся две командные кнопки, в разделе Object присутствует только – Command1. Выбрав ее Вы попадете в процедуру обработки события
Click, обратите внимание, что в данном случае процедура содержит аргумент Index. Аргумент Index указывает на индекс того элемента управления, для которого сгенерировано событие.
Если Вы следовали описанию и создали на форме командные кнопки, то впишите следующий код в процедуру обработки Click и Вам станет ясно как это работает.

Private Sub Command1_Click (Index As Integer)
‘В заголовке формы отображаем индекс нажатой кнопки
Me.Caption = «Нажата кнопка с индексом — » & Index
End Sub

Создание массива элементов управления во время выполнения программы

Если Вам заранее не известно количество тех или иных элементов управления, которое необходимо будет создать, то не волнуйтесь, т.к. и это очень просто. Создаем на форме, к примеру, элемент управления CommandButton1, в окне ‘Properties’ для свойства Index устанавливаем значение 0 (нуль). В результате выполненых Вами действий создается массив элементов управления с одним элементом. Для создания последующих элементов управления (в данном случае командных кнопок) Вам необходимо будет ввести соответствующий код в процедуру обработки события выполнении при которой должен (или должны) возникнуть новые элементы управления. В данном случае мы вставляем код в процедуру обработки события Form_Load формы.

Private Sub Form_Load ()
‘Создаем новую командную кнопку в существующий массив
Load Command1(1)
‘Размещаем ее там, где Вам необходимо.
Command1(1).Top = Command1(0).Top + Command1(0).Height
Command1(1).Left = Command1(0).Left
‘Делаем новую кнопку видимой
Command1(1).Visible = True
End Sub

Вот и все !
Если Вы следовали описанию и создали на форме командные кнопки, то впишите следующий код в процедуру обработки Click и Вам станет ясно как это работает.

Источник

Vba excel элементы управления массивы

С оздание массива контролов в VBA -> Форум на Исходниках.Ру

Большая часть VB-примеров актуальна и для VBA-раздела

Создание массива контролов в VBA, Управление массивом контролов по событию

Управление массивом контролов на примере текстбоксов

Создаем класс clsCtrlArr

В модуле класса пишем:

Public WithEvents ctl As MSForms.TextBox

Private Sub ctl_Change()

Ваяем форму с тремя ТехтБоксами

В модуле формы пишем:

Private Massiv() As New clsCtrlArr

Private Sub UserForm_Initialize()

Dim Contr As MSForms.Control, i As Long

For Each Contr In Me.Controls

If Left(Contr.Name, 7) = «TextBox» Then

ReDim Preserve Massiv(0 To i)

Set Massiv(i).ctl = Contr

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

Пример с четырьмя ComboBox:

Public WithEvents comb As MSForms.ComboBox

Private MyIndex As Integer

Private Sub comb_Change()

MsgBox «Вы изменили ComboBox» & MyIndex

Public Property Let Item(NewCtrl As MSForms.ComboBox)

Set comb = NewCtrl

Public Property Let Index(NewIndex As Integer)

Public Property Get Item() As MSForms.ComboBox

Public Property Get Index() As Integer

Private Sub UserForm_Initialize()

Dim cm As ComboBox, i As Long

Set cm = UserForm1.Controls.Add(«Forms.ComboBox.1»)

ReDim Preserve Massiv(i)

Событие comb_Change, конечно, можно изменить на другое. И реакция на него должна быть требуемая Вам.

Открываем, например, Аксесс. Создаём форму. На неё кидаем 5 лабелов (они получают имена «Надпись0. 4») и кнопку (она получает имя «Кнопка5»). Открываем модуль формы и кидаем туда следующий код:

Private Sub Кнопка5_Click()

Dim ArrayOfControls(0 To 4) As Control

Dim i As Integer

Set ArrayOfControls(i) = Me.Controls(«Надпись» & CStr(i))

Полученную форму открываем на просмотр и убеждаемся, что каждое нажатие кнопки изменяет надписи. Есть желание — можно и потрассировать. Поскольку все контролы, складываемые в массив, есть надписи, можно было определить его и как ArrayOfControls(0 To 4) As Label, и не потребовалось бы дёргать коллекцию Properties — но я хотел показать универсальность метода.

Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.

0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

Источник

VBA Excel. Элемент управления ListBox (список)

Элемент управления пользовательской формы ListBox для выбора и ввода информации в VBA Excel. Свойства списка, его заполнение, извлечение данных, примеры кода.

Элемент управления ListBox

Список используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список. Элемент управления ListBox оправдывает себя при небольших списках, так как большой список будет занимать много места на форме.

Использование полос прокрутки уменьшает преимущество ListBox перед элементом управления ComboBox, которое заключается в том, что при открытии формы все позиции для выбора на виду без дополнительных действий со стороны пользователя. При выборе информации из большого списка удобнее использовать ComboBox.

Элемент управления ListBox позволяет выбрать несколько позиций из списка, но эта возможность не имеет практического смысла. Ввести информацию в ListBox с помощью клавиатуры или вставить из буфера обмена невозможно.

Свойства списка

Свойство Описание
ColumnCount Указывает количество столбцов в списке. Значение по умолчанию = 1.
ColumnHeads Добавляет строку заголовков в ListBox. True – заголовки столбцов включены, False – заголовки столбцов выключены. Значение по умолчанию = False.
ColumnWidths Ширина столбцов. Значения для нескольких столбцов указываются в одну строку через точку с запятой (;).
ControlSource Ссылка на ячейку для ее привязки к элементу управления ListBox.
ControlTipText Текст всплывающей подсказки при наведении курсора на ListBox.
Enabled Возможность выбора элементов списка. True – выбор включен, False – выключен*. Значение по умолчанию = True.
Font Шрифт, начертание и размер текста в списке.
Height Высота элемента управления ListBox.
Left Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления ListBox.
List Позволяет заполнить список данными из одномерного или двухмерного массива, а также обращаться к отдельным элементам списка по индексам для записи и чтения.
ListIndex Номер выбранной пользователем строки. Нумерация начинается с нуля. Если ничего не выбрано, ListIndex = -1.
Locked Запрет возможности выбора элементов списка. True – выбор запрещен**, False – выбор разрешен. Значение по умолчанию = False.
MultiSelect*** Определяет возможность однострочного или многострочного выбора. 0 (fmMultiSelectSingle) – однострочный выбор, 1 (fmMultiSelectMulti) и 2 (fmMultiSelectExtended) – многострочный выбор.
RowSource Источник строк для элемента управления ListBox (адрес диапазона на рабочем листе Excel).
TabIndex Целое число, определяющее позицию элемента управления в очереди на получение фокуса при табуляции. Отсчет начинается с 0.
Text Текстовое содержимое выбранной строки списка (из первого столбца при ColumnCount > 1). Тип данных String, значение по умолчанию = пустая строка.
TextAlign Выравнивание текста: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю.
Top Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления ListBox.
Value Значение выбранной строки списка (из первого столбца при ColumnCount > 1). Value – свойство списка по умолчанию. Тип данных Variant, значение по умолчанию = Null.
Visible Видимость списка. True – ListBox отображается на пользовательской форме, False – ListBox скрыт.
Width Ширина элемента управления.

* При Enabled в значении False возможен только вывод информации в список для просмотра.
** Для элемента управления ListBox действие свойства Locked в значении True аналогично действию свойства Enabled в значении False.
*** Если включен многострочный выбор, свойства Text и Value всегда возвращают значения по умолчанию (пустая строка и Null).

В таблице перечислены только основные, часто используемые свойства списка. Еще больше доступных свойств отображено в окне Properties элемента управления ListBox, а все методы, события и свойства – в окне Object Browser.

Вызывается Object Browser нажатием клавиши «F2». Слева выберите объект ListBox, а справа смотрите его методы, события и свойства.

Свойства BackColor, BorderColor, BorderStyle отвечают за внешнее оформление списка и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления ListBox на проекте пользовательской формы.

Способы заполнения ListBox

Используйте метод AddItem для загрузки элементов в список по одному:

Источник

VBA Excel. Массивы (одномерные, многомерные, динамические)

Массивы в VBA Excel: одномерные, многомерные и динамические. Объявление и использование массивов. Операторы Public, Dim и ReDim. Функции Array, LBound, UBound.

Одномерные массивы

Объявление одномерных (линейных) статических массивов в VBA Excel:

В первом случае публичный массив содержит 10 элементов от 0 до 9 (нижний индекс по умолчанию — 0, верхний индекс — 9), а во втором случае локальный массив содержит 9 элементов от 1 до 9.

По умолчанию VBA Excel считает в массивах нижним индексом нуль, но, при желании, можно сделать нижним индексом по умолчанию единицу, добавив в самом начале модуля объявление «Option Base 1». Вместо верхнего индекса можно использовать переменную.

Многомерные массивы

Объявление многомерных статических массивов в VBA Excel аналогично объявлению одномерных массивов, но с добавлением размерностей дополнительных измерений через запятую:

Третий массив состоит из 10000 элементов — 10×10×10×10.

Динамические массивы

Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:

Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:

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

С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).

При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:

Максимальный размер

Размер массива – это произведение длин всех его измерений. Он представляет собой общее количество элементов, содержащихся в данный момент в массиве.

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

Использование массивов

Приведу два примера, где не обойтись без массивов.

1. Как известно, функция Split возвращает одномерный массив подстрок, извлеченных из первоначальной строки с разделителями. Эти данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок.

2. Данные в массивах обрабатываются значительно быстрее, чем в ячейках рабочего листа. Построчную обработку информации в таблице Excel можно наблюдать визуально по мерцаниям экрана, если его обновление (Application.ScreenUpdating) не отключено. Чтобы ускорить работу кода, можно значения из диапазона ячеек предварительно загрузить в динамический массив с помощью оператора присваивания (=). Размерность массива установится автоматически. После обработки данных в массиве кодом VBA полученные результаты выгружаются обратно на рабочий лист Excel. Обратите внимание, что загрузить значения в диапазон ячеек рабочего листа через оператор присваивания (=) можно только из двумерного массива.

Функции Array, LBound, UBound

Функция Array

Функция Array возвращает массив элементов типа Variant из первоначального списка элементов, перечисленных через запятую. Нумерация элементов в массиве начинается с нуля. Обратиться к элементу массива можно, указав в скобках его номер (индекс).

Источник

Понравилась статья? Поделить с друзьями:
  • Excel масштабировать для печати
  • Excel массив целых чисел
  • Excel масштабирование при печати
  • Excel массив фигурные скобки
  • Excel масштаб оси диаграммы