Для изменения начала нумерации в массиве на 1 используется инструкция

ВикиЧтение

VBA для чайников
Каммингс Стив

Нумерация элементов массива

Нумерация элементов массива

Если вы не укажете иное, элементы массива индексируются (т.е. нумеруются) начиная с 0; говоря иначе, первым в массиве будет элемент с индексом 0. По этой причине значение, задающее размерность массива в объявлении, должно быть на единицу меньше числа элементов, которые предполагается иметь. Например, если предполагается создать массив из 10 элементов, для размера нужно указать значение 9.

Об этом не следует забывать, когда придется обращаться к элементам массива. Ссылка типа intMaccив (1) на самом деле означает обращение ко второму элементу в массиве.

Если же вам не нравится отсчет от 0, можно начать нумерацию элементов в любом массиве от другого числа — обычно от 1. Чтобы заставить VBA нумеровать все массивы от 1. поместите в раздел объявлений модуля (перед всеми процедурами) оператор

Option Base 1

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

Можно задать схемы нумерации и для каждого из измерений в отдельности. Например:

Dim sngNumbers (55 То 75, 7 Тo 16, 99)

В этом примере объявляется трехмерный массив, в котором по первому измерению имеется 21 место, с началом нумерации от 55 до 75; по второму — 10 мест с началом нумерации с 7, а последнее измерение предполагает наличие 100 месте нумерацией от 0.

Если при объявлении массива указать значение для его размера, то размер массива останется фиксированным в ходе всего выполнения программы — программа не сможет сделать массив меньше или больше. Чтобы объявить массив фиксированного размера, укажите в скобках в его объявлении конкретные значения для каждого из измерений массива. Например, оператор

Dim strХорошиеМысли (9, 19) As String

объявляет двумерный массив, который всегда будет содержать 30 строк и 20 столбцов строковых данных (конечно, массив на самом деле не содержит данные в строках и столбцах, по мысленное представление массива в виде подобной таблицы очень удобно).

Фиксирование размера массива при его объявлении определенно можно рекомендовать, если точно известно, что изменение размера массива не потребуется.

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

Читайте также

Многоуровневая нумерация

Многоуровневая нумерация
Элемент <xsl:number> также поддерживает многоуровневую нумерацию — такую как 3.1.2.5 и т. п. Для работы с ней нужно установить атрибут level в «multiple». При помощи атрибута count можно указать, узлы какого типа вы хотите нумеровать, установив этот атрибут в

Нумерация версий WSH

Нумерация версий WSH
Скажем несколько слов относительно нумерации версий WSH. Самая первая версия WSH, входившая в качестве стандартного компонента в Windows 98, имела номер 1.0. С другой стороны, эта версия опиралась на языки сценариев JScript и VBScript версии 5.0, которые поддерживались

9.5.1. Нумерация

9.5.1. Нумерация
Сначала приведем дополнительные сведения о нумерации жестких дисков в системе Linux (табл. 9.3).Таблица 9.3. Нумерация жестких дисков

Тип жесткого диска
Старший номер
Наименование устройства
Младший номер

Диск 1
Диск 2

IDE на 1 контроллере
22
/dev/hda и /dev/hdb
0 … 63
64 …

10.3.1 Нумерация и подтверждение

10.3.1 Нумерация и подтверждение
Для обеспечения надежной пересылки данных в TCP используются нумерация (numbering) и подтверждение (acknowledgment — ACK). Схема нумерации TCP несколько необычна: каждый пересылаемый по соединению октет рассматривается как имеющий порядковый номер.

Добавление новых элементов в панель элементов управления

Добавление новых элементов в панель элементов управления
Чтобы получить возможность использовать элемент управления ActiveX, выполните следующее.1. Установите программное обеспечение элемента управления на жесткий диск.Мне кажется, это имеет смысл.2. Зарегистрируйте

Нумерация страниц

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

Нумерация строк

