Страницы: 1
RSS
Подсчет количества значений в ListBox
 
Здравствуйтуе. В ListBox1 представлен список из двух колонок. Подскажите пожалуйста как подсчитать количество строк каждого типа по второму столбцу и присвоить им переменные.
 
Цитата
Дмитрий Ч написал:
и присвоить им переменные
значит каким образом ?
в массив, словарь и т. д. ?
 
В данном случае их нужно вывести в тектбоксы на форме
Например переменная n1 - это количество строк типа 111, n2 - соответственно кол-во типа 222
 
Например так:
Код
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim a&, DC As Object, arr()
arr = ListBox1.List
Set DC = CreateObject("Scripting.Dictionary")
For a = LBound(arr) To UBound(arr)
  If Not DC.exists(arr(a, UBound(arr, 2))) Then
    DC.Item(arr(a, UBound(arr, 2))) = 1
  Else: DC.Item(arr(a, UBound(arr, 2))) = DC.Item(arr(a, UBound(arr, 2))) + 1
  End If
Next
arr = DC.keys
For a = 0 To UBound(arr)
  Select Case arr(a)
    Case Is = 111: TextBox1 = DC.Item(arr(a))
    Case Is = 222: TextBox2 = DC.Item(arr(a))
    Case Is = 333: TextBox3 = DC.Item(arr(a))
  End Select
Next
End Sub
Изменено: Anchoret - 14.02.2019 08:49:56
 
Anchoret, спасибо Вам огромное. А как сделать чтобы значения менялись не по даблклику а при изменении данных в листбоксе
 
Дмитрий Ч, выбрать обработчик событий листбокса
 
Anchoret, неверные данные попадают в текстовые поля, например увеличьте количество вхождений для "333" и проверьте - это потому, что данные не отсортированы.
 
Anchoret, погонял Ваш макрос.Код считает количество первых значений в столбце и заносит их в первый по номеру текстбокс, затем когда встречает другое значение считает их количество и заносит в следующий по номеру текстбокс. Т.е. значения не связаны с текстбоксами. Но значения в листбоксе могут быть произвольными и каждое значение должно попадать в свой текстбокс. Так и не понял как исправить код, чтобы конкретному значению соответствовал свой текстбокс.
 
Дмитрий Ч, конкретно для вашего примера:
Код
Sub st()
    Dim Rn As Range
    Set Rn = Range("B2", Cells(Rows.Count, 2).End(xlUp))
    With UserForm1
        .TextBox1.Text = WorksheetFunction.CountIf(Rn, 111)
        .TextBox2.Text = WorksheetFunction.CountIf(Rn, 222)
        .TextBox3.Text = WorksheetFunction.CountIf(Rn, 333)
        .Show 0
    End With
End Sub
 
Цитата
Дмитрий Ч написал:
чтобы значения менялись не по даблклику а при изменении данных в листбоксе
А как эти значения должны быть обновлены ?
Из рабочего листа или из списка, что будет предметом изменения ?
В вашем коде есть "UserForm1.Show 0" - поэтому неизвестно, с кода (ListBox1) или с листа ?
 
Цитата
ocet p написал:
А как эти значения должны быть обновлены ?
В листбокс данные попадают из другого листбокса. Значит обновление должно быть по событию изменения значений в листбоксе на форме
 
Михаил Витальевич С.,спасибо. Но это немного не то. Вы диапазон берете с листа, а нужно из второго столбца листбокса.
 
Количество уникальных значений всегда равно количеству TextBox(ов)? Если нет, то по какому алгоритму программе узнать в какой TextBox выводить тот или иной итог?
"Все гениальное просто, а все простое гениально!!!"
 
Да кол-во укикальных будет всегда равно кол-во текстбоксов. Каждому уникальному соответствует свой текстбокс. Тут смысл даже не в текстбоксах, а в присвоении этим уникальным переменных, т.к. они будут в дальнейшем использоваться.  
 
Можно так.
"Все гениальное просто, а все простое гениально!!!"
 
ocet p, согласен.
Дмитрий Ч, см. измененный код выше или вариант от Nordheim,  (а могли бы и сами догадаться)
 
Nordheim,спасибо. Но чёт не понял смысл кнопки. Действия у неё нет. Если данные на листе обновить, все равно нужно форму закрыть и открыть чтобы обновился лист бокс. Но это не суть. Нужны просто переменные. Количество уникальных 111 - это переменная n1 (например) ну и т.д.
 
Цитата
Дмитрий Ч написал:
Но чёт не понял смысл кнопки
Удалите или добавьте код заполнения списка с листа.
Цитата
Дмитрий Ч написал:
Если данные на листе обновить, все равно нужно форму закрыть и открыть чтобы обновился лист бокс
Данные можно изменять не закрывая форму.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Дмитрий Ч написал:
Количество уникальных 111 - это переменная n1 (например) ну и т.д.
Для чего переменные если можно брать данные из TextBox(а) - TextBox.Value
Либо сделать массив а не отдельные переменные и работать со значениями массива.
Изменено: Nordheim - 14.02.2019 09:29:27
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1
Наверх