Метод массива, преодолевающий ограничение 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