Нумерация строк
При работе с документами определенного типа (например, с юридическими договорами) иногда бывает необходимо нумеровать не только страницы, но и строки. В Microsoft Word есть возможность автоматической нумерации строк. Для этого сделайте следующее.1. Щелкните на

8.1.14. Удаление из массива элементов равных nil

8.1.14. Удаление из массива элементов равных nil
Метод compact (и его вариант compact! для модификации на месте) удаляет из массива элементы равные nil, оставляя все остальные без изменения:a = [1, 2, nil, 3, nil, 4, 5]b = a.compact # [1, 2, 3, 4, 5]a.compact!    # а равно [1, 2, 3, 4,

8.1.15. Удаление заданных элементов из массива

8.1.15. Удаление заданных элементов из массива
В Ruby легко удалить элементы из массива — для этого даже существует много способов. Чтобы удалить элемент с известным индексом, достаточно вызвать метод delete_at:a = [10, 12, 14, 16, 18]a.delete_at(3) # Возвращает 16.# а равно [10, 12, 14, 18]a.delete_at(9) #

8.1.26. Указание значения по умолчанию для новых элементов массива

8.1.26. Указание значения по умолчанию для новых элементов массива
Когда массив растет и в нем создаются новые элементы, по умолчанию им присваивается значение nil:a = Array.newa[0]=»x»a[3]=»y»# а равно [«x», nil, nil, «y»]Но, допустим, нам требуется, чтобы новые элементы получали другое значение.

Определение элементов массива структур

Определение элементов массива структур
     При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и именем элемента: libry [0].value  value — первый

Хранение элементов в коллекциях и получение элементов из коллекций

Хранение элементов в коллекциях и получение элементов из коллекций
Коллекции — это такие объекты, в экземплярах которых могут храниться другие объекты. Одна из самых распространенных разновидностей коллекций — это массив, который инстанцирует NSArray или NSMutableArray. В

Нумерация

Нумерация
Нумерация, несомненно, является одной из самых естественных проблем, решаемых при помощи XSLT. Задача нумерации состоит в том, чтобы, исходя из позиции обрабатываемого узла в дереве документа, вычислить по заданным критериям его порядковый номер. В качестве

Нумерация страниц

Нумерация страниц
Для нумерации страниц вам нет необходимости вручную проставлять номера на каждой из них, поскольку Word справится с этой задачей намного эффективнее и избавит вас от множества проблем. Чтобы вставить номера страниц, выполните команду Вставка ?

Ciberst, коллекцию мы применяем для определенного случая, и в этом — она вряд ли подойдет, потому как штатными средствами нельзя изменить текущий элемент коллекции.
Да и не сказал бы я, что они такие уж тупые.
Можно еще заюзать Array Of…

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Public Class Form1
    Private Declare Function GetTickCount Lib "kernel32.dll" () As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MassStart, MassEnd, ColStart, ColEnd As Integer
 
        Dim Mass(80000) As String
 
        Dim Col As New List(Of String)
        For I As Integer = 1 To 80000
            Col.Add("QWERTY")
        Next
 
        MassStart = GetTickCount
        For I As Integer = 0 To 80000 - 1
            Mass(I) = "QWERTY"
        Next
        MassEnd = GetTickCount
        ColStart = GetTickCount
        For I As Integer = 0 To 80000 - 1
            Col(I) = "ASDFGH"
        Next
        ColEnd = GetTickCount
        MsgBox("На обработку 80000 элемента массив затратил " & MassEnd - MassStart & " мс., Коллекция: " & ColEnd - ColStart & " .мс")
    End Sub
End Class

Довольно мощная штука и с удалением-добавлением проблем нет
Нумерация правда тоже с нуля.

Топикстартеру: Как уже посоветовали, привыкай к тому, что единицей отсчета является-таки 0.
Это не только у массива, но и у листбоксов, Датагридов, таблиц в базах данных и вообще много где.

13

Dim Количество As Byte, Вес As Single

При вводе кода программы с клавиатуры среда программирования оказывает помощь пользователю – после набора ключевого слова As и пробела раскрывается список, в котором наряду с другими типами объектов указаны базовые типы переменных:

