Vba список: Работа со списками в Visual Basic

Содержание

Type List — Visual Basic

  • Чтение занимает 3 мин

В этой статье

Задает Параметры типа для универсального программного элемента.Specifies the type parameters for a generic programming element. Несколько параметров разделяются запятыми.Multiple parameters are separated by commas. Ниже приведен синтаксис для одного параметра типа.Following is the syntax for one type parameter.

СинтаксисSyntax

[genericmodifier] typename [ As constraintlist ]

КомпонентыParts

ТерминTerm ОпределениеDefinition
genericmodifier Необязательный элемент.Optional. Может использоваться только в универсальных интерфейсах и делегатах.Can be used only in generic interfaces and delegates. Ковариантность типа можно объявить с помощью ключевого слова out или контравариантного с помощью ключевого слова in .You can declare a type covariant by using the Out keyword or contravariant by using the In keyword. См. раздел Ковариация и контрвариация.See Covariance and Contravariance.
typename Обязательный.Required. Имя параметра типа.Name of the type parameter. Это заполнитель, заменяемый определенным типом, предоставленным соответствующим аргументом типа.This is a placeholder, to be replaced by a defined type supplied by the corresponding type argument.
constraintlist Необязательный элемент.Optional. Список требований, ограничивающих тип данных, который может быть представлен для typename .List of requirements that constrain the data type that can be supplied for typename. При наличии нескольких ограничений заключите их в фигурные скобки (
{ }
) и разделите их запятыми.If you have multiple constraints, enclose them in curly braces ({ }) and separate them with commas. Список ограничений необходимо ввести с помощью ключевого слова as .You must introduce the constraint list with the As keyword. Используется As только один раз в начале списка.You use As only once, at the beginning of the list.

КомментарииRemarks

Каждый универсальный программный элемент должен принимать по крайней мере один параметр типа.Every generic programming element must take at least one type parameter. Параметр типа — это заполнитель для определенного типа ( сконструированного элемента), который клиентский код указывает при создании экземпляра универсального типа.A type parameter is a placeholder for a specific type (a constructed element) that client code specifies when it creates an instance of the generic type. Можно определить универсальный класс, структуру, интерфейс, процедуру или делегат.You can define a generic class, structure, interface, procedure, or delegate.

Дополнительные сведения о том, когда следует определять универсальный тип, см. в разделе Универсальные типы в Visual Basic.For more information on when to define a generic type, see Generic Types in Visual Basic. Дополнительные сведения об именах параметров типов см. в разделе Имена объявленных элементов.For more information on type parameter names, see Declared Element Names.

ПравилаRules

  • Скобки.Parentheses. Если вы представите список параметров типа, необходимо заключить его в круглые скобки и ввести в список ключевое слово of .If you supply a type parameter list, you must enclose it in parentheses, and you must introduce the list with the Of keyword. Используется

    Of только один раз в начале списка.You use Of only once, at the beginning of the list.

  • Учитывая.Constraints. Список ограничений для параметра типа может включать в себя следующие элементы в любом сочетании:A list of constraints on a type parameter can include the following items in any combination:

    • Любое количество интерфейсов.Any number of interfaces. Указанный тип должен реализовывать каждый интерфейс в этом списке.The supplied type must implement every interface in this list.

    • Не более одного класса.At most one class. Указанный тип должен наследоваться от этого класса.The supplied type must inherit from that class.

    • Ключевое слово New.The New keyword. Предоставленный тип должен предоставлять конструктор без параметров, к которому имеет доступ универсальный тип.The supplied type must expose a parameterless constructor that your generic type can access. Это полезно, если параметр типа ограничивается одним или несколькими интерфейсами.This is useful if you constrain a type parameter by one or more interfaces. Тип, реализующий интерфейсы, не обязательно предоставляет конструктор, и в зависимости от уровня доступа конструктора код в универсальном типе может не иметь возможности получить к нему доступ.A type that implements interfaces does not necessarily expose a constructor, and depending on the access level of a constructor, the code within the generic type might not be able to access it.

    • ClassКлючевое слово или Structure ключевое слово.Either the Class keyword or the Structure keyword. ClassКлючевое слово ограничивает параметр универсального типа, требуя, чтобы любой передаваемый аргумент типа был ссылочным типом, например строкой, массивом или делегатом, или объектом, созданным из класса.The

      Class keyword constrains a generic type parameter to require that any type argument passed to it be a reference type, for example a string, array, or delegate, or an object created from a class. StructureКлючевое слово ограничивает параметр универсального типа, требуя, чтобы любой передаваемый аргумент типа был типом значения, например структурой, перечислением или простым типом данных.The Structure keyword constrains a generic type parameter to require that any type argument passed to it be a value type, for example a structure, enumeration, or elementary data type. Нельзя включать Class и Structure в, и в одном и том же constraintlist .You cannot include both
      Class
      and Structure in the same constraintlist.

    Указанный тип должен отвечать всем требованиям, включенным в constraintlist .The supplied type must satisfy every requirement you include in constraintlist.

    Ограничения для каждого параметра типа не зависят от ограничений для других параметров типа.Constraints on each type parameter are independent of constraints on other type parameters.

ПоведениеBehavior

  • Подстановка во время компиляции.Compile-Time Substitution. При создании сконструированного типа на основе универсального программного элемента вы предоставляете определенный тип для каждого параметра типа.When you create a constructed type from a generic programming element, you supply a defined type for each type parameter. Компилятор Visual Basic замещает указанный тип для каждого вхождения

    typename в пределах универсального элемента.The Visual Basic compiler substitutes that supplied type for every occurrence of typename within the generic element.

  • Отсутствие ограничений.Absence of Constraints. Если не указать какие-либо ограничения на параметр типа, код будет ограничен операциями и элементами, поддерживаемыми типом данных Object для этого параметра типа.If you do not specify any constraints on a type parameter, your code is limited to the operations and members supported by the Object Data Type for that type parameter.

ПримерExample

В следующем примере показано определение каркаса универсального класса Dictionary, включая скелет функции для добавления новой записи в словарь.The following example shows a skeleton definition of a generic dictionary class, including a skeleton function to add a new entry to the dictionary.

Public Class dictionary(Of entryType, keyType As {IComparable, IFormattable, New})
    Public Sub add(ByVal et As entryType, ByVal kt As keyType)
        Dim dk As keyType
        If kt.CompareTo(dk) = 0 Then
        End If
    End Sub
End Class

ПримерExample

Поскольку dictionary является универсальным, код, который использует его, может создавать разнообразные объекты, каждый из которых имеет одинаковые функциональные возможности, но работает с другим типом данных.Because dictionary is generic, the code that uses it can create a variety of objects from it, each having the same functionality but acting on a different data type. В следующем примере показана строка кода, создающая dictionary объект с

String записями и Integer ключами.The following example shows a line of code that creates a dictionary object with String entries and Integer keys.

Dim dictInt As New dictionary(Of String, Integer)

ПримерExample

В следующем примере показано эквивалентное определение скелета, созданное в предыдущем примере.The following example shows the equivalent skeleton definition generated by the preceding example.

Public Class dictionary
    Public Sub Add(ByVal et As String, ByVal kt As Integer)
        Dim dk As Integer
        If kt.CompareTo(dk) = 0 Then
        End If
    End Sub
End Class

См. также разделSee also

VBA Excel. ListBox – заполнение списка данными

Заполнение ListBox данными с помощью кода VBA Excel. Добавление значений в список методом AddItem, с помощью свойств List и RowSource. Примеры.


В примерах используется событие пользовательской формы UserForm_Initialize, реализуемое в модуле формы. Это очень удобно при тестировании, когда запуск формы или кода приводит к одному результату. Кроме того, из модуля формы обращаться к форме можно с помощью ключевого слова «Me».

Создайте в редакторе VBA Excel пользовательскую форму с любым именем и разместите на ней список с именем ListBox1. Вставляйте в модуль формы код примера, запускайте код или форму и смотрите результат.

Чтобы запустить форму, фокус должен быть на ее проекте или на одном из ее элементов управления. Чтобы запустить код, курсор должен быть в одной из его строк. Запускается код или форма нажатием клавиши «F5» или треугольной кнопки «Run Sub/UserForm»:

Заполнение ListBox методом AddItem

Метод AddItem используется для загрузки отдельного элемента в ListBox. Он создает в списке новую строку и записывает в нее значение. Используя цикл, можно загрузить в ListBox одномерный массив.

Пример 1
Загрузка элементов в ListBox по отдельности:

Private Sub UserForm_Initialize()

  With Me.ListBox1

    .AddItem «Зима»

    .AddItem «Весна»

    .AddItem «Лето»

    .AddItem «Осень»

  End With

End Sub

Результат работы кода:

Пример 2
Загрузка данных в ListBox из одномерного массива при помощи цикла VBA Excel:

Private Sub UserForm_Initialize()

Dim myArray() As Variant, myElement As Variant

myArray = Array(«Зима», «Весна», «Лето», «Осень»)

  With Me.ListBox1

    For Each myElement In myArray

      .AddItem myElement

    Next

  End With

End Sub

Заполнение ListBox с помощью свойства List

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

Пример 3
Заполнение списка данными из одномерного массива.

Загрузка значений, возвращенных функцией Array:

Private Sub UserForm_Initialize()

Me.ListBox1.List = Array(«Зима», «Весна», «Лето», «Осень»)

End Sub

Загрузка значений из переменной одномерного массива:

Private Sub UserForm_Initialize()

Dim myArray() As Variant

myArray = Array(«Январь», «Февраль», «Март», «Апрель», «Май»)

Me.ListBox1.List = myArray

End Sub

Пример 4
Заполнение списка данными из двухмерного массива.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Private Sub UserForm_Initialize()

‘Объявляем переменную массива 3×3

Dim myArray(2, 2) As Variant

  myArray(0, 0) = «Зима»

  myArray(0, 1) = «Январь»

  myArray(0, 2) = «Мороз»

  myArray(1, 0) = «Весна»

  myArray(1, 1) = «Апрель»

  myArray(1, 2) = «Теплеет»

  myArray(2, 0) = «Лето»

  myArray(2, 1) = «Июль»

  myArray(2, 2) = «Жара»

With Me.ListBox1

  ‘Указываем, что у нас 3 столбца

  .ColumnCount = 3

  ‘Задаем ширину столбцов, если надо

  .ColumnWidths = «50;50;50»

  .List = myArray

End With

End Sub

Результат получается следующий:

Пример 5
Заполнение списка с тремя столбцами по каждому элементу отдельно. Создаем строку и записываем значение в первый столбец методом AddItem. Значения во второй и третий столбцы записываем с помощью свойства List по индексам:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Private Sub UserForm_Initialize()

With Me.ListBox1

  ‘Указываем, что у нас 3 столбца

  .ColumnCount = 3

  ‘Задаем ширину столбцов, если надо

  .ColumnWidths = «50;50;50»

  .AddItem «Зима»

  .List(0, 1) = «Январь»

  .List(0, 2) = «Мороз»

  .AddItem «Весна»

  .List(1, 1) = «Апрель»

  .List(1, 2) = «Теплеет»

  .AddItem «Лето»

  .List(2, 1) = «Июль»

  .List(2, 2) = «Жара»

End With

End Sub

Результат работы кода будет таким же, как в Примере 4.

Заполнение ListBox с помощью свойства RowSource

Свойство RowSource позволяет загрузить в элемент управления ListBox значения из диапазона ячеек на рабочем листе Excel. Задать адрес диапазона свойству RowSource можно как в ходе выполнения кода VBA, так и в окне Properties элемента управления ListBox.

Адрес диапазона ячеек для свойства RowSource указывается по следующей формуле: "Имя_листа!Адрес_диапазона". Имя_листа соответствует имени листа по ярлыку. Адрес в окне Properties вводится без парных кавычек.

Если адрес диапазона указать без имени рабочего листа, то данные будут загружаться в список из соответствующего диапазона активного листа. Если имя рабочего листа содержит пробелы, то его следует заключить в одинарные кавычки: "'Данные для списка'!A1:A10".

Пример 6
Импорт данных в одностолбцовый список из диапазона «A1:A7» рабочего листа «Лист1»:

Private Sub UserForm_Initialize()

  Me.ListBox1.RowSource = «Лист1!A1:A7»

End Sub

Пример 7
Импорт данных в четырехстолбцовый список с заголовками из диапазона «A2:D4» рабочего листа «Лист1» (заголовки импортируются автоматически из диапазона «A1:D1»):

Private Sub UserForm_Initialize()

With Me.ListBox1

  ‘Указываем, что у нас 4 столбца

  .ColumnCount = 4

  ‘Задаем размеры столбцов

  .ColumnWidths = «50;50;50;50»

  ‘Указываем, что нужна строка заголовков

  .ColumnHeads = True

  ‘Импортируем данные

  .RowSource = «Лист1!A2:D4»

End With

End Sub

Другая информация об элементе управления ListBox представлена в отдельной статье.

Список функций листов, доступных для Visual Basic

  • Чтение занимает 2 мин

В этой статье

В следующем списке представлены все функции листа, которые можно вызывать с помощью объекта метод WorksheetFunction .The following list represents all of the worksheet functions that can be called using the WorkSheetFunction object.

