Vba excel select all in listbox

The VBA ListBox is a very useful control. If you are creating any kind of UserForm application you will most likely use it.

In this post, I’m going to show you everything you need to know about the VBA ListBox so you can avoid the common pitfalls and get up and running quickly and easily.

VBA ListBox multi

What is the VBA ListBox used for?

The ListBox is used to display a list of items to the user so that the user can then select one or more. The ListBox can have multiple columns and so it is useful for tasks like displaying records.

VBA ListBox versus the VBA ComboBox

The ListBox is very similar to the ComboBox which also allows the user to select an item from a list of items. The main differences are:

  1. The Listbox allows multiple selections. The Combobox only allows one selection.
  2. Items in the ListBox are always visible. The Combobox items are only visible when you click on the “down” icon.
  3. The ComboBox has the ability to filter the contents when you type.

The VBA ListBox Properties Quick Guide

Function Operation Example
AddItem Add an item listbox.AddItem «Spain»
Clear Remove all Items listbox.Clear
ColumnCount Set the number of visible columns ComboBox1.ColumnCount = 2
ColumnHeads Make the column row visible ComboBox1.ColumnHeads = True
List Range to Listbox
ListBox to Range
Listbox.List = Range(«A1:A4»).Value
Range(«A1:A4»).Value = Listbox.List
List Update a column value Listbox.List(1,2) = «New value»
ListCount Get the number of items cnt = listbox.ListCount
ListIndex Get/set selected item Idx = listbox.ListIndex
combo.ListIndex = 0
RemoveItem Remove an item listbox.Remove 1
RowSource Add a range of values from a worksheet ComboBox1.RowSource = Sheet1.Range(«A2:B3»).Address
Value Get the value of selected Item Dim sCountry As String
sCountry = listbox.Value

How to Add Items to the ListBox

There are 3 ways to add items to the VBA Listbox:

  1. One at a time using the AddItem property.
  2. Adding an array/range using the List property.
  3. Adding a Range using the RowSource property.

The List and RowSource properties are the most commonly used. The table below provides a quick comparison of these properties:

Task RowSource List
Column Headers Yes No
Update values in ListBox No Yes
Add new items No Yes
Data type Range Array(including Range.Value)
If source data changes Listbox is automatically updated. ListBox is not updated.

VBA ListBox List Property

The List property allows you to add to contents of an array to a ListBox. As Range.Value is an array you can copy the contents of any range to the Listbox.

Here are some examples of using the List property:

' Add the contents of an array
ListBox1.List = Array("Apple", "Orange", "Banana")

' Add the contents of a Range
ListBox1.List = Range("A1:E5").Value

You can also use the List property to write from the ListBox to an array or range:

Range("A1:B3").Value = ListBox1.List

Important Note: If there is only one item in a range then VBA doesn’t covert it to an array. Instead, it converts the range to a string/double/date etc.

Sheet1.Range("A1:A2").Value ' Array
Sheet1.Range("A1").Value ' Single value variable

In this case, you need to use AddItem to add the value to the ListBox:

 If myRange.Count = 1 Then
    ListBox1.AddItem myRange
 Else
    ListBox1.List = myRange.Value
 End If

The List Property and Column Headers

The ListBox only displays column headers if you use RowSource. Otherwise, they are not available. The best way to add column headers(and it’s not a great way) is to add Labels above the ListBox columns. One advantage is that you can use the click event of the Label if you want to implement something like sorting.

Updating Items using the List Property

You can update individual items in the ListBox using the List Property.

Imagine we have a ListBox with data like this:

If we want to change Nelson in row 3, column 2 we do it like this:

ListBox1.List(2, 1) = "SMITH"

The result we get is:

The List property rows and columns are zero-based so this means row 1 is 0, row 2 is 1, row 3 is 2 and so on:

VBA ListBox RowSource

The RowSource property allows us to add a range to the ListBox. This is different from the List Property in that the Range is linked to the ListBox. If data in the Range changes then the data in the ListBox will update automatically.

When we use RowSource the data in the ListBox is read-only. We can change the RowSource range but we cannot change the values in the ListBox.

How to use RowSource

We add the RowSource range as a string like this:

 ListBox1.RowSource = "Sheet1!A1:A5"

If you don’t specify the sheet the VBA will use the active sheet

 ListBox1.RowSource = "A1:A5"

If you are using the Address of a range object with RowSource then it is important to use the External parameter. This will ensure that RowSource will read from the  sheet of the range rather than the active sheet:

 ' Get the range
 Dim rg As Range
 Set rg = Sheet1.Range("A1:A5")

 ' Address will be $A$1:$A$5 which will use the active sheet
 ListBox1.RowSource = rg.Address
 Debug.Print ListBox1.RowSource

 ' Address will be [Book2]Sheet1!$A$1:$A$5 which will use Sheet1
 ListBox1.RowSource = rg.Address(External:=True)
 Debug.Print ListBox1.RowSource

RowSource Column Headers

Column headers are automatically added to the ListBox when you use the RowSource property. The ColumnHeads property must be set to True or the headers will not appear. You can set this property in the code or in the properties window of the ListBox.

  ListBox1.ColumnHeads = True

The column headers are taken from the row above the range used for the RowSource.  For example, if your range is A2 to C5 then the column header will use the range A1 to C1:

Here is an example: We want to add the data below to our ListBox and we want A1 to C1 to be the header.

We set the RowSource property to A2:C5 and set the ColumnHeads property to true:

With ListBox1
    .RowSource = "sheet1!A2:C5"
    .ColumnHeads = True
    .ColumnWidths = "80;80;80"
End With

The result will look like this:

VBA ListBox AddItem

It is very rare that you would use the AddItem property to fill the ListBox. List and RowSource are much more efficient. AddItem is normally used when the Listbox already has items and you want to add a new item.

The AddItem property is simple to use. You provide the item you want to add as a parameter. The ListBox will automatically add it as the last item:

With ListBox
    .AddItem "Apple"
    .AddItem "Orange"
End With

If you want to Insert the item at a certain position you can use the second parameter. Keep in mind that this is a zero-based position, so if you want the item in position one then the value is 0, position 2 the value is 1, and so on.

With ListBox1
    .AddItem "Apple"
    .AddItem "Orange"
    
    ' Add "Banana" to position 1(Index 0)
    .AddItem "Banana", 0
End With

The order will be:
Banana
Apple
Orange

If you want to add multiple columns with AddItem then you need to use the List property after you use AddItem:

 With listboxFruit
    .List = myRange.Value
    .AddItem "Banana"
    
    ' Add to the second column of 'Banana' row
    .List(2, 1) = "$2.99"
 End With

One reason for using AddItem  is if you are adding from data that isn’t sequential so you cannot use the List or RowSource properties:

 Dim cell As Range
 ' Fill items with first letter is A
 For Each cell In Sheet1.Range("A1:A50")
    If Left(cell.Value, 1) = "A" Then
        comboBoxFruit.AddItem cell.Value
    End If
 Next

Important Note: If you fill a ListBox with RowSource then you cannot use AddItem to add a new item. If you try you will get a “Runtime Error 70 – Permission Denied”.

VBA ListBox Selected Items

If only one item is selected then you can use ListIndex to get the selected row. Remember that it is zero-based so row 1 in the ListBox is at ListIndex 0, row 2 at ListIndex 1 and so on.

   MsgBox "The selected item is " & ListBox1.ListIndex

If the ListBox has multiple columns then you can use the ListIndex and List properties together to return a value in the selected row:

  ' Display the value from the second column of the selected row
  MsgBox ListBox1.List(ListBox1.ListIndex, 2)

If multiple items are selected then you can use the GetSelectedRows function which returns a collection of selected rows:

 Sub Example()
    
    ' Store the row numbers of selected items to a collection
    Dim selectedRows As Collection
    Set selectedRows = GetSelectedRows()
    
    ' Print the selected rows numbers to the Immediate Window
    Dim row As Long
    For Each row In selectedRows
        ' Print to the Immediate Window Ctrl + G
        Debug.Print row
    Next row

 End Sub

 ' Returns a collection of all the selected items
 Function GetSelectedRows() As Collection

    ' Create the collection
    Dim coll As New Collection

    ' Read through each item in the listbox
    Dim i As Long
    For i = 0 To listboxFruit.ListCount - 1
    
        ' Check if item at position i is selected
        If listboxFruit.Selected(i) Then
            coll.Add i
        End If
    Next i

    Set GetSelectedRows = coll

End Function

Reading Data from the VBA Listbox

To read data from the ListBox we can use the ListBox.Value property. This only works when the ListBox is set to only select one item i.e. MultiSelect is set to frmMultiSelectSingle(see the section VBA ListBox MultiSelect below for more about this).

Single selection only  with one column

When only one item is selected we can use the Value property to get the currently selected item:

 Dim fruit As String
 fruit = ListBox1.Value

Keep in mind that if there are multiple columns, Value will only return the value in the first column.

Single selection only with multiple columns

If the ListBox has Multiple columns you can use the Value property to get the value in the first column. You need to read through the List property to get the values in the other column(s). The List property is essentially an array so you can treat it like one.

In the example below we read through the columns of row 1(the index of row 1 is 0):

 With ListBox1
 
     For j = LBound(.List, 2) To UBound(.List, 2)
         ' Print the columns of the first row to the Immediate Window
         Debug.Print .List(0, j)
     Next j
     
 End With

Normally you want to print the values in the selected row. You can use the ListIndex property to get the selected item(Note that ListIndex returns the last selected items so it won’t work where there are multiple items selected):

 ' ExcelMacroMastery.com
 Sub ReadValuesFromSelectedRow()

    ' Write contents of the row to the Immediate Window(Ctrl G)
    With ListBox1 
        For j = LBound(.List, 2) To UBound(.List, 2) 
            ' Print the columns of the selected row to the Immediate Window 
            Debug.Print .List(.ListIndex, j) Next j 
    End With
 End Sub
 

Multiple selections

If the ListBox has multiple selections and you want to get all the data from each then you can use the GetSelectedRows() sub from the section VBA ListBox Selected Items. This will get a collection of all selected rows. You can use this to print the data from the selected rows:

Sub PrintMultiSelectedRows()

    ' Get all the selected rows
    Dim selectedRows As Collection
    Set selectedRows = GetSelectedRows(Me.ListBox1)

    Dim i As Long, j As Long, currentRow As Long
    ' Read through the selected rows
    For i = 1 To selectedRows.Count
        With ListBox1
            
            ' Get the current row
            currentRow = selectedRows(i)
            
            ' Print row header
            Debug.Print vbNewLine & "Row : " & currentRow
            
            ' Read items in the current row
            For j = LBound(.List, 2) To UBound(ListBox1.List, 2)
                ' Print the columns of the first row to the Immediate Window
                Debug.Print .List(currentRow, j)
            Next j
        
        End With
    Next i
    
End Sub

Function GetSelectedRows(currentListbox As MSForms.ListBox) As Collection

    ' Create the collection
    Dim coll As New Collection

    ' Read through each item in the listbox
    Dim i As Long
    For i = 0 To currentListbox.ListCount - 1
    
        ' Check if item at position i is selected
        If currentListbox.Selected(i) Then
            coll.Add i
        End If
    Next i

    Set GetSelectedRows = coll

End Function

VBA ListBox MultiSelect

We can use the MultiSelect property of the ListBox to allow the user to select either a single item or multiple items:

listbox multiselect

There are 3 selections:

  • 0 = frmMultiSelectSingle –  [Default]Multiple selection isn’t allowed.
  • 1 = frmMultiSelectMulti – Multiple items are selected or deselected by choosing them with the mouse or by pressing the Spacebar.
  • 2 = frmMultiSelectExtended – Multiple items are selected by holding down Shift and choosing them with the mouse, or by holding down Shift and pressing an arrow key to extend the selection from the previously selected item to the current item. You can also select items by dragging with the mouse. Holding down Ctrl and choosing an item selects or deselects that item.

VBA ListBox Columns

You can have multiple columns in a ListBox. For example, you can load a Range or two-dimensional array to a ListBox using List or RowSource.

Often when you load data with multiple columns only one column appears. This can be very confusing when you are using the Listbox. To get the columns to appear you have to set the ColumnCount property to the number of Columns.

You should also make sure that the ColumnWidths property is correct or one of the columns may not appear.

You can do it like this:

With listboxFruit
    .RowSource = "Sheet1!A2:B4"
    .ColumnCount = 2
    .ColumnWidths = "100,100"
End With

In a real-world application, you could set the RowSource and ColumnCount properties like this:

With listboxFruit
    .RowSource = myRange.Address(External:=True)
    .ColumnCount = myRange.Columns.Count
End With

See the AddItem section for how to add data to the other columns when you are using the AddItem property.

VBA ListBox Column Headers

Column Headers are another confusing element of the ListBox. If you use the RowSource property to add data to the ListBox then the line above the Range will be automatically used as the header.

For the Column headers to appear the ColumnHeads property must be set to true. You can do this in the properties window of the ListBox or in the code list this:

ListBox1.ColumnHeads = True

If you use the List or AddItem property to fill the ListBox then the column headers are not available. The best solution, albeit a frustrating one, is to use labels above the ListBox. I know it sounds crazy but that unfortunately is the reality. The one advantage is that you can use the Label click event which is useful if you plan to sort the data by a column.

Creating a ListBox Dynamically

Controls are normally created at design time but you can also create them dynamically at run time:

    Dim myListbox As MSForms.ListBox
    Set myListbox = Controls.Add("Forms.ListBox.1")

If you want to add an event to a dynamic control you can do it like this:

  1. First of all create a Class like this:
    Public WithEvents myListBox As MSForms.ListBox
    
    Private Sub myListBox_Change()
      MsgBox "Selection changed"
    End Sub
    
  2. Name the class clsListBoxEvents.  Create a variable of this class object in the UserForm like this:
    Private listBoxEvents As New clsListBoxEvents
    
  3.   Attach the events to the ListBox:
    Sub CreateDynamicListBox()
    
        ' Create the ListBox
        Dim newListBox As MSForms.ListBox
        Set newListBox = Controls.Add("Forms.ListBox.1")
        
        ' Add some items
        newListBox.List = Array("Apple", "Orange", "Pear")
       
        ' Connect the ListBox to the ListBox events class
        Set listBoxEvents.myListBox = newListBox
    
    End Sub
    

Note that you can attach events to any ListBox. It doesn’t have to be created dynamically to do this.

Loop through ListBoxes

If you want to loop through all the ListBoxes on a UserForm you can do it like this:

 Dim ctrl As Variant
 For Each ctrl In Me.Controls
    If TypeName(ctrl) = "ListBox" Then
        Debug.Print ctrl.Name
    End If
 Next ctrl

YouTube Video

Check out this video where I use the ListBox. The source code for the video is available from here

 

