Удаление в listbox excel

SetoFF

0 / 0 / 0

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

Сообщений: 3

1

07.12.2011, 08:40. Показов 23615. Ответов 7

Метки нет (Все метки)


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

Visual Basic
1
2
3
4
5
For I = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(I) Then
            ComboBox1.AddItem (ListBox1.List(I))
        End If
    Next I

Скажите пожалуйста, что нужно добавить, чтобы из ListBox’а выделенные строки удалялись?



0



Казанский

15136 / 6410 / 1730

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

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

07.12.2011, 10:24

2

Ну если AddItem — «добавить элемент», то как будет «удалить элемент»?

Visual Basic
1
ListBox1.RemoveItem I

При этом цикл лучше пустить в обратную сторону, т.к. при удалении i-го элемента i-тым становится следующий элемент.



1



0 / 0 / 0

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

Сообщений: 3

12.12.2011, 14:55

 [ТС]

3

Что-то у меня не пашет… Можете полностью написать как должно быть?



0



Казанский

15136 / 6410 / 1730

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

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

12.12.2011, 15:33

4

Visual Basic
1
2
3
4
5
6
For I = ListBox1.ListCount - 1 To 0 Step -1
    If ListBox1.Selected(I) Then
        ComboBox1.AddItem ListBox1.List(I), 0
        ListBox1.RemoveItem I
    End If
Next I



2



0 / 0 / 0

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

Сообщений: 27

06.04.2015, 16:52

5

А как сделать так, чтобы при удалении из листбокса, удалялась строка в таблице?



0



1337 / 308 / 74

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

Сообщений: 635

06.04.2015, 16:55

6

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



0



1 / 1 / 0

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

Сообщений: 42

21.12.2015, 20:56

7

Скажите пожалуйста!
Как узнать программно номер выделенной строки Listbox-e?



0



15136 / 6410 / 1730

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

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

21.12.2015, 22:48

8

Antontth, ListBox1.ListIndex



1



 

Nickname_82

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

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

#1

09.02.2017 16:41:11