Тип переменной можно установить, щелкнув дважды по имени типа в этом списке.

Неявное объявление

В этом способе определения переменных никакие инструкции для объявления переменной вообще не используются. Когда транслятор VBA первый раз встречает в коде программы необъявленную переменную, то он назначает ей тип Variant, и переменная может принимать значение любого типа. Следовательно, в программе VBA, в принципе, можно вообще не использовать инструкцию Dim. Тем не менее использование типа Variant рекомендуется использовать только в следующих случаях:

для ускорения процесса отладки программы;

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

Явное объявление переменных позволяет:

увеличить скорость решения задачи;

оптимизировать распределение памяти для переменных;

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

Для того чтобы избежать неприятностей в случае ошибочной записи имени переменной, необходимо в общей области программного модуля помещать оператор Option Explicit. В этом случае Visual Basic будет расценивать любую неявно объявленную переменную как ошибочную.

Константа по определению является постоянной величиной и поэтому не меняет своего значения при выполнении программы. Константы в VBA подразделяются на константы, определяемые пользователем, и встроенные константы. Встроенная константа должна объявляться; при этом используется оператор Const, аналогичный оператору Dim:

Const <ИмяКонстанты> [As <ТипДанных>] = <Выражение>

14

где <Выражение> – это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы.

Пример

Const ПИ As Single = 3,14

Встроенные константы используются обычно при работе с объектами приложения. Эти константы не требуют предварительного объявления. Имена встроенных констант начинаются с префикса, который указывает, к объекту какого приложения Microsoft Office они относятся. Например, встроенные константы объектов Excel имеют префикс xl, встроенные константы языка VBA имеют префикс vb и т.д. Например, встроенные константы vbYes и vbNo используются в функции MsgBox, предназначенной для вывода данных на экран.

Операторы объявления переменных и констант можно размещать в любом месте программного кода, но обязательно до первого оператора,

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

2.4. Строковые переменные

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

Строка фиксированной длины – это строка постоянного размера, указанного при объявлении переменной. Если такой строке присваивается значение более длинное, то лишние символы отбрасываются. Если значение, которое присваивается, короче, то остающееся место заполняется пробелами. Строковые переменные фиксированной длины должны объявляться явно.

Синтаксис объявления строковой переменной следующий: Dim VarName As String [* ДлинаСтроки]

где ДлинаСтроки – целочисленная переменная или константа, содержащая число, которое указывает длину строковой переменной.

Например:

Dim strMyName As String* 20

Объявляется строковая переменная фиксированной длины в 20 символов

Dim intLen As Integer Intlen = 10

Dim MyName As String * Intlen

Объявляется строковая переменная длиной в 10 символов.

15

2.5. Массивы

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

В VBA массив объявляется следующим образом:

[Public | Private] Dim ИмяМассива([Индексы]) [As ТипДанных]

где

ИмяМассива – идентификатор, определяющий имя массива; Индекс – значение номера элемента в размерности массива, зада-

ваемого одним из двух способов:

1.указанием номера последнего элемента в каждой размерности массива;

2.указанием номеров первого и последнего элемента в каждой размерности массива.

Примечание

Номера элементов (индексы) должны быть указаны целым числом.

При использовании первого метода первому элементу по умолчанию присваивается номер “ноль”. Например, объявление одномерного массива Товар из трёх элементов, каждый из которых состоит не более чем из 15 символов, по умолчанию выглядит следующим образом:

Dim Товар(2) As String*15

Для обращения к элементам массива необходимо поместить в круглых скобках за идентификатором массива целочисленное выражение, например, Товар(0), Товар(К*2) – для одномерного массива и Продажи(I,L), Продажи(3,4) ) – для двумерного массива; величины I, K, L должны быть целыми.

В приведённой ниже процедуре ОбъявлениеМассива1 Sub ОбъявлениеМассива1()

Dim Товар(2) As String*15