What’s Next?

Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out this Free VBA Tutorial.

Related Training: Get full access to the Excel VBA training webinars and all the tutorials.

(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)

Содержание

  1. VBA Excel. Элемент управления ListBox (список)
  2. Элемент управления ListBox
  3. Свойства списка
  4. Способы заполнения ListBox
  5. The Complete Guide to Excel VBA Form Control ListBoxes
  6. The VBA Tutorials Blog
  7. Table of Contents
  8. Introduction
  9. Change ListBox Selection Type
  10. ListBox (lsb)
  11. ListBox vs ComboBox
  12. Adding to single column
  13. Currently Selected Item
  14. Multiple Columns
  15. Adding using an Array
  16. Removing Selected
  17. More than 10 Columns
  18. TextColumn
  19. BoundColumn
  20. No items selected
  21. Multiple selections
  22. RowSource
  23. Adding Column Headers
  24. Adding Unique Items
  25. VBA Listbox – Selected Item
  26. Create List Box in a VBA Form
  27. Add Values to the List Box
  28. Select Values from the List Box
  29. Work with the Selected Values in VBA
  30. Assigning the Value to a Variable
  31. VBA Coding Made Easy
  32. Use a Command Button to Return the Value to Excel
  33. Select Multiple Values
  34. VBA Code Examples Add-in

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

The Complete Guide to Excel VBA Form Control ListBoxes

The VBA Tutorials Blog

Table of Contents

Introduction

This VBA Guide will teach you everything you could possibly want to know about handling Excel Form Control Listboxes using VBA. When I say “Form Control” ListBox, I’m talking about this little guy located under “Form Controls” on the Developer Tab > Insert menu:


Form Control ListBox

If you want to read more complete guides to Form Control or ActiveX Controls, visit my ActiveX and Form Control Guides page.

Before I get criticized, yes, I know the formal term is the two-word phrase List Box but I’m partial to referring to it like you would when writing a VBA macro: ListBox. You’ll find I use them interchangeably throughout this guide.

I made a calendar form using Excel Form Control ListBoxes, which I’ll reference throughout this guide as we learn how to manipulate our listboxes with VBA macros.


Excel ListBox Form

In the form control world, a listbox contains all the items in your list with an up and down scroll bar on the right side. If it’s a dropdown list your after, you need to try a combobox.

In this tutorial, I’ll show you how to select items, enable multiple selections, return the value of your listbox, link your listbox to a range, assign a macro to your listbox and loop through all the listboxes in your form — all using VBA!

Change ListBox Selection Type

How you control the selected values in a listbox using VBA depends largely on what you’ve chosen for your Selection Type. That’s why we’re starting here, first. The selection type can be changed by right clicking your ListBox, selecting Format Control and clicking the Control tab. Your choices are:

  1. Single — allows only one selection (xlNone).
  2. Multi — allows multiple selections (xlSimple).
  3. Extend — allows multiple selections and allows you to select a range of items in the list by shift-clicking (xlExtended).


Selection Type

Let’s change the selection type of our listboxes using VBA. Remember, the listbox name can be found in the upper left of Excel when you have your listbox selected:


List Box 1

Each of the three methods below can be used to change the MultiSelect property to any of the three acceptable values (xlNone, xlSimple and xlExtended).

Источник

ListBox (lsb)

ListBox — This control allows the user to select from a list of possible choices.

ListBox vs ComboBox

A listbox only lets you choose from a pre-defined list. You cannot type/enter a different value.
A combobox allows the user to either select an item from a drop-down list or to enter a different value into the textbox.

Adding to single column

You can use the «AddItem» method when you have a single column listbox.
If you try to add items to a listbox that has a non empty RowSource property you will get a «permission denied» error.

Currently Selected Item

Obtaining the currently selected item in a single selection list box

Multiple Columns

A listbox can contain multiple columns by using the ColumnCount property.
You can use the «AddItem» combined with the List property when you have multiple columns.
All list entries start with a row number of 0, and a column number of 0 , ie List(0,0) = «text»
If you want to add items to a multi column listbox, you need to use «AddItem» to add a new row and then either «List» or «Column» to add the specific items past the first column.

Both column and row numbers in a listbox start at 0 by default and not 1.
The only way to obtain the selected items in a multiple selection list box is to cycle through the whole list.

Adding using an Array

If you data is stored in a one-dimensional array you can assign the array directly using the List property.

If you data is stored in a two-dimensional array you can assign the array directly using the List property.

Removing Selected

This will remove the currently selected item

More than 10 Columns

If you want to have more than 10 columns in your listbox then you must use the List Property .

TextColumn

This property allows you to display one set of values to the user but return a different value when selection has been made.
Use the Text property to return the column specified in the TextBound column.
If you use the Value property you will always get the item in the first column.

BoundColumn

The BoundColumn property identifies which column is referenced when you refer to the Value property of a listbox entry.

No items selected

It is possible to display a listbox with no items selected (when the listindex = -1).
Although once an item is selected it is not possible to unselect all the items.

Multiple selections