Добрый день!
Перерыл весь интернет, так и не нашел ответа на свой вопрос.
Проблема в следующем.
Есть форма в которой один ListBox и две CommandButton (одна для добавления значений в ListBox, вторая для удаления)
Значения в ListBox берутся из динамической таблицы и в свойствах ListBox в RowSource прописан путь =Лист!Список1[Значение]  («Список1[Значение]» — наименование таблицы)
Так вот, проблем с добавлением значений нет, а вот с удалением не получается (
Нашел лишь только то, что если в свойствах ListBox прописан путь для RowSource, то удаление при помощи кода:

Код
 For i = ListBox.ListCount - 1 To 0 Step -1
    If ListBox.Selected(i) Then
       ListBox.RemoveItem (i)
 End If

не подойдет. А решения проблемы так и не нашел.
Посоветуйте, пожалуйста, как решить данную проблему(

<#0>

 

Karataev

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

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

Заполняйте ListBox с помощью AddItem или List. Думаю, что в интернете можно найти информацию.

 

Logistic

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

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

 

Nickname_82

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

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

#4

13.02.2017 23:03:43

Цитата
Logistic написал:
Посмотрите пример.

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

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

  • ЛистБокс.xlsm (22.06 КБ)

<#0>

 

Юрий М

Модератор

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

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

Файл не смотрел… Но, если используете RowSource, то и удалять значение нужно на листе из этого диапазона.

 

Sanja

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

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

А что такое ListWorkers?

Согласие есть продукт при полном непротивлении сторон.

 

Sanja

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

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

#7

13.02.2017 23:14:28

Ну а пока разбираетесь…

Код
Private Sub del_Click()
Dim i As Integer
On Error Resume Next
    With Me.NameOrganization
        For i = 1 To .ListCount
            If .Selected(i) = True Then
                .RemoveItem i
                Worksheets("Справочник").Cells(i, 1).Delete
                Exit For
            End If
        Next
    End With
End Sub

Изменено: Sanja13.02.2017 23:32:05

Согласие есть продукт при полном непротивлении сторон.

 

Dima S

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

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

Nickname_82 как вам такой вариант?

 

RAN

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

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

#9

13.02.2017 23:46:45

Код
Private Sub del_Click()
    Dim i As Integer
    For i = 0 To Me.NameOrganization.ListCount - 1
        If NameOrganization.Selected(i) = True Then
            NameOrganization.RemoveItem i
            Range("Workers").ListObject.ListRows(i + 1).Delete
            Exit For
        End If
    Next
End Sub

Private Sub UserForm_Initialize()
    NameOrganization.List = Range("Workers").Value
End Sub

Изменено: RAN14.02.2017 00:11:14

 

Logistic

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

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

Sanja,Ваш код выдает ошибку :»Application-defined or object-defined error»
Я переписал свой код с предыдущего файла  работает и прописал вместо очистки строки -удалить.
Может не по «феншую» ,но работает. Если есть  другие варианты  не откажусь для своей копилки с примерами

Изменено: Logistic13.02.2017 23:57:20
(редактирования текста)

 

Проблема не в удалении значения из списка. Logistic здорово помог. Удаляется только значение, а не строка целиком. Как и это и есть в примере  
Дело в том, что в ListBox не отображается наименование организаций, а только лишь индекс строки

Изменено: Nickname_8214.02.2017 11:59:30

 

Dima S

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

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

#12

14.02.2017 16:13:59

Цитата
Nickname_82 написал:
Дело в том, что в ListBox не отображается наименование организаций, а только лишь индекс строки

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

а на счет

Цитата
Удаляется только значение, а не строка целиком

достаточно изменить строку

Код
  If .ListIndex > -1 Then Sheets("Справочник").Range("Workers").Rows(.ListIndex + 1).Delete

на

Код
  If .ListIndex > -1 Then Sheets("Справочник").Range("Workers[[Организация ]]").Rows(.ListIndex + 1).ClearContents
 

Nickname_82

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

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

#13

14.02.2017 22:06:24

Dima S

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

Logistic

предложил лучше код, т.к. после удаления значения из списка отсутствие пустых строк больше радует глаз.
Еще раз ОГРОМНОЕ человеческое спасибо!
Вопрос закрыт!

<#0>

«VBA Excel ListBox Multiselect»
Привязка диапазона данных к ListBox.

Добавление, удаление пунктов списка.

Сортировка списка и множественный выбор элементов.

ListBox или «окно со списком» – это один из элементов управления,
который может быть расположен на форме для предоставления пользователю возможности выбора одного
или нескольких элементов (пунктов) из предоставленного множества (списка) вариантов …

VBA предоставляет две возможности заполнения списка ListBox

  • Через свойство RowSource (источник строк) в список загружается определенный диапазон (колонка ячеек).
    В этом случае добавление новых пунктов в список или удаление существующих из списка в процессе выполнения
    макросов VBA не возможно… (по крайней мере, до момента присвоения свойству RowSource значения пустой строки).
  • Через методы AddItem и RemoteItem (добавление или удаление пунктов списка)…
    Повторю, что для такой возможности, свойство RowSource должно иметь пустое значение.

Задание:

Разместить на форме несколько радиокнопок, позволяющих загружать в элемент ListBox1 списки из разных
колонок листа Excel.
Обеспечить возможность сортировки загруженных списков в ListBox1.
Обеспечить возможность множественного выбора элементов из списка и вывод результата выбора в окно сообщений MsgBox.

Решение:

VBA Excel с помощью макросов ListBox Multiselect

Привязка к списку диапазона значений через свойство RowSource

Считаю, что для удобства реальной работы со списками на листах Excel (добавление новых значений
в ячейки соответствующих колонок или удаление существующих) необходимо использовать функцию
для автоматического определения номера последней заполненной строки в указанном столбце…
Метод Find объектов класса Range (рекомендую заглянуть в его справку) очень помогает в этом вопросе….

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


Function GetLastRowFromColumn(numColumn As Integer) As Integer
      GetLastRowFromColumn = Columns(numColumn).Cells.Find("*", , , , xlByRows, xlPrevious).Row
End Function

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

Тогда обработчики событий щелчков мышью по радиокнопкам будут выглядеть так…


Private Sub OptionButton1_Click()
lastrow = GetLastRowFromColumn(1)
If OptionButton1 Then Me.ListBox1.RowSource = "=A1:A" & lastrow
End Sub

Private Sub OptionButton2_Click()
lastrow = GetLastRowFromColumn(2)
If OptionButton2 Then Me.ListBox1.RowSource = "=B1:B" & lastrow
End Sub

Private Sub OptionButton3_Click()
lastrow = GetLastRowFromColumn(3)
If OptionButton3 Then Me.ListBox1.RowSource = "=C1:C" & lastrow
End Sub

Можно было бы и еще упростить (до одной строки в процедуре),


Me.ListBox1.RowSource = "=A1:A" & GetLastRowFromColumn(1)

но считаю, что наличие переменной lastrow помогает просматривать ее значение при отладке,
а это сэкономленное время…. которое дороже, чем уменьшение объема кода…

В общем, первая радиокнопка помещает в список диапазон из колонки А (используя свойство RowSource), а вторая и третья, соответственно, из колонок В и С

Множественный выбор

Основное свойство элемента ListBox – это List… индексированный список значений… (As Variant)
Поэтому к любому элементу списка можно обратиться по индексу… ,например List(idx)…
И так же важно второе индексированное свойство Selected(idx), которое представляет собой
массив логических величин, показывающий, выделен ли конкретный элемент списка пользователем или нет…

Таким образом, обработчик кнопки «Сообщение» выглядит так…


Private Sub CommandButton1_Click()
Dim n As Integer, s As String
s = ""

For n = 0 To Me.ListBox1.ListCount - 1
     If Me.ListBox1.Selected(n) Then
         s = s & Me.ListBox1.List(n) & vbLf
     End If
Next n

If s = "" Then
     MsgBox "Нет выбранных пунктов", 0, "Выбранные пункты списка"
Else
     MsgBox s, 0, "Выбранные пункты списка"
End If

End Sub

Он формирует строку s , только из выделенных пунктов списка и выводит соответствующее сообщение…
Встроенная константа vbLf означает переход на новую строку…

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

А вот для сортировки списка нам придется отказаться от свойства RowSource ,
т.к. изменение порядка элементов списка будет противоречить привязанному диапазону.
VBA справедливо заругается…

Вот процедура сортировки объекта ListBox (который передается в виде параметра As Object)


Sub mySort(aL As Object)
     Dim locList() As Variant, siz As Long
         'Сортирует список ListBox (свойство .List - как массив Variant)
     Dim j As Long
     siz = UBound(aL.List)
     ReDim locList(UBound(aL.List))

     With aL

         For j = 0 To siz
             locList(j) = .List(j)
         Next j

         .RowSource = ""
         .Clear
         mySortArray locList

         For j = 0 To siz
             .AddItem (locList(j))
         Next j

     End With
End Sub

Как видите, сначала создаем массив locList() нужной размерности и заполняем его элементами списка…
Затем отвязываем список от диапазона (aL.RowSource = «») и очищаем его (aL.Clear)
А полученный массив сортируем обычным образом (любым из алгоритмов сортировки).
Все!!! Осталось загрузить отсортированный массив в список, используя метод AddItem, конечно же, в цикле…

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


ListBox1.MultiSelect = fmMultiSelectMulti



Все…

Условия получения кода?    Показать?

Другие примеры на тему «Автоматизация документов Microsoft Office Excel, Word, Access»

Другие примеры на языке «Visual Basic»

Если на этой странице не нашлось того, что Вы так искали…

        
Не расстраивайтесь, не все потеряно… Смело щелкайте…

       телефон:

+7(919) 572-59-92
+7(987) 848-79-61

Содержание

  1. Listbox vba excel методы
  2. Объект ListBox (Outlook Forms Script)
  3. Замечания
  4. Стили элемента ListBox
  5. События
  6. Методы
  7. Свойства
  8. Поддержка и обратная связь
  9. Объект ListBox (Access)
  10. Замечания
  11. Пример
  12. События
  13. Методы
  14. Свойства
  15. См. также
  16. Поддержка и обратная связь

Listbox vba excel методы

На этом шаге мы рассмотрим назначение, основные свойства и методы этого элемента .

Элемент управления ListBox (Список) создается с помощью кнопки Список (ListBox) (рисунок 1).

Рис.1. Список в форме

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

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

Свойство Назначение
ListIndex Возвращает номер текущего элемента списка. Нумерация элементов списка начинается с нуля
ListCount Возвращает число элементов списка
TopIndex Возвращает элемент списка с наибольшим номером
ColumnCount Устанавливает число столбцов в списке
TextColumn Устанавливает столбец в списке, элемент которого возвращается свойством Text
Enabled Допустимые значения: True (запрещен выбор значения из списка пользователем) и False (в противном случае)
Text Возвращает выбранный в списке элемент
List Возвращает элемент списка, стоящий на пересечении указанных строки и столбца. Синтаксис:
RowSource Устанавливает диапазон, содержащий элементы списка
ControlSource Устанавливает диапазон (ячейку), куда возвращается выбранный элемент из списка
MultiSelect Устанавливает способ выбора элементов списка. Допустимые значения:

  • fmMultiSelectSingle (выбор только одного элемента);
  • fmMultiSelectMulti (разрешен выбор нескольких элементов посредством либо щелчка, либо нажатием клавиши Пробел );
  • fmMultiSelectExtended (разрешено использование клавиши Shift при выборе ряда последовательных элементов списка).

Selected Допустимые значения: True (если элемент списка выбран) и False (в противном случае). Используется для определения выделенного текста, когда свойство MultiSelect имеет значение fmMultiSelectMulti или fmMultiSelectExtended .
ColumnWidths Устанавливает ширину столбцов списка. Синтаксис:
ColumnHeads Допустимые значения: True (выводятся заголовки столбцов раскрывающегося списка) и False (в противном случае)
ListStyle Допустимые значения:

  • fmListStylePlain (выбранный элемент из списка выделяется цветом);
  • fmListStyleOption (перед каждым элементом в списке располагается флажок и выбор элемента из списка соответствует установке этого флажка).

MatchEntry Выводит первый подходящий элемент из списка при наборе его имени на клавиатуре. Допустимые значения:

  • fmMatchEntryNone (режим вывода подходящего элемента в списке отключен);
  • fmMatchEntryFirstLetter (вводит подходящий элемент по набранной первой букве. В этом случае, предпочтительно, чтобы элементы списка были бы упорядочены в алфавитном порядке)
  • fmMatchEntryComplete (вводит подходящий элемент по полному набранному имени).

BoundColumn Устанавливает тип, возвращаемый свойством Value . А именно,

  • если свойство BoundColumn равно 0, то свойство Value возвращает индекс выбранной строки, т.е. в этом случае оно действует как свойство ListIndex ;
  • если свойство BoundColumn принимает значение из диапазона от 1 до количества столбцов в списке, то свойство Value возвращает элемент из выбранной строки, стоящий в столбце, определенном свойством BoundColumn .

Таблица 1. Основные свойства ListBox

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

Метод Назначение
Clear Удаляет все элементы из списка
RemoveItem Удаляет из списка элемент с указанным номером. Синтаксис:

Параметр index определяет номер удаляемого из списка элемента

AddItem Добавляет элемент в список. Синтаксис:

  • item — элемент (строковое выражение), добавляемый в список;
  • varIndex — номер добавляемого элемента.

Таблица 2. Основные методы ListBox

На следующем шаге мы рассмотрим особености заполнения списка .

Источник

Объект ListBox (Outlook Forms Script)

Отображает список значений и позволяет выбирать одно или несколько значений.

Замечания

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

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

Свойством по умолчанию для ListBox является свойство Value .

Событием по умолчанию для ListBox является событие Click .

В раскрывающийся элемент ListBox невозможно поместить текст.

Стили элемента ListBox

Вы можете выбрать любой из двух стилей представления элемента ListBox. Это выражается свойством ListStyle . Каждый из них реализует собственный способ выбора элементов в списке.

Если стиль равен 0, каждый элемент находится в отдельной строке; пользователь выбирает элемент, выделяя одну или несколько строк.

Если стиль равен 1, в начале каждой строки отображается optionButton или CheckBox . В этом случае для выбора элемента пользователь нажимает кнопку или устанавливает флажок. Флажки отображаются только в том случае, если свойство MultiSelect имеет значение True.

События

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

Методы

Имя Описание
AddItem Для элемента ListBox с одним столбцом метод AddItem добавляет элемент в список. Для многоколоний ListBox этот метод добавляет строку в список.
Clear Удаляет все записи в списке в ListBox.
RemoveItem Удаляет строку из списка в ListBox.

Свойства

Имя Описание
BackColor Возвращает или задает значение Long , указывающее цвет фона объекта . Для чтения и записи.
BorderColor Возвращает или задает значение Long , указывающее цвет границы объекта. Для чтения и записи.
BorderStyle Возвращает или задает целое число , указывающее тип границы элемента управления. Для чтения и записи.
BoundColumn Возвращает или задает значение Variant , определяющее источник данных в многоколоний ListBox. Для чтения и записи.
Столбец Возвращает или задает значение Variant , представляющее одно значение, столбец значений или двумерный массив для загрузки в ListBox. Для чтения и записи.
ColumnCount Возвращает или задает значение Long , представляющее количество столбцов, отображаемых в списке. Для чтения и записи.
ColumnHeads Возвращает или задает логическое значение, указывающее, отображается ли одна строка заголовков столбцов. Для чтения и записи.
ColumnWidths Возвращает или задает значение String , указывающее ширину каждого столбца в многоколоний ListBox. Для чтения и записи.
Enabled Возвращает или задает логическое значение, указывающее, может ли элемент управления получать фокус и реагировать на события, созданные пользователем. Для чтения и записи.
ForeColor Возвращает или задает значение Long , указывающее цвет переднего плана объекта. Для чтения и записи.
IMEMode Возвращает или задает целое число , указывающее режим времени выполнения по умолчанию редактора метода ввода (IME) для элемента управления. Для чтения и записи.
IntegralHeight Возвращает или задает логическое значение, указывающее, отображает ли ListBox полные строки текста в списке или частичные строки. Для чтения и записи.
List Возвращает или задает значение Variant , представляющее указанную запись в ListBox. Для чтения и записи.
ListCount Возвращает значение Long , представляющее количество записей списка в элементе управления . Только для чтения.
ListIndex Возвращает или задает значение Variant , представляющее текущий выбранный элемент в элементе ListBox. Для чтения и записи.
ListStyle Возвращает или задает целое число , указывающее визуальный вид списка в ListBox. Для чтения и записи.
Locked Возвращает или задает логическое значение, указывающее, можно ли изменять элемент управления. Для чтения и записи.
MatchEntry Возвращает или задает целое число , указывающее, как ListBox выполняет поиск в списке по типу пользователя. Для чтения и записи.
MouseIcon Возвращает значение String , представляющее полное имя пути настраиваемого значка, назначаемого элементу управления. Только для чтения.
MousePointer Возвращает или задает целое число , указывающее тип указателя, отображаемого при наведении указателя мыши на определенный объект. Для чтения и записи.
MultiSelect Возвращает или задает целое число , указывающее, допускает ли объект несколько выделений. Для чтения и записи.
Selected Возвращает или задает логическое значение, указывающее состояние выделения элементов в ListBox. Для чтения и записи.
SpecialEffect Возвращает или задает целое число , указывающее внешний вид объекта. Для чтения и записи.
Текст Возвращает или задает строку, указывающую текст в элементе ListBox, изменяя выбранную строку в элементе управления . Для чтения и записи.
TextAlign Возвращает или задает целое число , указывающее способ выравнивания текста в элементе управления . Для чтения и записи.
TextColumn Возвращает или задает значение Variant , которое идентифицирует столбец в элементе ListBox для отображения пользователю. Для чтения и записи.
TopIndex Возвращает или задает значение Long , представляющее индекс элемента списка, отображаемого в верхней позиции списка. Для чтения и записи.
Value (Значение) Возвращает или задает значение Variant , указывающее значение в BoundColumn выбранных строк. Для чтения и записи.

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Объект ListBox (Access)

Этот объект соответствует элементу управления list box. В элементе управления «Поле списка» отображается список значений или альтернатив.

Замечания

Управление Средство

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

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

Если поле списка с несколькими столбцами привязано, Microsoft Access сохраняет значения из одного из столбцов.

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

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

Пример

В этом примере показано, как фильтровать содержимое поля списка при вводе в текстовое поле.

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

Для этого используйте событие Change текстового поля, чтобы создать инструкцию SQL, которая будет служить в качестве нового RowSource в списке.

События

Методы

Свойства

См. также

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

I need to remove items from a Listbox using data from Range under certain conditions. I don’t want to delete data in the Worksheet the Listbox is based on.

Here is an excerpt of my code:

 Me.LstWSource.RowSource = ""

 If Len(rRange.Offset(1, 0).Formula) > 0 Then
    Set rRange = ThisWorkbook.Sheets(G_sNameReferenceS).Range(rRange.Offset(1, 0), rRange.End(xlDown))

 With Me.LstWSource
  .ColumnWidths = "28pt"
  .RowSource = rRange.Address
  .ListIndex = -1
  End With '>>>
End If

  '>>>>>>>>>>>>>>>>>>>>>>>>
  sRet = fG_SortingBasicS("lstYear", "DESC")
  '>>>>>>>>>>>>>>>>>>>>>>>>

  For i = Me.LstWSource.ListCount - 1 To 0 Step -1

   '>> current string condition to delete Item <<
   If Me.LstWSource.List(i) > CStr(Year(G_datJourTraitee)) Then
     Me.LstWSource.RemoveItem (i)
   End If
 Next i

The error is triggered by the RemoveItem.

Community's user avatar

asked Nov 30, 2018 at 8:50

botakelymg's user avatar

If you use .RowSource to fill your ListBox you cannot remove list items from the list.

Therefore you need to fill your list using LstWSource.AddItem. Loop through your range and add each item to your ListBox based on your criteria. Also see Adding items in a Listbox with multiple columns.

answered Nov 30, 2018 at 8:59

Pᴇʜ's user avatar

PᴇʜPᴇʜ

56k9 gold badges49 silver badges73 bronze badges

2

For additional information and bring my definite solution related to slowing populating : I used once the read of Range cells to populate a dynamic array. Then, I use this array to exclude or include lines in another second array.

These are lines to be considered :

J = 1
For i = LBound(G_varListYears) To UBound(G_varListYears)

If G_varListYears(i) <= CStr(Year(G_datJourTraitee)) Then
  '>>>
  ReDim Preserve vListTMP(J)
  vListTMP(J) = G_varListYears(i)
  J = J + 1
  '>>
ElseIf (Me.chkNextYear = True) And ((Month(G_datJourTraitee) = 11 Or Month(G_datJourTraitee) = 12) And (G_varListYears(i) = CStr(Year(G_datJourTraitee) + 1))) Then
  '>>>
  ReDim Preserve vListTMP(J)
  vListTMP(J) = G_varListYears(i)
  J = J + 1
  '>>
Else
  '>>
End If

Next i

With Me.LstWSource
  .ColumnWidths = "28pt"
  .List = vListTMP()
  .ListIndex = -1
End With '>>>

Hope it’ll help too.

answered Nov 30, 2018 at 16:04

botakelymg's user avatar

I have a listbox that shows up the rows of an excel sheet i need to add a delete button to delete the selected row. i tried this

Private Sub CommandButton3_Click()
Dim i As Integer

For i = 0 To Range("A65356").End(xlUp).Row - 1
    If lstDisplay.Selected(i) Then
        Rows(i).Select
        Selection.Delete
    End If
Next i
End Sub

but when i try to delete for example the the row 10 it’s the 9 that gets deleted it always delets the line before the one selected

any fix ???

Thanks everyone

BigBen's user avatar

BigBen

43.9k6 gold badges27 silver badges40 bronze badges

asked Sep 18, 2019 at 12:47

TenEM's user avatar

2

I’ll have to test this myself, but I guess something along the lines of:

Private Sub CommandButton3_Click()

Dim i As Long, rng As Range
With Me.lstDisplay
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            If Not rng Is Nothing Then
                Set rng = Union(rng, Sheets("Sheet1").Rows(i + 1))
            Else
                Set rng = Sheets("Sheet1").Rows(i + 1)
            End If
        End If
    Next i
End With

rng.EntireRow.Delete

End Sub

That way you’ll only have to perform deleting rows once.

Btw, I anticipated a multiselect listbox. If it’s not a multiselect it would simplify the code as there is no need to loop the listbox.

answered Sep 18, 2019 at 13:08

JvdV's user avatar

JvdVJvdV

66.6k8 gold badges38 silver badges68 bronze badges

I would suggest you this :

Private Sub CommandButton3_Click()
Dim i As Integer

For i = 1 To Range("A65356").End(xlUp).Row - 1
    If lstDisplay.Selected(i) Then
        Rows(i).Delete
        i = i - 1
    End If
Next i
End Sub

Also Note that Rows(i).Delete is exactly the same as Rows(i).Select Selection.Delete Excepted that Select should be avoided as much as possible

As said @BigBen :

You can use the «Option Base 1» declaration at the top of a code module to change the default lower bound to 1 instead of 0.
For exemple :

Option Base 1 

Dim arValues(10) As String       'contains 10 items (not 11)  

Option Base Doc Here

answered Sep 18, 2019 at 12:57

TourEiffel's user avatar

TourEiffelTourEiffel

3,9512 gold badges16 silver badges42 bronze badges

6

У меня есть список, не связанный ни с одним диапазоном.

Я хочу нажать на строку и удалить ее. Если я перейду через код ниже, ListBox1_Click() функция почему-то вызывается дважды по какой-то причине, и приложение выдает «неопределенную ошибку» при втором запуске

Весь мой код:

Private Sub ListBox1_Click()
    ListBox1.RemoveItem (ListBox1.ListIndex)
End Sub

Private Sub UserForm_Initialize()
    For i = 0 To 10
        ListBox1.AddItem ("A" & Str(i))
    Next i
End Sub

2018-02-26 16:54

1

ответ

Если вы сделаете кнопку об этом, тогда это решение будет вполне приемлемо:

Private Sub CommandButton1_Click()

    Dim cnt     As Long
    For cnt = Me.ListBox1.ListCount - 1 To 0 Step -1
        If Me.ListBox1.Selected(cnt) Then
            Me.ListBox1.RemoveItem cnt
            Exit Sub
        End If
    Next cnt

End Sub

2018-02-26 17:15

Другие вопросы по тегам

vba

Like this post? Please share to your friends:
  • Уголки для формата word
  • Удаление в excel при фильтре
  • Уголки для документов word
  • Удаление в excel повторяющиеся ячеек
  • Уголки для word скачать бесплатно