Товар(0) = «Стул мягкий» MsgBox Товар(0)

End Sub

выражения Товар(0), Товар(1), Товар(2) являются элементами массива;

инструкция Товар(0) = «Стул мягкий» присваивает первому элементу массива Товар значение текстовой константы «Стул мягкий»;

функция MsgBox Товар(0) выводит значение этого элемента на экран:

16

Примечание

Инструкция присваивания и функция MsgBox будут подробно рассмотрены ниже.

Для изменения начала нумерации индексов массива можно поступить одним из следующих способов.

1. Использовать инструкцию Option Base 1. При этом инструкция Option Base 1 должна находиться в самом начале модуля VBA, перед первой процедурой модуля, например,

Option Base 1

Sub ОбъявлениеМассива2()

Dim Товар(3) As String * 15

Товар(1) = «Стул мягкий» MsgBox Товар(1)

End Sub

По умолчанию инструкция Option Base имеет значение 0 (ноль).

2.Выполнить явное указание номера первого элемента в каждой размерности массива, например,

Sub ОбъявлениеМассива3()

Dim Товар(1 To 3) As String * 15

Товар(1) = «Стул мягкий» MsgBox Товар(1)

End Sub

При объявлении многомерного массива в поле индекса указывается несколько индексов, в соответствии с размерностью массива: номер последней строки, номер последнего столбца и номер последней таблицы – для трёхмерного массива. Например, двумерный массив из пяти строк и десяти столбцов объявляется без использования инструкции Option Base 1 одним из следующих способов:

Dim Продажи(4,9) As String

или

Dim Продажи(0 To 4,0 To 9) As String

17

Примечания

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

<нижняя граница> To <верхняя граница>

Массив Продажи можно объявить так: Dim Продажи(1 To 5, 1 To 10) As String

2.Элементы массива Продажи имеют тип строковая переменная неопределённой длины.

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

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

Использование динамических величин предоставляет возможность подключать память динамически, что позволяет:

увеличить объем обрабатываемых данных;

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

определять динамически изменяющееся количество реально существующих элементов массива.

Динамический массив объявляется следующим образом:

[Public | Private] Dim ИмяМассива() [As ТипДанных]

т.е. размерность динамического массива в его объявлении не указывает-

ся.

Пример

Dim Товар() As String * 15

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

ReDim [Preserve] ИмяМассива(Индексы) [As ТипДанных] Параметр Preserve используется для сохранения данных в сущест-

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

Примеры

ReDim Товар(1 To 3) As String * 15

ReDim Preserve Товар(1 To 10) As String * 15

18

При использовании параметра Preserve можно изменить размер только последней размерности, а количество размерностей изменить нельзя.

Массивы типа Variant можно создавать и заполнять одновременно при помощи встроенной функции Array(<СписокЗначений>), например:

Dim Товар As Variant

Товар = Array(“Стул”, “Стол”, “Шкаф”)

Освободить память, занимаемую элементами динамического массива, и повторно инициализировать элементы массива фиксированной длины можно инструкцией Erase:

Erase СписокМассивов

Здесь СписокМассивов – один массив или список разделенных запятыми массивов. Инициализация элементов массива фиксированной длины осуществляется следующим образом:

Тип массива

Действие инструкции Erase

Фиксированный числовой массив

Устанавливает каждый элемент

в нуль

Фиксированный массив строк

Устанавливает каждый элемент

(переменной длины)

на нулевую длину строки («»)

Фиксированный массив строк

Устанавливает каждый элемент

(фиксированной длины)

в нуль

Фиксированный массив типа Variant

Устанавливает каждый элемент

в Empty

Массив данных определенных

Устанавливает каждый элемент, как

пользователем типов

будто это отдельная переменная

Массив объектов

Устанавливает каждый элемент

в величину Nothing

Если количество элементов в динамическом массиве не известно, то для его определения используется функция

UBound (ИмяМассива [, Измерение])

