Excel vba список многоканальный многострочный список из 14 текстовых полей - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть пользовательская форма с 14 текстовыми полями, 2 командными кнопками «Далее», «Опубликовать» и 1 списком

Мне нужен код, чтобы снова получить данные из 14 текстовых полей в поле спискакогда пользователь вводит новые данные и нажимает затем эти данные, добавленные во вторую строку в поле списка, снова набирают

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

Sub CommandButton1_Click()

Dim arr1, i As Long
Dim arr2(0 To 0, 0 To 13)
arr1 = Array(TB10, TB10, TB0, tb1, cb1, cb2, tb5, tb4, TB10, TB10, TB10,  tb6, tb7, tb8)
For i = 0 To UBound(arr1)
    arr2(0, i) = arr1(i)
Next i
ListBox1.List = arr2

End Sub

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

1 Ответ

0 голосов
/ 30 декабря 2018

"... нужно добавить больше строк"

Обычно вы назначаете полный набор данных (d) свойству .List вашегоListBox1 (вы решили назвать его arr2).

Поскольку вы хотите увеличивать число содержащихся строк элементов с каждым событием CommandButton1_Click() и сохранять все существующие данные, теоретически вам потребуется увеличить 1-е измерение 2-мерного массива - но это невозможно сделать с помощьюReDim Preserve.

Чтобы преодолеть эту проблему, просто поменяйте местами размеры arr2, определив таким образом 14 значений столбцов в его первом измерении и измерение «строка» в качестве 2-го.Элемент управления listbox предлагает свойство .Column, которое вы можете использовать вместо обычного свойства .List для обратной записи всего набора данных (без необходимости преднамеренно перемещать строки и столбцы).

Примечание

Поскольку вы изменили код в OP, я предполагаю, что tb0, tb1, ... соответствуют перечисленным элементам управления TextBox.( Пожалуйста, измените несколько странный порядок в массиве элементов управления arr1 для своих нужд. )

Пример кода

Option Explicit                         ' declaration head of userform code module
Dim arr2()                              ' make arr2 values disponible for each CommandButton1_Click event

Sub CommandButton1_Click()
' declare/assign variables
  Dim arr1(), i As Long, nxt As Long
  arr1 = Array(tb0, tb1, tb2, tb3, tb4, tb5, tb6, tb7, tb8, tb9, tb10, tb11, tb12, tb13) ' <~~ Change order to your needs
' define index of next row in listbox
  nxt = Me.ListBox1.ListCount  ' ListCount automatically counts upper bound + 1
' a) you can only increment an array's last dimension, so ...
' b) redefine arr2 with new elements in its 2nd dimension
  ReDim Preserve arr2(0 To UBound(arr1), 0 To nxt)
' assign textbox and combobox values to arr2
  For i = 0 To UBound(arr1)
      arr2(i, nxt) = arr1(i)
  Next i
' reassign arr2 to the listboxes .Column property (instead of the .List property)
  ListBox1.Column = arr2
End Sub

Private Sub UserForm_Layout()
  With Me.ListBox1
       .ColumnCount = 14                                            ' define column count
       .ColumnWidths = "50;50;50;50;50;50;50;50;50;50;50;50;50;50"  ' <~~ change to your needs
  '    .Width = 50 * .ColumnCount + 16
  End With
End Sub

Разрешите мнепримечание: я думаю, что это отвечает на ваш первоначальный вопрос.Вы найдете достаточно примеров, как переместить данные обратно на лист, читающий сайт StackOverflow, но для этого потребуется сформулировать новый вопрос с кодом, показывающим, что вы уже пробовали - см. Как создать минимальное, полное,и проверяемый пример .

...