Для получения дополнительных сведений о конкретной функции, обратитесь к разделу функции Excel (по категориям) .For more information about a particular function, see the Excel functions (by category) topic.

  • НАКОПДОХОДAccrInt
  • НАКОПДОХОДПОГАШAccrIntM
  • ACOSAcos
  • ACOSHAcosh
  • АГРЕГАТAggregate
  • АМОРУМAmorDegrc
  • АМОРУВAmorLinc
  • ИAnd
  • ApplicationApplication
  • AscAsc
  • ASINAsin
  • ASINHAsinh
  • ATAN2Atan2
  • ATANHAtanh
  • СРОТКЛAveDev
  • СРЗНАЧAverage
  • СРЗНАЧЕСЛИAverageIf
  • СРЗНАЧЕСЛИМНAverageIfs
  • БАТТЕКСТBahtText
  • БЕССЕЛЬBesselI
  • БЕССЕЛЬ.JBesselJ
  • БЕССЕЛЬ.KBesselK
  • БЕССЕЛЬ.YBesselY
  • БЕТАРАСПBetaDist
  • БЕТАОБРBetaInv
  • Bin2DecBin2Dec
  • Bin2HexBin2Hex
  • Bin2OctBin2Oct
  • Binom_DistBinom_Dist
  • Binom_InvBinom_Inv
  • БИНОМРАСПBinomDist
  • CeilingCeiling
  • Ceiling_PreciseCeiling_Precise
  • ХИ2РАСПChiDist
  • ХИ2ОБРChiInv
  • ChiSq_DistChiSq_Dist
  • ChiSq_Dist_RTChiSq_Dist_RT
  • ChiSq_InvChiSq_Inv
  • ChiSq_Inv_RTChiSq_Inv_RT
  • ChiSq_TestChiSq_Test
  • ХИ2ТЕСТChiTest
  • ВЫБОРChoose
  • ЧистыйClean
  • ЧИСЛКОМБCombin
  • КОМПЛЕКСНComplex
  • ConfidenceConfidence
  • Confidence_NormConfidence_Norm
  • Confidence_TConfidence_T
  • ПреобразоватьConvert
  • КОРРЕЛCorrel
  • COSHCosh
  • CountCount
  • СЧЁТЗCountA
  • СЧИТАТЬПУСТОТЫCountBlank
  • СЧЁТЕСЛИCountIf
  • СЧЁТЕСЛИМНCountIfs
  • ДНЕЙКУПОНДОCoupDayBs
  • ДНЕЙКУПОНCoupDays
  • ДНЕЙКУПОНПОСЛЕCoupDaysNc
  • ДАТАКУПОНПОСЛЕCoupNcd
  • ЧИСЛКУПОНCoupNum
  • ДАТАКУПОНДОCoupPcd
  • КОВАРCovar
  • Covariance_PCovariance_P
  • Covariance_SCovariance_S
  • КРИТБИНОМCritBinom
  • ОБЩПЛАТCumIPmt
  • ОБЩДОХОДCumPrinc
  • ДСРЗНАЧDAverage
  • ДНЕЙ360Days360
  • ФУОDb
  • БДЦСDbcs
  • БСЧЁТDCount
  • БСЧЁТАDCountA
  • ДДОБDdb
  • ДЕС.В.ДВDec2Bin
  • ДЕС.В.ШЕСТНDec2Hex
  • ДЕС.В.ВОСЬМDec2Oct
  • ГРАДУСЫDegrees
  • ДЕЛЬТАDelta
  • КВАДРОТКЛDevSq
  • БИЗВЛЕЧЬDGet
  • СКИДКАDisc
  • ДМАКСDMax
  • ДМИНDMin
  • РУБЛЬDollar
  • РУБЛЬ.ДЕСDollarDe
  • РУБЛЬ.ДРОБЬDollarFr
  • БДПРОИЗВЕДDProduct
  • ДСТАНДОТКЛDStDev
  • ДСТАНДОТКЛПDStDevP
  • БДСУММDSum
  • Duration (Длительность)Duration
  • БДДИСПDVar
  • БДДИСППDVarP
  • ДАТАМЕСEDate
  • ЭффектEffect
  • КОНМЕСЯЦАEoMonth
  • ФОШErf
  • Erf_PreciseErf_Precise
  • ДФОШErfC
  • ЧЁТНEven
  • Expon_DistExpon_Dist
  • ЭКСПРАСПExponDist
  • F_DistF_Dist
  • F_Dist_RTF_Dist_RT
  • F_InvF_Inv
  • F_Inv_RTF_Inv_RT
  • F_TestF_Test
  • ФАКТРFact
  • ДВФАКТРFactDouble
  • FРАСПFDist
  • ПоискFind
  • НАЙТИБFindB
  • FРАСПОБРFInv
  • ФИШЕРFisher
  • ФИШЕРОБРFisherInv
  • ИСПРАВЛЕНОFixed
  • FloorFloor
  • ПРЕДСКАЗForecast
  • ЧастотаFrequency
  • ФТЕСТFTest
  • БСFv
  • БЗРАСПИСFVSchedule
  • Gamma_DistGamma_Dist
  • Gamma_InvGamma_Inv
  • ГАММАРАСПGammaDist
  • ГАММАОБРGammaInv
  • ГАММАНЛОГGammaLn
  • GammaLn_PreciseGammaLn_Precise
  • НОДGcd
  • СРГЕОМGeoMean
  • ПОРОГGeStep
  • РОСТGrowth
  • СРГАРМHarMean
  • ШЕСТН.В.ДВHex2Bin
  • ШЕСТН.В.ДЕСHex2Dec
  • ШЕСТН.В.ВОСЬМHex2Oct
  • ГПРHLookup
  • HypGeom_DistHypGeom_Dist
  • ГИПЕРГЕОМЕТHypGeomDist
  • ЕСЛИОШИБКАIfError
  • МНИМ.ImAbs
  • МНИМ.ЧАСТЬImaginary
  • МНИМ.АРГУМЕНТImArgument
  • МНИМ.СОПРЯЖImConjugate
  • МНИМ.COSImCos
  • МНИМ.ДЕЛImDiv
  • МНИМ.EXPImExp
  • МНИМ.LNImLn
  • МНИМ.LOG10ImLog10
  • МНИМ.LOG2ImLog2
  • МНИМ.СТЕПЕНЬImPower
  • МНИМ.ПРОИЗВЕДImProduct
  • МНИМ.ВЕЩImReal
  • МНИМ.SINImSin
  • МНИМ.КОРЕНЬImSqrt
  • МНИМ.РАЗНImSub
  • МНИМ.СУММImSum
  • IndexIndex
  • InterceptIntercept
  • ИНОРМАIntRate
  • ПРПЛТIpmt
  • ВСДIrr
  • ЕОШIsErr
  • IsErrorIsError
  • ЕЧЁТНIsEven
  • ЕЛОГИЧIsLogical
  • ЕНДIsNA
  • ЕНЕТЕКСТIsNonText
  • ЕЧИСЛОIsNumber
  • ЕНЕЧЁТIsOdd
  • ПРОЦПЛАТIspmt
  • ЕТЕКСТIsText
  • ЭКСЦЕССKurt
  • НАИБОЛЬШИЙLarge
  • НОКLcm
  • ЛИНЕЙНLinEst
  • LNLn
  • LogLog
  • Log10Log10
  • ЛГРФПРИБЛLogEst
  • ЛОГНОРМОБРLogInv
  • LogNorm_DistLogNorm_Dist
  • LogNorm_InvLogNorm_Inv
  • ЛОГНОРМРАСПLogNormDist
  • ПРОСМОТРLookup
  • ПОИСКПОЗMatch
  • MaxMax
  • МОПРЕДMDeterm
  • МДЛИТMDuration
  • МЕДИАНАMedian
  • MinMin
  • МОБРMInverse
  • МВСДMIrr
  • МУМНОЖMMult
  • РежимMode
  • Mode_MultMode_Mult
  • Mode_SnglMode_Sngl
  • ОКРУГЛТMRound
  • МУЛЬТИНОМMultiNomial
  • NegBinom_DistNegBinom_Dist
  • ОТРБИНОМРАСПNegBinomDist
  • ЧИСТРАБДНИNetworkDays
  • НОМИНАЛNominal
  • Norm_DistNorm_Dist
  • Norm_InvNorm_Inv
  • Norm_S_DistNorm_S_Dist
  • Norm_S_InvNorm_S_Inv
  • НОРМРАСПNormDist
  • НОРМОБРNormInv
  • НОРМСТРАСПNormSDist
  • НОРМСТОБРNormSInv
  • NPerNPer
  • ЧПСNpv
  • ВОСЬМ.В.ДВOct2Bin
  • ВОСЬМ.В.ДЕСOct2Dec
  • ВОСЬМ.В.ШЕСТНOct2Hex
  • НЕЧЁТOdd
  • ЦЕНАПЕРВНЕРЕГOddFPrice
  • ДОХОДПЕРВНЕРЕГOddFYield
  • ЦЕНАПОСЛНЕРЕГOddLPrice
  • ДОХОДПОСЛНЕРЕГOddLYield
  • ИЛИOr
  • ПИРСОНPearson
  • ПЕРСЕНТИЛЬPercentile
  • Percentile_ExcPercentile_Exc
  • Percentile_IncPercentile_Inc
  • ПРОЦЕНТРАНГPercentRank
  • PercentRank_ExcPercentRank_Exc
  • PercentRank_IncPercentRank_Inc
  • ПЕРЕСТPermut
  • PhoneticPhonetic
  • PiPi
  • ПлтPmt
  • ПУАССОНPoisson
  • Poisson_DistPoisson_Dist
  • PowerPower
  • ОСПЛТPpmt
  • ЦЕНАPrice
  • ЦЕНАСКИДКАPriceDisc
  • ЦЕНАПОГАШPriceMat
  • ВЕРОЯТНОСТЬProb
  • ПродуктProduct
  • ПРОПНАЧProper
  • ПСPv
  • КВАРТИЛЬQuartile
  • Quartile_ExcQuartile_Exc
  • Quartile_IncQuartile_Inc
  • ЧАСТНОЕQuotient
  • РАДИАНЫRadians
  • СЛУЧМЕЖДУRandBetween
  • РАНГRank
  • Rank_AvgRank_Avg
  • Rank_EqRank_Eq
  • СтавкаRate
  • ПОЛУЧЕНОReceived
  • ЗаменаReplace
  • ЗАМЕНИТЬБReplaceB
  • ПОВТОРRept
  • РИМСКОЕRoman
  • RoundRound
  • ОКРУГЛВНИЗRoundDown
  • ОКРУГЛВВЕРХRoundUp
  • КВПИРСОНRSq
  • ДРВRTD
  • ПоискSearch
  • ПОИСКБSearchB
  • РЯД.СУММSeriesSum
  • SINHSinh
  • СКОСSkew
  • АПЛSln
  • НАКЛОНSlope
  • НАИМЕНЬШИЙSmall
  • КОРЕНЬПИSqrtPi
  • StandardizeStandardize
  • StDevStDev
  • StDev_PStDev_P
  • StDev_SStDev_S
  • СТАНДОТКЛОНПStDevP
  • СТОШYXStEyx
  • ПОДСТАВИТЬSubstitute
  • Промежуточный итогSubtotal
  • SumSum
  • СУММЕСЛИSumIf
  • СУММЕСЛИМНSumIfs
  • СУММПРОИЗВSumProduct
  • СУММКВSumSq
  • СУММРАЗНКВSumX2MY2
  • СУММСУММКВSumX2PY2
  • СУММКВРАЗНSumXMY2
  • АСЧSyd
  • T_DistT_Dist
  • T_Dist_2tT_Dist_2t
  • T_Dist_RTT_Dist_RT
  • T_InvT_Inv
  • T_Inv_2TT_Inv_2T
  • T_TestT_Test
  • TANHTanh
  • РАВНОКЧЕКTBillEq
  • ЦЕНАКЧЕКTBillPrice
  • ДОХОДКЧЕКTBillYield
  • СТЬЮДРАСПTDist
  • ТекстText
  • СТЬЮДРАСПОБРTInv
  • ТРАНСПTranspose
  • ТЕНДЕНЦИЯTrend
  • УсечьTrim
  • УРЕЗСРЕДНЕЕTrimMean
  • ТТЕСТTTest
  • ДОЛЛСШАUSDollar
  • VarVar
  • Var_PVar_P
  • Var_SVar_S
  • ДИСПРVarP
  • ПУОVdb
  • ВПРVLookup
  • День неделиWeekday
  • НОМНЕДЕЛИWeekNum
  • ВЕЙБУЛЛWeibull
  • Weibull_DistWeibull_Dist
  • РАБДЕНЬWorkDay
  • WorkDay_IntlWorkDay_Intl
  • ЧИСТВНДОХXirr
  • ЧИСТНЗXnpv
  • ДОЛЯГОДАYearFrac
  • ДОХОДСКИДКАYieldDisc
  • ДОХОДПОГАШYieldMat
  • Z_TestZ_Test
  • ZTEСTZTest

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

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

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

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

UserForm.ComboBox – это элемент управления пользовательской формы, предназначенный для передачи в код VBA информации, выбранной пользователем из раскрывающегося списка или введенной с клавиатуры.

ComboBox представляет из себя комбинацию двух элементов управления: текстового поля (TextBox) и списка (ListBox), поэтому его еще называют «комбинированным списком» или «полем со списком». Также ComboBox сочетает в себе свойства этих двух элементов управления.

Изначально комбинированный список прорисовывается на форме в виде текстового поля с кнопкой для отображения раскрывающегося списка. Далее по тексту будем использовать слово «поле» в значении текстового поля в составе элемента управления ComboBox, а словосочетание «раскрывающийся список» – в значении списка в составе элемента управления ComboBox.

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

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

Свойства поля со списком

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

* При Enabled в значении False пользователь не может раскрывать список, а также вводить или редактировать данные в поле.
** Для элемента управления ComboBox действие свойства Locked в значении True аналогично действию свойства Enabled в значении False.

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

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

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

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

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