Необязательный параметр Измерение имеет тип Variant или Long. Это целое число, указывающее размерность, для которой определяется верхняя граница индекса. Для первой размерности используется число 1, для второй – 2 и т.д. если аргумент не указывается, по умолчанию используется значение 1.

Пример

Dim Товар(1 To 3) As String * 15 L=UBound (Товар)

Переменная L получит значение 3.

Функция UBound обычно используется с функцией LBound для определения размера массива, позволяющей найти наименьшее значение индекса указанной размерности. Формат функции:

LBound (ИмяМассива [, Измерение])

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

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

Часть
1. Основы Visual Basiс

На главную самоучителя

09.01.2005

Глава
10.

Статические
и динамические массивы.
Границы массивов. Сортировка массивов.

Скачать исходник примера "Menu"

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

Массив
— это сколько угодно значений, объединенных одним именем.

Массив,
прежде чем использовать, надо объявить. Объявляется он совершенно также как
и переменная. Если ты объявишь его локально в процедуре (здесь можно использовать
ключевое слово Static), то он будет доступен только в этой процедуре
и нигде больше, если в разделе (General)-(Daclarations) формы (c оператором
Dim) — то во всей форме, а если тебе нужно объявить его глобально, так,
чтобы он был доступен всему проекту, то в стандартном модуле с ключевым словом
Public.
Кроме того , массивы бывают статическими и динамическими.

Статический
массив
— это когда
ты заранее знаешь, сколько переменных туда нужно будет записать, т.е. если ты
объявил массив на 10 членов, то уж туда никак не запихнешь одиннадцать. В форме
он объявляется так:

Dim Chislo(9) As Long
Что здесь важно.
Dim — оператор, который точно также, как и при объявлении переменной,
объявляет массив и выделяет для нее память.
Chislo — ну это просто имя, придумывается также как и для переменной
и отвечает тем же требованиям.
(9) — количество элементов в массиве — их 10. Почему так. Дело в том,
что элементы массива нумеруются с нуля, а не с единицы, поэтому у нас десять
элементов массива c номерами 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Если для каких-то
целей такой порядок тебя не устраивает, то используется оператор Option Base
1
, который прописывается в разделе Declarations и привязывает первый
элемент ВСЕХ, повторяю ВСЕХ, массивов в программе к единице.
As Long — определение типа данных массива так же как тип обычной переменной.
Почти всегда все элементы массива имеют один и тот же тип ( в данном случае
длинное число Long). На крайняк, если это не так, или если ты не знаешь какого
типа будут данные, можно задать тип Variant, но это нежелательно из-за того,
что это занимает значительный объем памяти, особенно если массив большой.
Размерность — ее так сразу не заметно, но она здесь присутствует и равна
единице, потому, что у на одна циферка (девятка), т.е. наш массив является одномерным
— по сути список значений.
Теперь создадим массив для хранения результатов, ну скажем таблицы умножения
на 8. Поскольку на ноль умножать бесперспективно, привязываем первый элемент
массива к единице и объявляем переменную x для организации цикла For…Next.

Option Explicit
Option Base 1

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


Dim x As Long

Положим на
форму Text1 с установленными свойствами .MultiLine в True,
а .ScrollBars — в 2-Вертикаль, а также кнопку Command1.
В процедуре Form_Load напишем цикл, который будет присваивать каждому
элементу массива значение, соответствующее его номеру, умноженному на 8.

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

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

1
элемент

2
элемент

3
элемент

4
элемент

5
элемент

6
элемент

7
элемент

8
элемент

9
элемент

10
элемент

8

16

34

32

40

48

56

64

72

80

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

Option Explicit
Option Base 1

Dim Chislo(10, 2) As Long
Dim x As LongPrivate Sub Form_Load()
Text1.Text = ""
For x = 1 To 10
Chislo(x, 1) = x
Chislo(x, 2) = x * 8
Next xPrivate 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

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

 

1
элемент

2
элемент

3
элемент

4
элемент

5
элемент

6
элемент

7
элемент

