Ошибка списка «Не удалось установить свойство списка. Неверное значение свойства.» - PullRequest
0 голосов
/ 15 января 2019

У меня есть пользовательская форма со списком, текстовым полем и списком, а также кнопкой «Сохранить». Ниже мой код кнопки сохранения.

Private Sub cmdsave_Click()
Dim x As Integer
        x = Me.ListBox1.ListCount

If Me.cmbtrans.Value = "Debit" Then
    With Me.ListBox1
        .Enabled = True
        .ColumnCount = 13
        .ColumnWidths = "49.95 pt;10 pt;114.95 pt;10 pt;114.95 pt;10 pt;114.95 pt;10 pt;75 pt;10 pt;49.95 pt;10 pt;49.95 pt"
            .AddItem
            .List(x, 0) = Me.txtdate
            .List(x, 1) = "|"
            .List(x, 2) = Me.txtgrouphead
            .List(x, 3) = "|"
            .List(x, 4) = Me.txtcontrolhead
            .List(x, 5) = "|"
            .List(x, 6) = Me.cmbaccounthead
            .List(x, 7) = "|"
            .List(x, 8) = Me.cmbtrans
            .List(x, 9) = "|"
            .List(x, 10) = Me.txtamount
      End With

End If

End Sub

Показывает ошибку на уровне добавления предмета .List(x, 10) = Me.txtamount. тем не менее, он работает плавно, пока не добавится уровень предмета .List(x, 9) = "|".

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

1 Ответ

0 голосов
/ 15 января 2019

Метод массива, преодолевающий ограничение 10 столбцов

Метод .AddItem имеет ограничение и значение по умолчанию, равное 10 столбцам , которые могут быть созданы в списке (или комбинированном списке); List индексы начинаются с нуля, вы можете добавить только до .List(x, 9).

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

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

Оператор

A ReDim Preserve, однако, может быть выполнен только в его последнем измерении. Таким образом, вам придется использовать 2-мерный массив, в котором после индекса неизменяемого столбца следует индекс 'row', чтобы получить массив с правильным размером.

Трюк: Вместо того, чтобы переставлять этот массив и присваивать его обратно в свойство списка .List, вы можете использовать свойство .Column, которое уже принимает инвертированный (= транспонированный) порядок измерений .

Пример кода

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

Private Sub cmdSave_Click()
' Define a control names string to be used to append to Listbox1
  Const USEDCONTROLS$ = "txtdate,txtgrouphead,txtcontrolhead,cmbaccounthead,cmbtrans,txtamount"
  Dim x&, i&, v, myCtrls
  myCtrls = Split(USEDCONTROLS, ",")        ' create flat array myCtrls out of control names

  x = Me.ListBox1.ListCount                 ' get current list count

If Me.cmbtrans.value = "Debit" Then
  With Me.ListBox1
    .Enabled = True
    .ColumnWidths = "49.95 pt;10 pt;114.95 pt;10 pt;114.95 pt;10 pt;114.95 pt;10 pt;75 pt;10 pt;49.95 pt;10 pt;49.95 pt"
    .ColumnCount = 13

    If .ListCount > 0 Then
       ' [1] write existing listbox elements to array(column index, row index)
         v = .Column
       ' [2] increment to new row index x in 2nd (sic!) dimension
       '     as a ReDim Preserve can only change the last array dimension.
       '     (with the .Column property you are using the
       '     transposed counterpart of the .List property)
         ReDim Preserve v(UBound(v), x)
    Else
       ' [1-2] redimension array v the first time (no existing listbox values so long)
         ReDim v(.ColumnCount - 1, 0)           ' 13 counted columns equal a zerobased index of 12
    End If

    ' [3a] assign current values to array
      For i = 0 To UBound(myCtrls)
          v(i * 2, x) = Me.Controls(myCtrls(i))
      Next i
    ' [3b] write separators after each data input
      For i = 1 To UBound(v) - 1 Step 2: v(i, x) = "|": Next i

    ' [4] reassign array to listbox property .Column (~ transposed .List property)
    .Column = v
  End With

End If

End Sub
...