By default only a single item can be selected although this can be changed by changing the MultiSelect property.
You can only make multiple selections with a listbox — not a combo box.

RowSource

The items in a Listbox can be retrieved from an Excel range of cells by using the RowSource property.
Make sure you include the worksheet name otherwise the active sheet will be used.

If you populate a listbox using the RowSource method you then can’t populate a second listbox using the «List» method.
If you populate a listbox using the RowSource method you cannot use the RemoveItem method.

Adding Column Headers

You can only display column headers when you use the RowSource property, not when you use an array or add items individually.
To display column headers set the ColumnHeads property to True.
Do not include the column headings on the worksheet in the range defined for RowSource.
The row directly above the first row of the RowSource will be automatically used.

Adding Unique Items

You should add all the items to a collection ensuring that only unique items get added and then add all the items from the collection to the listbox.

It might also be worth sorting the collection before you add it to the listbox.

Change the Integral Height to False and a line is roughly 13.42
Arial, 10, Regular
It is possible to have a drop-down listbox — change the property — doesn’t have to be a combo box !!
It is possible to display equally spaced items in a list box by using a monospaced font such as Courier New. A better approach is to use multiple columns.
Do you have to populate a listbox with data to be able to assign an array to it . I DON’T THINK YOU DO !!
The vertical height of a listbox in design mode may not be the same height when the userform is actually displayed.

Источник

VBA Listbox – Selected Item

In this Article

This article will demonstrate how to work with the selected item in a List Box in Excel VBA.

List Boxes show a list of options to users, allowing them to select one or more of the items. They are largely used in VBA forms but can also be used within your Excel worksheet.

Create List Box in a VBA Form

To create a list box in a VBA form, we first need to create the UserForm.

Once you have created your form, select the List Box control in the toolbox and then drag to create a list box on your form.

Add Values to the List Box

In the Initialize event of the form, type the following code. The List Box will pick up values that are stored in a Range of Cells in your Excel Worksheet.

When we run the form, the list box will be shown as demonstrated in the image below:

Select Values from the List Box

By default, a single value can be selected in a List Box in a user form. However this can be amended by changing the Multi-Select property of the list box.

Click on the list box to select it, and then in the Properties window, change the Multi-Select Property from 0-frmMultiSelectSingle to 1-frmMultiSelectMulti.

Now when we run the form, we can select more than one option in the List Box.

If we change the option to be 2-frmMultiSelectExtended, it means that we can select one of the values, and then, holding down the SHIFT key, select another value further down the list, and all the items between the 2 values selected will also be selected.

Work with the Selected Values in VBA

Depending on the type of option we have used for the Multi-Select property in the List Box, there are a number of ways we can use the value or values selected in the list box in VBA Code.

Assigning the Value to a Variable

We can use the After_Update event of the list box to assign the value selected to a variable.

Firstly, let us create a module level variable at the top of the form module.

Underneath the words, Option Explicit, create the following string variable.

Once we have created this variable, we can double-click on the List box to go to the code behind the form, or we can click on the code button in the VBE Editor.

The Click Event of the list box will be automatically created. Select the After_Update Event form the list of Procedures available.

In the After_Update event, type the following code:

NOTE: You can delete the Click event as it is not required.

Now, if we run the form and click on the list box, the selected value will be store in the variable. To test this, we can put a BREAK point in the code.

Now when we run the form, if we click on the list box, the code will go into DEBUG mode and stop at our break point. If we then press F8 on the keyboard to move a step further in the code, the variable will be populated with the selected item in the list.

We can view this value by resting the mouse on the variable.

We can view the value in the Immediate Window.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

Use a Command Button to Return the Value to Excel

Firstly, we create a command button on the form in order to have an OK button to return the value or values selected in the list box to Excel.

Select the Command Button control, and then click and drag in your form to create the button.

In the Properties window, change the name of the button to cmdOK, and change the Caption and Accelerator of the button.

The purpose of the Accelerator is for the user to use the keyboard to activate the button, in this case Alt+O would activate the button.

For the command button to work, we need to add code behind it so that when the button is clicked, the code runs. This is called the Click event of the button.

To get to the click event, double-click on the button in the design view of the form. The click event will be automatically created as this is the event that is most commonly used for Command buttons.

Type the following code into the click event of the command button.

The code will pick up the variable we declared in the After_Update event of the ListBox and return the value to the Range in Excel.

Alternatively, we can pick up the value directly from the List Box without using a variable.

When we run the form, the selected value will be returned to Excel when we click the OK button.

Select Multiple Values

If we have set the multi-select property of the list box to 1 or 2 which allows us to select multiple values in the list, then the code to select these values is slightly different.

The After_Update event is no longer fired when selecting the values in the list box – we therefore cannot use this event.

We can still use the command button click event, but we need to loop through the values selected in the list box in order to return them to Excel.

In the command button Click event, type the following code.

Now when we run the form, only the values that are selected will be returned to the Excel sheet.

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

Источник

  • #2

You say you want your listbox «to be clear for user» but you want to have a checkbox with a caption «select all» that when you first click it, it selects all items, but when you click the «select all» checkbox again it deselects everything. Deselecting all items when you click a «select all» checkbox is not clear to the user.

You said you only have 3 items in a listbox. Load the listbox with the first 2 items being Select all and Deselect all. That will be a total of 5 items in the listbox, still a small listbox with all 5 items showing, all compartmentalized in the single listbox and more intuitive.

BTW, it always helps if you specify what kind of listbox you are talking about (Forms or ActiveX), and if ActiveX, whether embedded onto a worksheet or as a control on a userform.

  • #3

I think just being able to select everything (the real list I use has 10 items, but 12 is not a problem) instead of needing to click them all would be clear enough, the problem just is that if I do it with a checkbox, it works right now so that when user deselects something from the list, it has absolutely no effect if the checkbox is still checked.

I’m not sure how to check whether those listboxes I use are ActiveX or not, what’s the Excel default? What I can tell is that those forms I use are built with VBA using that «Controls» toolbox, but it doesn’t say there which ones those are, just that those are listboxes. And yes, they are embedded into the userform.

  • #4

Here’s my current solution — which naturally doesn’t work:

Code:

dim mbBoxChange as boolean 'Keep track of where the call came from

Private Sub chkAll_Click()
    'Select everything
    Dim i As Integer
   
    mbBoxChange = True
    
    'Mark all to what the checkbox shows
    For i = 0 To lstListBox.ListCount - 1
        lstListBox.Selected(i) = Me.chkAll
    Next i
   
   Exit Sub
End Sub

Private Sub lstListBox_Change()
    
    Dim i As Integer
    
    If mbBoxChange Then
        Me.chkAll = False
    Else
        With Me.lstListBox
            For i = 0 To .ListCount - 1
                If Not .Selected(i) Then
                    Me.chkAll = False
                    mbBoxChange = False
                    Exit Sub
                End If
            Next i
        End With
    End If
End Sub

  • #5

One option to solve it would be to turn off the events. Is that possible?

  • #6

Hi,

Can use this code

Private Sub ALL_Click()
Dim r As Integer
For r = 0 To ListBox1.ListCount — 1
ListBox1.Selected(r) = True
Next r

End Sub

Private Sub Non_Click()
Dim r As Integer
For r = 0 To ListBox1.ListCount — 1
ListBox1.Selected(r) = False
Next r
End Sub

  • #7

Hi,

Can use this code

Private Sub ALL_Click()
Dim r As Integer
For r = 0 To ListBox1.ListCount — 1
ListBox1.Selected(r) = True
Next r

End Sub

Private Sub Non_Click()
Dim r As Integer
For r = 0 To ListBox1.ListCount — 1
ListBox1.Selected(r) = False
Next r
End Sub

But doesn’t this do the same thing than what I originally had ie. this later sub is actually «clear all selections» instead of «go ahead and unselect something that you don’t want to have selected and while you do that, I’ll remove this check from here to avoid confusion»?

  • #8

Hi.
This is a really old topic but I had this problem today and solved it using a CheckBox with «Select All» caption and the following code:

Private Sub CheckBox1_Change()
Dim N As Single
If CheckBox1.Value = True Then
For N = 0 To ListBox1.ListCount — 1
ListBox1.Selected(N) = True
Next N
Else
For N = 0 To ListBox1.ListCount — 1
ListBox1.Selected(N) = False
Next N
End If
End Sub

  • #9

Thank you Hilles!! Good and Working Solution!! :)

Regards,
PritishS

  • #10

I am so glad I found this. Thank you so much for this solution! I have a listbox with 30 selections, and it’s a pain to select each one individually.

 

all L

Пользователь

Сообщений: 71
Регистрация: 23.12.2012

Уважаемые форумчане,

нигде не удалось найти  (возможно плохо ищу?) пример или описание, как в VBA на ListBox, где установлено свойство Multiselect, выбрать все элементы списка и очистить выбранное одним «щелчком»
Если у кого-нибудь есть примеры или можете подсказать в какую сторону двигаться в процедуре, буду благодарна.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Я делаю и то и другое перебором в цикле всех строк в ЛистБоксе.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

В VBA листбокс совмещает в себе и листбокс классический и CheckedListBox. Но в упрощенном виде. У него нет коллекций Checkedindices и CheckedItems, поэтому обрабатывать выбранные можно только через цикл по всем элементам с проверкой на «выделение».

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

all L

Пользователь

Сообщений: 71
Регистрация: 23.12.2012

Дмитрий, Юрий, все понятно. Спасибо.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

Уважаемые форумчане!

помогите, пожалуйста.
мне нужно , чтобы выпадающий список позволял вставлять в ячейку несколько значений. Это было сделано, но программа работает странно. если  выбрать ячейку слева или справа от столбца, в котором есть выпадающий список , то выпадающий список не работает, т.е. он как будто заблокирован. Работает только, если выбирать ячейки в этом столбце ( т.е. снизу или сверху). Помогите, пож-ста, исправить. очень — очень надо!!!

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Выпадающий список — в данном случае ListBox? Так ведь он привязан к столбцу W. Добавьте в проверку нужный столбец.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