With UserForm1.ComboBox1

  .AddItem «Элемент 1»

  .AddItem «Элемент 2»

  .AddItem «Элемент 3»

End With

Используйте свойство List, чтобы скопировать одномерный массив значений в элемент управления ComboBox:

UserForm1.ComboBox1.List = Array(«Строка 1», _

«Строка 2», «Строка 3», «Строка 4», «Строка 5»)

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

Используйте свойство RowSource, чтобы загрузить в ComboBox значения из диапазона ячеек рабочего листа:

UserForm1.ComboBox1.RowSource = «Лист5!B1:B15»

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

With UserForm1.ComboBox1

  ‘Указываем количество столбцов

  .ColumnCount = 5

  .RowSource = «‘Таблица с данными’!A1:E20»

End With

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

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

Привязка поля со списком к ячейке

Чтобы привязать комбинированный список к ячейке на рабочем листе Excel, необходимо свойству ControlSource присвоить адрес ячейки. Это можно сделать непосредственно в окне Properties элемента управления ComboBox или в коде VBA:

UserForm1.ComboBox1.ControlSource = "Лист1!B2"

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

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

Чтобы протестировать результаты привязки ячейки к полю со списком ComboBox1, разместите на пользовательской форме UserForm1 еще какой-нибудь элемент управления и запустите следующий код VBA Excel:

Sub Test()

With UserForm1.ComboBox1

  ‘Заполняем список ComboBox1 данными

  .List = Array(«Красный», «Оранжевый», «Желтый», _

  «Зеленый», «Голубой», «Синий», «Фиолетовый»)

  ‘Привязываем ComboBox1 к ячейке «A1»

  .ControlSource = «A1»

  ‘Открываем форму в немодальном окне

End With

  UserForm1.Show 0

End Sub

В результате работы кода пользовательская форма откроется в немодальном окне со значением в поле, скопированном из ячейки «A1» активного листа. Немодальное окно формы позволит редактировать ячейку «A1», не закрывая форму.

Меняйте значение ячейки «A1», нажимайте клавишу «Tab» или «Enter», поле комбинированного списка примет значение ячейки. Меняйте значение поля ComboBox1 с помощью клавиатуры или выбирайте из раскрывающегося списка, нажимайте клавишу «Tab» или «Enter», ячейка «A1» примет значение поля со списком.

Дополнительный элемент управления на форме нужен для передачи ему фокуса нажатием клавиши «Tab» или «Enter», чтобы завершить ввод значения в поле ComboBox1. Иначе новое значение поля будет передано в ячейку «A1» только при закрытии формы.

Значение ComboBox по умолчанию

В раскрывающийся список элемента управления ComboBox1 загружены названия семи основных цветов:

Private Sub UserForm_Initialize()

With Me.ComboBox1

  .List = Array(«Красный», «Оранжевый», «Желтый», _

  «Зеленый», «Голубой», «Синий», «Фиолетовый»)

  ‘Сюда добавляем код вставки значения по умолчанию

End With

End Sub

Есть несколько вариантов сделать так, чтобы при открытии пользовательской формы в поле ComboBox1 было отображено значение по умолчанию. Код следует вставлять перед строкой «End With».

‘Вариант 1 (произвольная строка)

.Value = «Моя строка по умолчанию»

‘или

.Value = «Синий»

 

‘Вариант 2 (произвольная строка)

.ControlSource = «A1»

Range(«A1») = «Моя строка по умолчанию»

‘или

.ControlSource = «A1»

Range(«A1») = «Желтый»

 

‘Вариант 3 (строка из списка)

.ListIndex = 0 ‘Красный

‘или

.ListIndex = 3 ‘Зеленый

Кроме значения по умолчанию, в свойства комбинированного списка можно добавить текст всплывающей подсказки, который будет отображаться при наведении на ComboBox курсора:

UserForm1.ComboBox1.ControlTipText = "Выберите значение из списка"

Извлечение информации из ComboBox

Первоначально элемент управления ComboBox открывается с пустым полем или значением по умолчанию. Свойства Value и Text в этом случае возвращают пустую строку или текст по умолчанию.

Если пользователь выбрал новое значение из раскрывающегося списка или ввел его с клавиатуры, оно перезапишет значения свойств Value и Text. Из этих свойств мы с помощью кода VBA Excel извлекаем информацию, выбранную или введенную пользователем:

Dim myTxt As String

myTxt = UserForm1.ComboBox1.Value

‘или

myTxt = UserForm1.ComboBox1.Text

Вторую строку кода можно записать myTxt = UserForm1.ComboBox1, так как Value является свойством поля со списком по умолчанию.

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

Иногда перед загрузкой в ComboBox требуется отобрать уникальные элементы из имеющегося списка. Смотрите, как это сделать с помощью объектов Collection и Dictionary.

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

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

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

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

Список используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список. Элемент управления 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 для загрузки элементов в список по одному:

With UserForm1.ListBox1

  .AddItem «Значение 1»

  .AddItem «Значение 2»

  .AddItem «Значение 3»

End With

Используйте свойство List, чтобы скопировать одномерный массив значений в элемент управления ListBox.

UserForm1.ListBox1.List = Array(«Текст 1», _

«Текст 2», «Текст 3», «Текст 4», «Текст 5»)

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

Используйте свойство RowSource, чтобы загрузить в список значения из диапазона ячеек рабочего листа:

UserForm1.ListBox1.RowSource = «Лист1!A1:A6»

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

With UserForm1.ListBox1

  ‘Указываем количество столбцов

  .ColumnCount = 5

  .RowSource = «‘Лист со списком’!A1:E10»

End With

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

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

Привязка списка к ячейке

Для привязки списка к ячейке на рабочем листе используется свойство ControlSource. Суть привязки заключается в том, что при выборе строки в элементе управления, значение свойства Value копируется в привязанную ячейку.

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

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

Привязать ячейку к списку можно, указав адрес ячейки в поле свойства ControlSource в окне Properties элемента управления ListBox. Или присвоить адрес ячейки свойству ControlSource в коде VBA Excel:

UserForm1.ListBox1.ControlSource = «Лист1!A2»

Теперь значение выбранной строки в списке автоматически копируется в ячейку «A2» на листе «Лист1»:

В окне Properties адрес указывается без двойных кавычек. Если имя листа содержит пробелы, оно заключается в одинарные кавычки.

Извлечение информации из списка

Первоначально элемент управления ListBox открывается со строками, ни одна из которых не выбрана. При выборе (выделении) строки, ее значение записывается в свойства Value и Text.

Из этих свойств мы с помощью кода VBA Excel извлекаем информацию, выбранную в списке пользователем:

Dim myVar as Variant, myTxt As String

myVar = UserForm1.ListBox1.Value

‘или

myTxt = UserForm1.ListBox1.Text

Вторую строку кода можно записать myVar = UserForm1.ListBox1, так как Value является свойством списка по умолчанию.

Если ни одна позиция в списке не выбрана, свойство Value возвращает значение Null, а свойство Text – пустую строку. Если выбрана строка в многостолбцовом списке, в свойства Value и Text будет записана информация из первого столбца.

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

Для получения данных из любого столбца элемента управления ListBox используется свойство List, а для определения выбранной пользователем строки – ListIndex.

Для тестирования приведенного ниже кода скопируйте таблицу и вставьте ее в диапазон «A1:D4» на листе с ярлыком «Лист1»:

Звери Лев Тапир Вивера
Птицы Грач Сорока Филин
Рыбы Карась Налим Парусник
Насекомые Оса Жук Муравей

Создайте в редакторе VBA Excel пользовательскую форму и добавьте на нее список с именем ListBox1. Откройте модуль формы и вставьте в него следующие процедуры:

Private Sub UserForm_Initialize()

With Me.ListBox1

  ‘Указываем, что у нас 4 столбца

  .ColumnCount = 4

  ‘Задаем размеры столбцов

  .ColumnWidths = «50;50;50;50»

  ‘Импортируем данные

  .RowSource = «Лист1!A1:D4»

  ‘Привязываем список к ячейке «F1»

  .ControlSource = «F1»

End With

End Sub

 

Private Sub UserForm_Click()

MsgBox Me.ListBox1.List(Me.ListBox1.ListIndex, 2)

End Sub

В процедуре UserForm_Initialize() присваиваем значения некоторым свойствам элемента управления ListBox1 перед открытием пользовательской формы. Процедура UserForm_Click() при однократном клике по форме выводит в MsgBox значение из третьего столбца выделенной пользователем строки.

Теперь при выборе строки в списке, значение свойства Value будет записываться в ячейку «F1», а при клике по форме функция MsgBox выведет значение третьего столбца выделенной строки.

Обратите внимание, что при первом запуске формы, когда ячейка «F1» пуста и ни одна строка в ListBox не выбрана, клик по форме приведет к ошибке. Это произойдет из-за того, что свойство ListIndex возвратит значение -1, а это недопустимый номер строки для свойства List.

Если для списка разрешен многострочный выбор (MultiSelect = fmMultiSelectMulti или MultiSelect = fmMultiSelectExtended), тогда, независимо от количества выбранных строк, свойство Value будет возвращать значение Null, а свойство Text – пустую строку. Свойство ListIndex будет возвращать номер строки, которую кликнули последней, независимо от того, что это было – выбор или отмена выбора.