8
элемент

9
элемент

10
элемент

1 элемент

1

2

3

4

5

6

7

8

9

10

2
элемент

8

16

34

32

40

48

56

64

72

80

таким образом
элемент массива Chislo (7,2) будет иметь значение 56.
Обратите внимание, что размерность массива определяет колиство циферек в
объявлении. Массив Chislo (10,5) — тоже двухмерный, только строк в табличке
было-бы не две, а пять. А объявление трехмерного массива выглядело бы так
Dim(10,5,2).Такую трехмерную таблицу нарисовать мне затруднительно. В
принципе VB поддерживает до 64 размерностей массива, но это в голове трудно
укладывается.
Все, как видите очень просто. Однако статические массивы используются довольно
редко. Чаше мы не знаем сколько данных мы будем иметь и потом ведь хочется дописать
при необходимости в массив новые данные. Для этого существуют динамические массивы.

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

Dim Mass () as String

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

Вообще-то, у нас два пути использования динамического массива.
Первый путь, это года мы узнаем (просчитываем) , сколько элементов массива нам
нужно, и после этого объявляем массив небходимого нам размера. Однако мне это
путь не очень нравится, поскольку, нам приходится задавать два цикла: один —
для просчета необходимого количества элементов, второй — для собственно присваивания
массиву значений переменных.
Второй путь, это когда мы в одном цикле при нахождении каждого нового данного
переобъявляем массив с увеличением количества его элементов. Но этот способ
загружает компьютер и может занимать много времени на обработку, особенно если
создается большой массив. Происходит это из-за перераспределения элементов массива
в памяти всякий раз при его переобъявлении и добавлении нового члена. Но именно
такой способ мы применим при разработке программки Scanfiles,
которая будет сканировать файлы в выбранной директории, сортировать их по-возрастанию
и выводить в Text1. Хочу сразу заметить, что при переобъявлении массива
все записанные в него данные стираются — массив обнуляется. Чтобы этого не происходило,
надо использовать ключевое слово Peserve:

Redim Preserve
Mass (5) as String

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

Option Explicit
'Установим начальную нумерацию массива
с единицы, сейчас так удобнее

Option Base 1
'объявим переменные
Dim OurDir As
String
'для директории, где будем искать файлы
Dim FileName As String 'для
имен находимых файлов

Dim X As Long 'просто
для цикла

'и, наконец, наш динамический массив, как
строковый

Dim Files() As
String


Кроме
того, поскольку одни имена — это уж совсем скучно, то мы еще во вторую размерность
массива выведем атрибуты файла. Атрибуты, это когда по файлу шлепаешь правой
кнопкой мыши и в выпавшем меню выбираешь «Свойства«. Тогда
снизу окна этих свойств можно увидеть галочки рядом с загадочными словами «Только
чтение», «Скрытый» и «Архивный». Именно эти свойства
можно устанавливать или получать с помощью оператора SetAttr и функции
GetAttr. Весь геморрой в том, что этот атрибут представляет из себя число,
получаемое из суммы значений атрибутов, приведенных в таблице ниже, и чтобы
понять, какой атрибут все-таки у файла, нужно «с помощью оператора And
выполнить поразрядное сравнение значения»
. Друзья мои. Это цитату из
Help5 я привел для того, чтобы можно было почувствовать разницу между «академическим»
и «вольным» изложением проблемы. Короче, привожу таблицу этих атрибутов:

Константа

Значение

Описание

vbNormal

0

Обычный.
vbReadOnly

1

Только
для чтения.
vbHidden

2

Скрытый.
vbSystem

4

Системный.
vbDirectory

16

Каталог
или папка.
vbArchive

32

Архивный.

Из всей этой
дребедни нам нужны три константы: vbArchive, vbReadOnly и vbHidden
для этого самого «поразрядного сравнения». Делается это так:
Чтобы узнать, только для чтения ли этот файл:
Переменная = GetAttr(«полный путь к файлу») And
vbReadOnly