Юрий, да. Это ListBox. Немного не поняла. Мне нужно, чтобы в столбце W из Listbox была возможность выбирать несколько значений. Это работает, но только в том случае, если все время выбираются ячейки только в столбце W. Если кликнуть на ячейку в другом столбце, а затем попытаться зайти опять в Listbox в столбце W и выбрать, то это не получится.
спасибо.

Изменено: Alex2m22.02.2013 23:49:43

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#8

22.02.2013 23:53:33

Вот так можно выделить все и очистить выделение без цикла:

Код
Private Sub CommandButton1_Click()
ListBox1.Selected(0) = True
ListBox1.SetFocus
Application.SendKeys "^+{End}" 'Ctrl+Shift+End
End Sub

Private Sub CommandButton2_Click()
ListBox1.MultiSelect = fmMultiSelectSingle
ListBox1.MultiSelect = fmMultiSelectExtended
End Sub

Прикрепленные файлы

  • ListBox_SelectAll.xls (22 КБ)

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Так ведь нужно и ЛистБокс тогда вызывать в другом столбце.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

А на моем примере можете показать, если не сложно?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#11

23.02.2013 00:03:16

Правый клик по ярлычку листа — Исходный текст. Там у Вас есть строка:

Код
If ActiveCell.Address Like "$W*" Then

Добавьте соседний столбец:

Код
If ActiveCell.Address Like "$W*" Or ActiveCell.Address Like "$X*" Then

Но я бы так не записывал — использовал бы Target.Column

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

Юрий,
мне не нужно, чтобы в X был тоже выпадающий список. Он должен быть только в W и работать постоянно, а не через раз.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#13

23.02.2013 00:25:16

ЛистБокс вызывается из активной ячейки, которая в имеющемся коде должна принадлежать столбцу W. И в эту же ячейку возвращаются выбранные значения из ЛистБокс. И работает он нормально. Теперь читаем:

Цитата
если выбрать ячейку слева или справа от столбца, в котором есть выпадающий список , то выпадающий список не работает

Т.е. — Вы хотели, чтобы ЛистБокс вызывался из соседних столбцов. Но теперь выясняется, что он должен быть только в столбце W. Так что же в конечном счёте нужно? Постарайтесь сформулировать.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

Юрий, извините за неясную формулировку.
Нужно чтобы выпадающий список был только в W. Это работает. Но попробуйте перед вызовом listbox в столбце W, сначала кликнуть на другой столбец. Дословно : выбираете произвольную ячейку в столбце X, затем идете в столбец W и пытаетесь выбрать значения из выпадающего списка. Так вот listbox в такой последовательности не работает. А нужно чтобы работал всегда.

Изменено: Alex2m23.02.2013 00:36:15

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Проверил, как Вы написали со столбцом Х — всё работает корректно. Проверил и со столбцом V — тоже всё хорошо.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

А у меня нет, почему-то. А вы можете выложить видео или прислать сам файл?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Вернуть Вам Ваш файл? А смысл? Может быть Вы говорите о другом? Выбрали ячейку в столбце Х, вызывали ЛистБокс (в столбце W), а значение должно вернуться в столбец Х?

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

нет, значение должно вернуться в W. а у меня в таком порядке listbox заблокирован. Т.е. он раскрывается, но выбрать ничего не дает. И только после того как я еще раз выбрала другую ячейку в W listbox снова работает. Может это настройки параметров Listbox? Но я уже все перепробовала.

Изменено: Alex2m23.02.2013 00:52:45

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Проверил ещё раз для двух соседних столбцов — всё в порядке: выбор и вставка работают.

 

Alex2m

Пользователь

Сообщений: 8
Регистрация: 20.02.2013

#20

23.02.2013 00:57:55

ээх, а у меня почему-то нет.ну что же, спасибо  еще раз за уделенное мне время.

excel vba listbox

The Excel VBA ListBox is a list control that allows you to select (or deselect) one or more items at time. This is compared to the VBA ComboBox which only allows you to select a single items from a drop down list. Let us explore how to create, clear and make a VBA ListBox let you select multiple items.

Create a Excel Form ListBox (Form Control)

To create an Excel Form ListBox you need to first make sure you can see the Developer Tab. Next go to Controls and select the ListBox. Place the ListBox on the Worksheet. You can right click on it to set the properties.
excel vba listbox

Using the Form ListBox

To add items to set items in a From ListBox is easiest by providing an Excel Range on your Worksheet that contain values for options.

Select Excel Range as ListBox Items

To add an Excel Range as Items for a ListBox right-click on the object and go to Format Control. Next go to the Control tab.
Configure a VBA ListBox
As you can see we managed to:

  • Set the Input range for the items in the Form ListBox
  • Set the Cell Link range for the selected item

The Excel Form ListBox is an option to use if you need a simple way to limit input options for your users in an spreadsheet.

Using Form ListBox does not make much sense as just as well we have Data Validation allowing you to set a drop down list to any Excel cell. See my post on Excel Cascading Drop-downs if you want to see how powerful this can be.

Beware in below examples I am using the ActiveX ListBox instead!

Create a VBA ListBox (ActiveX)

Now let us explore the adding Items to a Listbox using VBA. For this purpose it is easier and more convenient to use an ActiveX ListBox control (which I call the VBA ListBox) instead of the previously used Form ListBox:
vba listbox
In examples below I will be adding code to the Worksheet module in which I added a ActiveX ListBox control named ListBox1.
vba listbox name

Add Items to ListBox

To add VBA Add Items to the VBA ListBox use the AddItem function.

'Syntax
AddItem ( itemValue, itemOrder )
'itemValue - the value you want to add to your list
'itemOrder - the position in the VBA ListBox at which you want to insert your item (first is 0)

Examples of adding items to a ActiveX ListBox with VBA:

'Add Item Car
ListBox1.AddItem "Car"
'Add Item Bus
ListBox1.AddItem "Bus"
'Add Item Plane as second
ListBox1.AddItem "Plane", 1
'Add Item Plane
ListBox1.AddItem "Tesla"

The resulting VBA ListBox. Notice that Plane is second in the list:
add items to vba listbox
This list will work identically to the Excel Form ListBox.

Clear items in ListBox

To Clear/Empty items in a VBA ListBox simply use the Clear function:

'Add Item Car
ListBox1.AddItem "Car"

'Remove all items in the ListBox
ListBox1.Clear

Remove item from ListBox

To remove an item at a specific index or position in a VBA ListBox you need to use the RemoveItem function. Remember that the index of the first element is 0:

ListBox1.AddItem "Car"
ListBox1.AddItem "Plane"
ListBox1.AddItem "Bus"

'Remove the item "Plane"
ListBox1.RemoveItem(1)

Count items in ListBox

Counting items in a ListBox can be done using the Count function:

ListBox1.AddItem "Car"
ListBox1.AddItem "Plane"
ListBox1.AddItem "Bus"

'Count items
Debug.Print ListBox1.ListCount 'Result: 3

To enable multiselection on your VBA ListBox (ActiveX) use the MultiSelect property. The property can have one of the following values:

  • fmMultiSelectSingle – default property. You can only select 1 item
  • fmMultiSelectMulti – you can select multiple items. Clicking on an item will select (include it in the existing selected items) or deselect it (remove it from the existing selected items)
  • fmMultiSelectExtended – you can select multiple items. However, when you click on any item it will only select the current item. To select multiple items you need to click and hold and move the mouse up/down to select more items

By setting the MultiSelect option:

ListBox1.MultiSelect = fmMultiSelectExtended 

I am able now to select more items on my ListBox.
vba listbox multiselect

Select / Deselect items in ListBox

First we will try to understand how to check if an item on our ListBox is selected or not. For this we will use the Selected property.

ListBox1.AddItem "Car"
ListBox1.AddItem "Plane"
ListBox1.AddItem "Bus"

'...Click on Plane...

'Check which is selected
Debug.Print ListBox1.Selection(0) 'Result: False - Car is not selected
Debug.Print ListBox1.Selection(1) 'Result: True - Car is not selected
Debug.Print ListBox1.Selection(2) 'Result: False - Bus is not selected

To Select or Delect an item simply set the property to True (Selected) or False (Deselected):

ListBox1.AddItem "Car"
ListBox1.AddItem "Plane"
ListBox1.AddItem "Bus"

'Select Car
ListBox1.Selection(0) = True

'Check which is selected
Debug.Print ListBox1.Selection(0) 'Result: True - Car is not selected
Debug.Print ListBox1.Selection(1) 'Result: False - Car is not selected
Debug.Print ListBox1.Selection(2) 'Result: False - Bus is not selected

Skip to content

Using CheckBox To Select All Items Of ListBox

Sometimes it is necessary to select all items of the Excel Listbox. The codes shown below can be used to select all items of the listbox on the userform with checkbox :

excel search in listbox

The codes that we used :

Private Sub CheckBox1_Click()

Dim r As Long

If CheckBox1.Value = True Then

ListBox2.MultiSelect = fmMultiSelectMulti

    For r = 0 To ListBox2.ListCount – 1

        ListBox2.Selected(r) = True

    Next r

   Else

   For r = 0 To ListBox2.ListCount – 1

        ListBox2.Selected(r) = False

   Next r

   End If

End Sub

📥 Read More & Download Template 

Multiple List Box Selections in Excel VBA

📥 Read More and Download Template

Элемент управления пользовательской формы 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»:

Элемент управления ListBox с привязанной ячейкой

В окне 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 значение из третьего столбца выделенной пользователем строки.

Результат извлечения данных из многостолбцового элемента управления ListBox

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

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

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

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

Понравилась статья? Поделить с друзьями:
  • Vba excel saving a file
  • Vba excel saveas fileformat
  • Vba excel range все ячейки
  • Vba excel range адрес
  • Vba excel range type mismatch