Иногда перед загрузкой в ListBox требуется отобрать уникальные элементы из имеющегося списка. Смотрите, как это сделать с помощью объектов Collection и Dictionary.

VBA — Связанный список | vba Tutorial

пример

Этот пример связанного списка реализует операции набора абстрактных данных .

Класс SinglyLinkedNode

Option Explicit

Private Value As Variant
Private NextNode As SinglyLinkedNode '"Next" is a keyword in VBA and therefore is not a valid variable name

Класс LinkedList

Option Explicit

Private head As SinglyLinkedNode

'Set type operations

Public Sub Add(value As Variant)
    Dim node As SinglyLinkedNode
        
    Set node = New SinglyLinkedNode
    node.value = value
    Set node.nextNode = head
    
    Set head = node
End Sub

Public Sub Remove(value As Variant)
    Dim node As SinglyLinkedNode
    Dim prev As SinglyLinkedNode
    
    Set node = head
    
    While Not node Is Nothing
        If node.value = value Then
            'remove node
            If node Is head Then
                Set head = node.nextNode
            Else
                Set prev.nextNode = node.nextNode
            End If
            Exit Sub
        End If
        Set prev = node
        Set node = node.nextNode
    Wend

End Sub

Public Function Exists(value As Variant) As Boolean
    Dim node As SinglyLinkedNode
    
    Set node = head
    While Not node Is Nothing
        If node.value = value Then
            Exists = True
            Exit Function
        End If
        Set node = node.nextNode
    Wend
End Function

Public Function Count() As Long
    Dim node As SinglyLinkedNode
    
    Set node = head
    
    While Not node Is Nothing
        Count = Count + 1
        Set node = node.nextNode
    Wend
    
End Function



Как получить список файлов в Excel с помощью VBA

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

 

Давайте рассмотрим несколько способов получения списка файлов.

Способ 1. Использование функции Dir

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

Вот там код данной функции, который выводит на лист 1 перечень файлов.


'**************************************************************
' Sub            : ExampleOne
' Author         : Алексей Желтов
' Date           : 15.06.2020
' Purpose        : Вывод всех файлов в папке на лист
'**************************************************************
Sub ExampleOne()

    Dim Sh As Worksheet
    Dim Folder As String
    Dim FileName As String
    Dim i As Long

    Set Sh = ThisWorkbook.Sheets(1)
    Folder = Sh.Cells(3, 2)

    ' Проверка корректности введенных данных
    If PathExists(Folder) = False Then
        MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных"
        Exit Sub
    End If

    ' Удаляем содержимое
    Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp
    
    i = 7
    FileName = Dir(Folder & "/", vbNormal)
    Do While FileName <> ""
        Sh.Cells(i, 1) = i - 6
        Sh.Cells(i, 2) = FileName
        i = i + 1
        
        ' переход к следующему файлу
        FileName = Dir
    Loop

End Sub

Тут мы проверяем существование папки с помощью дополнительной функции. Опять таки не используем сторонних библиотек, а используем туже функцию Dir.


'**************************************************************
' Function       : PathExists
' Author         : Алексей Желтов
' Date           : 15.06.2020
' Purpose        : Возвращает ИСТИНА если путь pname существует
'**************************************************************
Private Function PathExists(pname As String) As Boolean
    On Error Resume Next
    If Dir(pname, vbDirectory) = "" Then
        PathExists = False
    Else
        PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory
    End If
End Function

Вот так выглядит результат работы функции. Программа записала список файлов на текущий лист Excel.

Здесь мы не делали проверку на тип файла и вывели все файлы которые у нас были. 

Если же необходимо отобрать только определенные типы файлов, например Excel файлы, то в нашем коде необходимо сделать дополнительную проверку:


    Do While FileName <> ""
    
        If LCase(FileName) Like "*xls*" Then
            Sh.Cells(i, 1) = i - 6
            Sh.Cells(i, 2) = FileName
            i = i + 1
        End If
        ' переход к следующему файлу
        FileName = Dir
    Loop

Знак «*» означает любой набор символов. Таким образом, мы учли различные версии файлов Excel (xls, xlsx, xlsm).

Способ 2. Используем объект FileSystemObject

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

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

  1. Открыть пункт меню Tools и выбрать пункт References.
  2. Выбрать ссылку на библиотеку Microsoft Scripting Runtime
  3. Нажать Ок.

Теперь перейдем к коду. Он немного упростился:


'**************************************************************
' Sub            : ExampleTwo
' Author         : Алексей Желтов
' Date           : 15.06.2020
' Purpose        : Вывод всех файлов в папке на лист
'**************************************************************
Sub ExampleTwo()
    
    Dim Sh As Worksheet
    Dim FSO As New FileSystemObject
    Dim FolderPath As String
    Dim MyFolder As Folder
    Dim iFile As File
    Dim i As Long
    
    Set Sh = ThisWorkbook.Sheets(2)
    FolderPath = Sh.Cells(3, 2)
    
    ' Проверка корректности введенных данных
    If Not FSO.FolderExists(FolderPath) Then
        MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных"
        Exit Sub
    End If
    
    ' Удаляем содержимое
    Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp
    
    Set MyFolder = FSO.GetFolder(FolderPath)
     
    i = 7
    For Each iFile In MyFolder.Files
        Sh.Cells(i, 1) = i - 6
        Sh.Cells(i, 2) = iFile.Name
        Sh.Cells(i, 3) = iFile.Type
        Sh.Cells(i, 4) = iFile.DateCreated
        Sh.Cells(i, 5) = iFile.Size
        i = i + 1
    Next
     
End Sub

Обратите внимание на переменные. Переменная FSO — это новый экземпляр объекта FileSystemObject. Тут мы его объявляем и сразу создаем. Директива New очень важна, многие тут допускают ошибку. Также создаем объекты MyFolder и iFile — это тоже объекты FileSystemObject


    Dim Sh As Worksheet
    Dim FSO As New FileSystemObject ' объявляем и создаем новый экземпляр объекта 
    Dim FolderPath As String
    Dim MyFolder As Folder
    Dim iFile As File
    Dim i As Long

Далее делаем проверку на существование папки. В данном случае нам не нужна дополнительная функция , мы пользуемся методом FolderExists объекта (класса) FileSystemObject.

Ну и остается аналогично перебрать все файлы в директории. Тут удобно использовать цикл For Each — Next.


    For Each iFile In MyFolder.Files
        Sh.Cells(i, 1) = i - 6
        Sh.Cells(i, 2) = iFile.Name ' название файла
        Sh.Cells(i, 3) = iFile.Type ' тип файла
        Sh.Cells(i, 4) = iFile.DateCreated ' дата создания
        Sh.Cells(i, 5) = iFile.Size ' размер
        i = i + 1
    Next

Результат работы программы следующий:

Способ 3. Создаем функцию, которая возвращает файлы в папке и подпапках

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

Итак перейдем к коду:


'**************************************************************
' Function       : GetFiles
' Author         : Алексей Желтов
' Date           : 15.06.2020
' Purpose        : Получение файлов из папок и подпапок
'**************************************************************
Public Function GetFiles(ByVal Path As String, Optional ByVal Filter As String = "*", Optional ByVal Nesting As Long = 100) As Collection
    Dim MainFolder As Folder
    Dim iFolder As Folder
    Dim iFile As File
    Dim FSO As New FileSystemObject
    Dim MainColl As New Collection
    Dim iColl As Collection
    Dim spltFilter() As String
    Dim i As Long
    
    Set MainFolder = FSO.GetFolder(Path)
    If MainFolder Is Nothing Then Exit Function
    spltFilter = Split(Filter, ",")
    
    ' Перебираем файлы
    For Each iFile In MainFolder.Files
        ' Игнорируем временные файлы
        If InStr(1, iFile.Name, "~") = 0 Then
            ' Проверяем фильтры файлов
            For i = 0 To UBound(spltFilter)
                If LCase(iFile.Name) Like "*" & LCase(spltFilter(i)) Then
                    MainColl.Add iFile, iFile.Path
                End If
            Next
        End If
    Next
    
    ' Перебираем вложенные папки
    If Nesting > 0 Then
        For Each iFolder In MainFolder.SubFolders
            ' рекурсивный вызов функции
            Set iColl = GetFiles(iFolder.Path, Filter, Nesting - 1)
            
            'добавляем файлы из вложенных папок
            For i = 1 To iColl.Count
                MainColl.Add iColl(i), iColl(i).Path
            Next
        Next
    End If
    
    Set GetFiles = MainColl
End Function

Разберем основные моменты этой функции. На вход она принимает один обязательный аргумент — это путь к папке Path. Также может принимать два необязательных параметра:

  • Filter — перечисление списка файлов, которые мы хотим получить. Перечислять необходимо через запятую, например «doc, xls*». Вы можете использовать символ «*» чтобы включить сравнение по шаблону. По умолчанию фильтр отсутствует и возвращаются все типы файлов.
  • Nesting — вложенность. Это максимальное число вложенных папок в которые «проваливается» алгоритм. По умолчанию равно 100.

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


        For Each iFolder In MainFolder.SubFolders
            ' рекурсивный вызов функции
            Set iColl = GetFiles(iFolder.Path, Filter, Nesting - 1)
            
            'добавляем файлы из вложенных папок
            For i = 1 To iColl.Count
                MainColl.Add iColl(i), iColl(i).Path
            Next
        Next

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

Теперь когда наша функция готова, просто используем ее где нам требуется вот так:


'**************************************************************
' Sub            : ExampleThree
' Author         : Алексей Желтов
' Date           : 15.06.2020
' Purpose        : Вывод всех файлов в папке на лист
'**************************************************************
Sub ExampleThree()
    
    Dim Sh As Worksheet
    Dim FolderPath As String
    Dim iFile As File
    Dim i As Long
    Dim Coll As Collection
    Dim FSO As New FileSystemObject
    
    Set Sh = ThisWorkbook.Sheets(3)
    FolderPath = Sh.Cells(3, 2)
    
    Set Coll = GetFiles(FolderPath)
    
    For i = 1 To Coll.Count
        Set iFile = Coll(i)
        Sh.Cells(i + 6, 1) = i
        Sh.Cells(i + 6, 2) = iFile.Name
        Sh.Cells(i + 6, 3) = FSO.GetFolder(iFile.ParentFolder).Name
        Sh.Cells(i + 6, 4) = iFile.Type
        Sh.Cells(i + 6, 5) = iFile.DateCreated
        Sh.Cells(i + 6, 6) = iFile.Size
    Next
     
End Sub

Функция нам возвращает коллекцию файлов в папке и подпапках. Вот так:

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

Скачать

vb.net — списки и массивы в VBA

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

  1. Авторизоваться зарегистрироваться
  2. текущее сообщество

    • Переполнение стека Помогите болтать
    • Переполнение мета-стека
.

VBA ArrayList — Полное руководство

VBA ArrayList — гораздо лучшая альтернатива встроенной коллекции VBA. Он содержит гораздо более богатые функции, такие как сортировка, преобразование в массив, удаление всех элементов и т. Д.

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

Краткое руководство по VBA ArrayList

Задача Метод Параметры Примеры
Элемент доступа Элемент index — длинное целое value = list.Item (0)
value = list.Item (3)
Элемент доступа добавлен последним Элемент index — long integer value = list.Item (list.Count — 1)
Элемент доступа добавлен первым Элемент index — long integer value = list.Item (0)
Доступ ко всем элементам (для каждого) Н / Д Н / Д Тусклый элемент как вариант
Для каждого элемента Во фрукте
Отладка. Печать элемента
Следующий элемент
Доступ ко всем элементам (для) Элемент index — long integer Dim i As Long
For i = 0 To list.Count — 1
Debug.Print list.item (i)
Next i
Добавить товар Добавить объект или значение список. Добавить «Яблоко»
список. Добавить «Груша»
Копировать ArrayList в другой ArrayList Клонировать Нет Тусклый список2 как объект
Установить список2 = список.Клон
Копировать в массив ToArray Нет Dim arr As Variant
arr = list.ToArray
Копировать в диапазон (строку) ToArray Нет Sheet1.Диапазон («A1»). Изменить размер (1, list.Count) .Value = list.ToArray
Копировать в диапазон (столбец) ToArray Нет Sheet1.Range («A3»). Resize (list.Count, 1) .Value = WorksheetFunction.Transpose (list.ToArray)
Создать CreateObject «System.Collections.ArrayList» Тусклый список как объект
Установить список = CreateObject («System.Collections.ArrayList»)
Объявить Н / Д Н / Д Тусклый список как объект
Найти — проверить, существует ли элемент Содержит элемент , чтобы найти список .Содержит («Яблоко»)
Найдите позицию элемента в списке ArrayList. IndexOf 1. Элемент для поиска.
2. Позиция для начала поиска.
Dim index As Long
‘Искать с позиции 0
index = fruit.IndexOf («Pear», 0)
Получить количество элементов Счетчик Нет totalElements = list.Count
Вставка Деталь Вставка 1. Индекс — позиция для вставки.
2 Значение — объект или значение для вставки.
список. Вставить 0, «Персик» ‘Первый список
. Вставить 1, «Банан»‘ Второй список
. Вставить список.Счетчик, «Апельсин» ‘Последний
Удалить все элементы
Очистить Нет список Очистить
Удалить элемент в позиции RemoveAt Index — позиция, где элемент находится в списке .RemoveAt 0
Удалить элемент по имени Удалить Элемент — элемент, который нужно удалить из списка ArrayList .Убрать «Яблоко»
Удалить ряд элементов RemoveRange 1. Указатель — начальная позиция.
2. Счетчик — количество элементов, которые нужно удалить.
список.RemoveRange 1,3
Обратный список Обратный Нет список Обратный
Сортировать по возрастанию Сортировать Нет список Сортировать

Описание

ArrayList аналогичен встроенной коллекции VBA.Он не является частью VBA, но находится во внешней библиотеке, к которой мы можем легко получить доступ. ArrayList — это тот же самый список, который используется в языке C #. Как и следовало ожидать, ArrayList имеет встроенную сортировку, преобразование массивов и другие функции, которые можно ожидать от современного языка программирования. В этой статье я буду называть его VBA ArrayList.

Скачать исходный код

Объявить и создать список массивов VBA

Как и все внешние библиотеки, мы можем создавать ArrayList, используя раннее и позднее связывание.


Позднее связывание

Мы используем CreateObject для создания ArrayList с использованием позднего связывания:

https://excelmacromastery.com/
Sub UsingArrayList ()

    Тусклый колл как объект
    Установить coll = CreateObject ("System.Collections.ArrayList")

Конец подписки
 



Недостатком позднего связывания является то, что у нас нет доступа к Intellisense. Преимущество в том, что его лучше использовать при распространении приложения VBA пользователю.

Раннее связывание

Обновление 12 ноября 2019 г .: Intellisense в настоящее время не работает для ArrayList.
Раннее связывание позволяет использовать Intellisense, чтобы увидеть, что доступно для использования. Сначала мы должны добавить библиотеку типов в качестве ссылки, а затем выбрать ее из списка ссылок. Для этого мы можем использовать следующие шаги:

  1. Выберите Инструменты , а затем Ссылки в меню.
  2. Щелкните значок Обзор .
  3. Найдите файл mscorlib.tlb и щелкните Открыть . Он должен находиться в такой папке C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 .
  4. Прокрутите список вниз и проверьте mscorlib.dll .
  5. Щелкните ОК.


Теперь вы можете использовать следующий код для объявления ArrayList с использованием раннего связывания:

Dim coll As New ArrayList
 


Ошибка автоматизации VBA ArrayList

Вы можете столкнуться с ошибкой времени выполнения VB «-2146232576 Ошибка автоматизации» при попытке заставить работать ArrayList.Или иногда ваш код работал долго, а потом вдруг появляется эта ошибка.

Это вызвано неправильной установленной версией .Net Framework . Правильная версия — 3.5. Не имеет значения, установлена ​​ли у вас более поздняя версия, например 4.7, у вас должна быть установлена ​​3.5.


Добавление элементов в список массивов VBA

Добавление элементов в ArrayList очень похоже на то, как мы добавляем их в коллекцию. Мы используем метод Добавить :

https: // excelmacromastery.com /
Подложка AddingToList ()

    Тусклый колл как объект
    Установить coll = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    coll.Добавить "Яблоко"
    coll.Add "Арбуз"
    coll.Добавить "Груша"
    coll.Добавить "Банан"
    
    'Вставить в первую позицию
    колл.Вставка 0, "Слива"

Конец подписки
 

Чтение ArrayList

Мы читаем ArrayList аналогично VBA Collection, за исключением того, что мы читаем от нуля до Count -1, а не от единицы до Count .

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

'Распечатать все элементы в непосредственном окне (Ctrl + G)
'Элементы должны иметь базовый тип данных, например Длинный, струнный, двойной
https://excelmacromastery.com/
Sub PrintToImmediateWindow (столбец как объект)

    Тусклый я как долго
    Для i = 0 To coll.Count - 1
        Отладка. Печать coll (i)
    Далее я
    
Конец подписки
 


Мы можем использовать цикл For Each с VBA ArrayList так же, как мы используем его с Collection:

'Распечатать все элементы в непосредственном окне (Ctrl + G)
'Элементы должны быть основным типом данных e.г. Длинный, струнный, двойной
https://excelmacromastery.com/
Sub PrintToImmediateWindowEach (столбец как объект)

    Тусклый элемент как вариант
    Для каждого элемента в столбце
        Debug.Print item
    Следующий элемент
    
Конец подписки
 

Вы можете скачать все примеры кода вверху этого поста.

Сортировка

Сортировка отсортирует список массивов VBA по возрастанию.

Для сортировки в порядке убывания просто введите Обратный после Сортировка .

В следующем коде показан пример сортировки как по возрастанию, так и по убыванию:

https://excelmacromastery.com/
Подсортировка ()

    Тусклый колл как объект
    Установить coll = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    coll.Добавить "Яблоко"
    coll.Add "Арбуз"
    coll.Добавить "Груша"
    coll.Добавить "Банан"
    coll.Добавить "Слива"
    
    ' Сортировать
    coll.Sort
    
    Отлаживать.Печать vbCrLf & "Сортировка по возрастанию"
    'Добавьте этот подпункт из раздела "Просмотр предметов"
    PrintToImmediateWindow coll
    
    'Обратная сортировка
    coll.Reverse
    
    Debug.Print vbCrLf & "Сортировка по убыванию"
    PrintToImmediateWindow coll
    
Конец подписки
 

https://excelmacromastery.com/
Sub PrintToImmediateWindow (столбец как объект)

    Тусклый я как долго
    Для i = 0 To coll.Count - 1
        Отлаживать.Печать coll (i)
    Далее я
    
Конец подписки
 

Клонирование VBA ArrayList

Мы можем создать копию ArrayList с помощью метода Clone . Это создает новую копию ArrayList.

Это не то же самое, что присвоение переменной, когда обе переменные указывают на один и тот же список массивов, например

'Обе переменные указывают на один и тот же ArrayList
Установить coll2 = coll
 

Мы используем Clone вот так:

https: // excelmacromastery.com /
Дополнительное клонирование ()

    'Создать ArrayList
    Dim coll1 As Object
    Установить coll1 = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    coll1.Add "Apple"
    coll1.Add "Арбуз"
    coll1.Add "Груша"
    coll1.Add "Банан"
    coll1.Add "Plum"
    
    'Создает копию исходного ArrayList
    Dim coll2 как объект
    Установите coll2 = coll1.Clone
    
    'Удалить все элементы из coll1
    coll1.Очистить
    
    'Добавить подпрограмму PrintToImmediateWindow из раздела «Чтение элементов»
    Debug.Print vbCrLf & "coll1 Содержание:"
    PrintToImmediateWindow coll1
    
    Debug.Print vbCrLf & "coll2 Содержание:"
    PrintToImmediateWindow coll2

Конец подписки
 

https://excelmacromastery.com/
Sub PrintToImmediateWindow (столбец как объект)

    Тусклый я как долго
    Для i = 0 To coll.Count - 1
        Отлаживать.Печать coll (i)
    Далее я
    
Конец подписки
 

Копирование из списка массивов VBA в массив

Мы можем скопировать из ArrayList в массив в одну строку, используя метод ToArray :

https://excelmacromastery.com/
Sub CopyToArray ()

    'Объявить и создать ArrayList
    Тусклый колл как объект
    Установить coll = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    колл.Добавить "Яблоко"
    coll.Add "Арбуз"
    coll.Добавить "Груша"
    coll.Добавить "Банан"
    coll.Добавить "Слива"
    
    'Копировать в массив
    Dim arr как вариант
    arr = coll.ToArray
    
    'Распечатать массив
    Debug.Print vbCrLf & "Печать содержимого массива:"
    PrintArrayToImmediate arr
    
Конец подписки
 

'Печатает содержимое одномерного массива
'в непосредственное окно (Ctrl + G)
https: // excelmacromastery.com /
Sub PrintArrayToImmediate (arr как вариант)
    
    Тусклый я как долго
    Для i = LBound (arr) To UBound (arr)
        Отладка.Печать arr (i)
    Далее я
       
Конец подписки
 


Вы можете скачать все примеры кода вверху этого поста.

Запись непосредственно в диапазон

Одним из самых больших преимуществ ArrayList является то, что мы можем записывать содержимое непосредственно в диапазон.

Приведенный ниже код записывает содержимое как в строку, так и в столбец:

'Записывает содержимое ArrayList в диапазон рабочего листа
https: // excelmacromastery.com /
Sub ClearArrayList ()

    'Объявить и создать ArrayList
    Тусклые фрукты как объект
    Установить fruit = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    фрукты.Добавить «Яблоко»
    фрукты.Добавить "Арбуз"
    фрукты.Добавить "Груша"
    фрукты.Добавить "Банан"
    фрукты.Добавить "Сливу"
    фрукты.Добавить "Персик"
    
       
    '' Очистить существующие данные
    Sheet1.Cells.ClearContents
    
    'Пишите в строку
    Лист1.Диапазон ("C1"). Resize (1, fruit.Count) .Value = fruit.toArray
    
    'Написать в столбец
    Sheet1.Range ("A1"). Resize (fruit.Count, 1) .Value = WorksheetFunction.Transpose (fruit.toArray)
    
Конец подписки
 

Массив в список массивов VBA (1D)

Как мы уже видели, есть встроенная функция ToArray , которая копирует из ArrayList в массив.

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

https://excelmacromastery.com/
Функция ArrayToArrayList (arr как вариант) как объект

    'Убедитесь, что массив является одномерным
    При ошибке Возобновить Далее
    Dim ret As Long
    ret = -1
    ret = UBound (обр., 2)
    При ошибке Перейти к 0
    Если ret -1 Тогда
        Err.Raise vbObjectError + 513, "ArrayToArrayList" _
                , "Массив может иметь только одно измерение"
    Конец, если

    'Создать ArrayList
    Тусклый колл как объект
    Установите coll = CreateObject ("System.Collections.ArrayList ")
    
    'Добавить элементы в ArrayList
    Тусклый я как долго
    Для i = LBound (arr, 1) To UBound (arr, 1)
        coll.Add arr (i)
    Далее я
    
    'Вернуть новый ArrayList
    Установить ArrayToArrayList = coll
    
Конечная функция
 


Можно использовать так:

https://excelmacromastery.com/
Подложка ReadFromArray1D ()
    
    Dim arr (от 1 до 3) в качестве варианта
    
    arr (1) = "PeterJ"
    arr (2) = "Джек"
    arr (3) = "Джилл"
    
    'Создать ArrayList
    Тусклый колл как объект
    Установить coll = ArrayToArrayList (arr)

    PrintToImmediateWindow coll
    
Конец подписки
 

Удалить все элементы из списка массивов

Мы можем удалить все элементы из ArrayList с помощью функции Clear:

https: // excelmacromastery.com /
Sub ClearArrayList ()

    'Объявить и создать ArrayList
    Тусклый колл как объект
    Установить coll = CreateObject ("System.Collections.ArrayList")
    
    'Добавить элементы
    coll.Добавить "Яблоко"
    coll.Add "Арбуз"
    coll.Добавить "Груша"
    coll.Добавить "Банан"
    coll.Добавить "Слива"
    
    Debug.Print vbCrLf & "Количество элементов:" & coll.Count
    
    'Удалить все
    coll.Clear
    
    Отлаживать.Выведите «Количество элементов:» & coll.Count
    
Конец подписки
 


Вы можете скачать все примеры кода вверху этого поста.

Что дальше?

Бесплатное руководство по VBA Если вы новичок в VBA или хотите отточить свои существующие навыки VBA, почему бы не попробовать The Ultimate VBA Tutorial.

Связанное обучение: Получите полный доступ к обучающим веб-семинарам по Excel VBA и всем учебным материалам.

( ПРИМЕЧАНИЕ: Планируете создание приложения VBA или управление им? Узнайте, как создать 10 приложений Excel VBA с нуля.)


.

Создание списка / массива в Excel с использованием VBA для получения списка уникальных имен в столбце

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

Класс простого списка для проектов VBA

Введение

Этот код класса VBA реализует .NET-подобный объект List ( List ) в ваш проект VBA, чтобы избежать неудобного использования массива VBA. Прошу прощения за мой плохой английский, надеюсь, большинство вещей понятны. 🙂

Фон

Иногда мне нужно изменить некоторые старые проекты Excel VBA и сильно пропустить реализацию списка, поскольку мне нужно обрабатывать все в массивах.Поэтому я решил написать свой собственный класс списков, в котором я реализовал большинство методов и свойств .NET List . Просто скопируйте код в свой проект VBA как класс. Позже я постараюсь добавить пояснения к самому коду.

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

Чтобы смоделировать List , я решил использовать стандартный массив VBA и тип данных , вариант , чтобы можно было добавить любой тип данных в массив . У меня все еще возникают проблемы при использовании метода Sort , однако я надеюсь найти время для добавления функции сортировки в массив Array .

На данный момент реализованы следующие свойства и методы / функции:

Недвижимость
  • Count ()
  • Disposed ()
  • GotError ()
  • ListError ()
  • ListItems ()
Методы
  • Добавить (ByRef vItem As Variant, Optional index As Long)
  • Clear ()
  • Contains (ByRef vItem as Variant)
  • Copy ()
  • Exists (vItem as Variant)
  • Find (ByRef vItem As Variant)
  • Dispose ()
  • IndexOf (ByRef vItem As Variant)
  • LastIndexOf (ByRef vItem As Variant)
  • RemoveAll ()
  • RemoveAtIndex (ByRef index As Long)
  • ResetError ()
  • Обратный ()
  • Сортировка ()
  • ToArray ()

    в новый класс VBA.Имя класса должно быть VbaList ! Если вы хотите изменить имя, не забудьте также изменить ссылки в коде класса.

    Вот полный код класса:

     Private mList () в качестве варианта
    Частная ошибка как ошибка
    Частный mDisposed как логический
    
    
    
    
    Открытая подпрограмма Initialize ()
        Disposed = False
    Конец подписки
    
    Открытая функция CreateInstance () как vbaList
        Dim oNew как новый vbaList
        oNew.Initialize
        Установите CreateInstance = oNew
    Конечная функция
    
    
    
    
    Открытое свойство Get Items (ByRef index As Long) As Variant
        Items = GetItemAtIndex (индекс)
    Конечная собственность
        Публичная собственность получает счет () до тех пор, пока
        Счетчик = GetListCount ()
    Конечная собственность
    
    Публичное свойство Get GotError () как логическое
        Если ListError - это ничего, то GotError = False Else GotError = True
    Конечная собственность
    
    Публичное свойство Get ListItems () As Variant ()
        ClearError
        При ошибке GoTo Err
        ListItems = mList
        Выйти из собственности
        Ошибка:
            ListError = Ошибка
    Конечная собственность
    
    Публичное свойство Get ListError () как ошибка
        ListError = mError
    Конечная собственность
    
    Частное свойство Let ListError (ByRef vError As Error)
        Установить mError = vError
    Конечная собственность
    
    Открытое свойство Get Disposed () как Boolean
        Disposed = mDisposed
    Конечная собственность
    
    Передача частной собственности в распоряжение (ByRef vValue As Boolean)
        mDisposed = vValue
    Конечная собственность
    
    Публичное свойство Get ToArray ()
        ToArray = mList
    Конечная собственность
    
    
    
    
    
    Public Sub Remove (ByRef vItem As Variant)
        DeleteElement (vItem)
    Конец подписки
    
    Public Sub RemoveAtIndex (по длине индекса ByRef)
        DeleteElementAt (индекс)
    Конец подписки
    
    Публичная подсортировка ()
        BubbleSort (мллист)
    Конец подписки
    
    Public Sub Очистить ()
        Удалить список
    Конец подписки
    
    Поиск общедоступной функции (по ссылке vItem как вариант) до тех пор
        Найти = FindItem (vItem)
    Конечная функция
    
    Public Sub Dispose ()
        ResetError
        Очистить
        Disposed = True
    Конец подписки
    
    Public Sub ResetError ()
        ClearError
    Конец подписки
    
    Открытая функция LastIndexOf (ByRef vItem As Variant)
        LastIndexOf = GetLastIndexOf (vItem)
    Конечная функция
    
    Открытая функция IndexOf (ByRef vItem как вариант)
        IndexOf = FindItem (vItem)
    Конечная функция
    
    Public Sub Reverse ()
        ReverseList
    Конец подписки
    
    Открытая функция существует (vItem как вариант)
        Exists = ItemExists (vItem)
    Конечная функция
    
    Public Sub Add (ByRef vItem As Variant, Optional index As Long)
        Если index> 0 Тогда
            AddItemAt index, vItem
        Еще
            AddItem vItem
        Конец, если
    Конец подписки
    
    Открытая функция содержит (ByRef vItem как вариант)
        Содержит = Существует (vItem)
    Конечная функция
    
    Открытая функция Copy () как vbaList
        Установите Copy = GetCopy
    Конечная функция
    
    Публичная подписка RemoveAll ()
        Очистить
    Конец подписки
    
    
    
    
    
    Частная подпрограмма ClearError ()
        Установите mError = Nothing
    Конец подписки
    
    Частная функция GetListCount () до тех пор, пока
        ClearError
        При ошибке GoTo Err
        GetListCount = UBound (mList) - LBound (mList) + 1
        Функция выхода
        Ошибка:
            GetListCount = 0
    Конечная функция
    
    Приватная функция GetItemAtIndex (индекс ByRef до тех пор) как вариант
        ClearError
        При ошибке GoTo Err
        GetItemAtIndex = mList (индекс)
        Функция выхода
        Ошибка:
            ListError = Ошибка
        GetItemAtIndex = Ничего
    Конечная функция
    
    Private Sub AddItemAt (индексировать как долго, vItem как вариант)
        ClearError
        При ошибке GoTo Err
    
        Dim ar () как вариант
        Dim i как целое число
    
        я = подсчитывать
        ReDim ar (i)
    
        Для a = 0 в индекс - 1
            ar (a) = mList (a)
        следующий
    
        ar (индекс) = vItem
    
        Для a = index + 1 To i
            ar (a) = mList (a - 1)
        следующий
    
        mList = ar
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Private Sub BubbleSort (ByVal vArray как вариант)
        ClearError
        При ошибке GoTo Err
    
        Тусклый я как долго
        Dim iMin As Long
        Dim iMax до тех пор
        Dim vSwap как вариант
        Dim заменен как логическое
    
        iMin = LBound (vArray)
        iMax = UBound (vArray) - 1
    
        Делать
            swapped = Ложь
        Для i = от iMin до iMax
            Если vArray (i)> vArray (i + 1) Тогда
                vSwap = vArray (i)
                vArray (i) = vArray (i + 1)
                vArray (i + 1) = vSwap
                swapped = True
            Конец, если
        следующий
        iMax = iMax - 1
        Цикл, пока не будет заменен
        mList = vArray
        Стереть vArray
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Private Sub DeleteElementAt (индекс как целое число)
        ClearError
        При ошибке GoTo Err
    
        Dim i как целое число
        For i = index + 1 To Count - 1
            mList (i - 1) = mList (i)
        следующий
        ReDim Preserve mList (Количество - 2)
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Private Sub DeleteElement (ByRef vItem как вариант)
        ClearError
        При ошибке GoTo Err
    
        DeleteElementAt (FindItem (vItem))
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Private Sub AddItem (vItem as Variant)
        ClearError
        При ошибке GoTo Err
    
        Тусклый я как долго
        я = подсчитывать
        ReDim Preserve mList (i)
        mList (i) = vItem
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Частная функция FindItem (vItem как вариант) до тех пор, пока
        ClearError
        При ошибке GoTo Err
    
        FindItem = -1
    
        Для i = 0 для подсчета - 1
            Если mList (i) = vItem, то
            FindItem = i
            Выход для
            Конец, если
        Далее я
        Функция выхода
        Ошибка:
            ListError = Ошибка
            FindItem = -1
    Конечная функция
    
    Частная функция GetLastIndexOf (vItem как вариант) до тех пор, пока
        ClearError
        При ошибке GoTo Err
    
        GetLastIndexOf = -1
        Тусклый я как долго
    
        Для i = Count - от 1 до 0 Шаг -1
            Если mList (i) = vItem, то
                GetLastIndexOf = i
            Функция выхода
            Конец, если
        Далее я
        Функция выхода
        Ошибка:
            ListError = Ошибка
            GetLastIndexOf = -1
    Конечная функция
    
    Private Sub ReverseList ()
        ClearError
        При ошибке GoTo Err
    
        Dim ar () как вариант
        Тусклый я как долго
        Dim j As Long
    
        Если Count = 0, то выйти из Sub
        я = Счетчик - 1
        j = я
        ReDim ar (i)
    
        Для a = 0 To i
            ar (a) = mList (j)
            j = j - 1
        Далее
    
        mList = ar
        Стереть ар
        Выход из подводной лодки
        Ошибка:
            ListError = Ошибка
    Конец подписки
    
    Приватная функция ItemExists (vItem As Variant) как Boolean
        Если FindItem (vItem)> -1 Тогда
            ItemExists = True
        Еще
            ItemExists = False
        Конец, если
    Конечная функция
    
    Частная функция GetCopy () как vbaList
        Удалить список как новый vbaList
        Установить список = список.CreateInstance
        
        Для i = 0 для подсчета - 1
            list.Add mList (i)
        Далее я
        Установить GetCopy = list
        i = GetCopy.Count
    Конечная функция 

    Вот небольшой пример. Для тестирования скопируйте код в модуль VBA:

     Подтест ()
        Удалить список как новый vbaList
        Установить list = list.CreateInstance
    
        list.Add 1
        list.Add 9
        list.Add 6
        list.Add 13
        list.Add 2
        list.Add 6
        list.Add 4, 3
        list.Remove 13
        list.RemoveAtIndex 2
        list.Add "Test 1"
        list.Add "Test 2"
        список.Добавить 6
     
        Скрыть списокКопировать как новый vbaList
        Установить listCopy = list.Copy
    
        Тусклый я как долго
    
        Debug.Print "========================================"
        Debug.Print "IndexOf Pos:" & list.IndexOf (6)
        Debug.Print «LastIndexOf Pos:» & list.LastIndexOf (6)
        Debug.Print «Найти тест 1 @ Pos:» & list.Find («Тест 1»)
        Debug.Print «[Тест 1] существует:» & list.Exists («Тест 1»)
        Debug.Print «[Тест 3] существует:» & list.Exists («Тест 3»)
        Debug.Print "Count:" & list.Count
        список.Очистить
        Debug.Print «Clear () Count:» & list.Count
        list.Dispose
        Debug.Print "Disposed:" & list.Disposed
        
        Debug.Print ""
        Для i = 0 В listCopy.Count - 1
            Debug.Print "Default - Pos" & i & ":" & listCopy.Items (i)
        Далее я
        listCopy.Reverse
        Для i = 0 В listCopy.Count - 1
            Debug.Print "Reverse - Pos" & i & ":" & listCopy.Items (i)
        Далее я
    Концевой переводник 
    .

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

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