Если в Переменной не ноль, то файл — только для чтения. Аналогично для других
констант.
Чтобы установить аттрибут, например «Архивный» для файла:
SetAttr «C:Andreyindex.htm», vbReadOnly
при этом уже установленные атрибуты файла сбрасываются. Если надо установить
атрибуты «только для чтения» и «архивный»:
SetAttr «C:Andreyindex.htm», vbReadOnly +vbArchive
Все просто, а по сути — издевательство. Про атрибуты — все. Более интересные
данные о файлах мы получим, когда начнем использовать FSO. Но об этом не сегодня.
Итак, для хранения атрибута (на основании «поразрядного сравнения»)
продолжаем объявлять переменные (еще две)

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

Напишем маленькую
процедурку для Dir1 на событие Change. Дело в том, что событие
Change наступает при двойном клике, а я и хочу, чтобы директория для
поиска файлов устанавливалась по двойному клику. В этой процедурке мы очистим
Text1 и обнулим переменные, ну и главное, запишем в переменную OurDir
полный путь к директории, после чего перейдем к другой поцедуре —
ScanDir,
где собственно и будем искать файлы и записывать их имена и атрибуты в наш массив
Files.

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 While 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
.

Надо сказать, что размерность
— не обязательный параметр и по-умолчанию принимается за единицу.
Теперь перейдем к сортировке массива:

Private Sub Sort() 'процедура
сортировки

Dim K As Long
Dim N As Long
Dim y As Long 'просто
для цикла For...Next

Dim Peremen As String
'для временного храненения из массива имени файла
Dim Peremen2 As String
'и атрибута файла
Dim NomerPerem As String
Dim NomerPerem2 As String
'сортировка массива
K = LBound(Files, 2) 'присваиваем переменной К начальное
значение массива - 1 (нижняя граница)

For y = LBound(Files, 2) To
UBound(Files, 2) 'просматриваем все строки массива с нижней
до верхней границы

Peremen = Files(1, y) 'присваиваем каждую строку в переменные
Peremen2 = Files(2, y)
'вложенный цикл
For N = y To UBound(Files,
2) 'просматриваем строки массива, начиная с той,
'значения которой храняться в переменных Peremen и Peremen2
If Files(1, N) < Peremen 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

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

Присвоение
содержимого одного массива другому.

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

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 LongFor 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

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


Copyright
©
2005 4us

Сайт создан в системе uCoz

Как сделать, чтобы массив начинался не с 0, а 1 индекса?

Виталина's user avatar

Виталина

111 золотой знак2 серебряных знака8 бронзовых знаков

4

Если программируете на С++, то можно переписать действие оператора [ ], но я вам не рекомендую это делать, можете непосредственно вычитать единицу при индексации:

for (int i=1; i<N; i++){
cout<<array[i-1]<<endl; }

ответ дан 7 сен 2014 в 17:27

Svensen's user avatar

SvensenSvensen

3261 серебряный знак5 бронзовых знаков

Свою функцию написать по работе с массивом. В аргументе передаете 1 для обозначения 1-го элемента и внутри хитро меняете на 0, чтобы никто не видел. А в стандартном исполнении никак. Например, в Си имя массива есть указатель на первый элемент, а индекс ноль просто задает смещение относительно начала массива. Нулевое смещение и дает ссылку на первый элемент. Все привязано к технике. А так только свою функцию реализовывать. Ноль слишком раздражает, ну представьте, что это единица, просто пухлая)

Виталина's user avatar

Виталина

111 золотой знак2 серебряных знака8 бронзовых знаков

ответ дан 5 сен 2014 в 14:26

aleksandr_mai's user avatar

3

Понравилась статья? Поделить с друзьями:

Новое и полезное:

  • Для запуска игры необходимо чтобы процессор поддерживал инструкции avx
  • Для завершения покупки следуйте инструкции
  • Для женс про инструкция по применению
  • Для женс метри инструкция по применению цена
  • Для желудка энтеросгель инструкция по применению

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии