Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | MSForms


Rambler's Top100


Counter CO.KZ


    [1] [2] [2/1] [2 t] [3] [4]

  1. Как изменить значение выделенного элемента списка ListBox ? 09.03.2011
  2. Как при добавлении данных в Listbox, программно выделить последнюю введенную строку ? 25.03.2012
  3. Как при использовании свойства .List избежать ошибки, если источник данных, это единственная ячейка ? NEW 01.04.2017
    [1] [2] [2/1] [2 t] [3] [4]


  • Ответ :

    Если Вам необходимо менять значение выделенного, с помощью двойного клика, элемента списка, то в таком случае можно использовать нижеопубликованный код :
  • Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        With ListBox1
             If .ListIndex > -1 Then _
                .List(.ListIndex) = InputBox("Введите новые данные", "")
        End With
    End Sub
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        If ListBox1.ListIndex > -1 Then _
        ListBox1.List(ListBox1.ListIndex) = InputBox("Новый текст")
    End Sub
    Обратите внимание на то, что отказ от ввода нового текста, т.е. нажатие кнопки Отмена или Закрыть [X], а также отсутствие замещающего текста, приведёт к удалению прежних данных. Если это недопустимо и в подобных случаях - нужно сохранить старый текст, то используйте любой из двух вариантов :
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        With ListBox1
             If .ListIndex > -1 Then
                iText$ = InputBox("Введите новый текст", "ListBox1")
                If iText$ <> "" Then .List(.ListIndex) = iText$
             End If
        End With
    End Sub
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        With ListBox1
             iSelIndex& = .ListIndex
             If iSelIndex& > -1 Then
                iText$ = InputBox(Prompt:="Новый текст :", _
                Title:="Старый текст : " & .List(iSelIndex&))
                If iText$ <> "" Then .List(iSelIndex&) = iText$
             End If
        End With
    End Sub
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        With ListBox1
             iSelIndex& = .ListIndex
             If iSelIndex& > -1 Then
                iText$ = InputBox("Введите новые данные", "ListBox1")
                .List(iSelIndex&) = IIf(Len(iText$), iText$, .List(iSelIndex&))
             End If
        End With
    End Sub
    Примечание : Если подобные действия необходимо осуществлять в списке с несколькими столбцами, то Вы вправе указать столбец, в котором нужно произвести замену, используя второй(необязательный) аргумент свойства List(Row, Column), не забывая при этом, что отсчёт столбцов (равно как и строк) начинается с 0.

    Комментарий : Применение функции InputBox [FAQ4] для ввода замещающего текста не является обязательным условием и Вы можете заменить её, к примеру, на текстовое поле или поле со списком (если ввод нового текста должен быть ограничен неким перечнем)
  • Ответ :

    Если при добавлении данных в поле со списком (ListBox), Вам необходимо программно сдвинуть полосу прокрутки (Scroll) и выделить последнюю введенную строку, то используйте следующий синтаксис :
  • ListBox1.ListIndex = ListBox1.ListCount - 1
    With ListBox1
         .ListIndex = .ListCount - 1
    End With
    Комментарий : Разумеется, выделять последнюю строку, следует только после добавления всех необходимых строк.
  • Ответ :

    Если Вы заполняете ListBox/ComboBox с помощью свойства List , то, возможно, замечали, что если источником данных является одна единственная ячейка, то возникает ошибка. И это правильно, ибо при использовании свойства .List мы просто обязаны использовать массив, а значение одной ячейки - это НЕ массив.
  • Private Sub TestIsArray()
        MsgBox IsArray(Range("A1:A2").Value)
        MsgBox IsArray(Range("A1:A1").Value)
    End Sub
    Однако, если использовать следующие два варианта, то Вы сможете и избежать такой ошибки и избавиться от необходимости использования метода .AddItem, вкупе с предварительной очисткой.

    Вариант I.
    Dim iArr As Variant
    iArr = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Value
    
    ListBox1.List = IIf(IsArray(iArr), iArr, Array(iArr))
    
    Вариант II.
    ListBox1.List = Range(Cells(1, 1), Cells(Rows.Count, 2).End(xlUp)).Value
    
    А второй столбец - просто скрыть. Cделать это можно, если изменить значение свойства ColumnCount = 1, либо установить ширину второго столбца = 0, например, ColumnWidths = 100;0

    Примечание : Если Вам необходимы данные самого последнего столбца рабочего листа (что маловероятно, но тем не менее), то "захватите" данные не следующего столбца, а предыдущего, который нужно будет скрыть, также использовав свойство ColumnWidths, например, 0;100


    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

    © 2004-2017 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff