Автоматическое создание текстовых полей на основе количества строк

Есть ли способ в VBA Excel Userform автоматически создавать текстовые поля в пользовательской форме на основе количества строк на конкретном листе?

Мои данные указаны в Листе 1, начиная с A1, являясь:

  • A1: Дата выставления счета
  • B1: номер счета-фактуры
  • C1: сумма счета
  • D1: полученная оплата

Теперь есть много строк данных (счетов), и нет способа узнать, сколько строк связано с конкретным клиентом. Полученные текстовые поля «Платежи» будут пустыми, когда пользовательская форма загрузится, пока дата счета, номер счета и сумма счета будут взяты из листа 1.

Тогда было бы очень легко заполнить оплаченные полученные текстовые боксы, которые могут быть применены к конкретному счету.

Предположим, что форма с именем «frmMain», чтобы добавить 4 текстовых блока, должна выполнить следующую подпрограмму:

Private Sub AddTextBoxes() Dim ctlTextBox As MSForms.TextBox Dim intCol, intCols As Integer Dim strCName As String ' Determine number of columns intCols = 1 Do While Worksheets("Sheet1").Cells(1, intCols).Value <> "" intCols = intCols + 1 Loop ' Add text boxes For intCol = 1 To intCols - 1 strCName = "txtC" & intCol Set ctlTextBox = frmMain.Controls.Add("Forms.Textbox.1", strCName) With ctlTextBox .Top = 10 .Width = 50 .Height = 20 .Left = (intCol) * 60 .Value = intCol End With Next ' Assuming there is a column 1 (ie "Invoice Data") the control name will be "txtC1" ' This box can be set by: frmMain.Controls("txtC1").Value = 999 End Sub 

В дополнение к вышесказанному добавьте фрейм в frmMain, называемый «fmeMain», и установите для fmeMain следующие свойства:

ScrollBars = 2 – fmScrollBarsVertical ScrollHeight = 800

Добавьте команду frmMain, называемую «cmdTest». Добавьте к модулю frmMain следующие подпрограммы:

 Private Sub AddTextBoxes() Dim ctlTextBox As MSForms.TextBox Dim intCol, intRow, intTop As Integer Dim strCName As String intTop = 10 For intRow = 2 To 31 ' Assumes that row 1 contains header For intCol = 1 To 3 strCName = "txtC" & intCol & "R" & intRow Set ctlTextBox = frmMain.Controls("fmeMain").Add("Forms.Textbox.1", strCName) With ctlTextBox .Top = intTop .Width = 50 .Height = 20 .Left = 52 * intCol .Value = Worksheets("Sheet1").Cells(intRow, intCol).Value End With Next intTop = intTop + 25 Next End Sub Private Sub cmdTest_Click() AddTextBoxes End Sub 

Если у вас есть таблица вроде этого:

введите описание изображения здесь

Вы можете добавить обработчик кликов к кнопке «Показать форму»:

 Sub FormButton_Click() TestForm.Show End Sub 

И внутри кода TestForm:

 Option Explicit Const dateCol = 1 Const invoiceNumCol = 2 Const amountCol = 3 Const paymentCol = 4 Private Sub SaveButton_Click() Dim row As Range Dim box As Control For Each row In ActiveSheet.Rows On Error GoTo ExitHandler row.Cells(1, paymentCol).value = Me.Controls(row.row & paymentCol).value Next row ExitHandler: Exit Sub End Sub Private Sub UserForm_Initialize() Dim row As Range For Each row In ActiveSheet.Rows If row.Cells(1, dateCol).value = "" Then Exit For End If Call AddBox(row, dateCol) Call AddBox(row, invoiceNumCol) Call AddBox(row, amountCol) Call AddBox(row, paymentCol) Next row End Sub Private Sub AddBox(row, colIndex) Dim box As Control Const width = 50 Const padWidth = width + 4 Const height = 15 Const padHeight = height + 4 Const topMargin = 25 Const leftMargin = 5 Set box = Me.Controls.Add("Forms.TextBox.1", row.row & colIndex) box.Left = (colIndex - 1) * padWidth + leftMargin box.height = height box.width = width box.Top = (row.row - 1) * padHeight + topMargin box.value = row.Cells(1, colIndex).value End Sub 

Форма будет выглядеть следующим образом:

введите описание изображения здесь

Значения могут быть введены в столбец «Платный», и они будут скопированы в электронную таблицу при нажатии кнопки «Сохранить».

Чтобы объяснить логику, она проходит через каждую заполненную строку, создает соответствующие элементы управления и заполняет значения. В процедуре «Сохранить» строки снова зацикливаются, а значения оплаты копируются обратно в электронную таблицу.

  • Управление данными из текстового поля и значений инвертированного дня / месяца
  • Excel VBA - Shapes Текстовое поле OnChange событие
  • Размер текста Excel / PowerPoint после сжатия
  • Имя свойства динамически созданных текстовых полей
  • Как выбрать данные в TextBox или ListBox, а затем отправить электронную почту через Outlook на основе этих данных
  • Excel - изменение BackColor текстовых полей UserForm и ComboBoxes с помощью VBA
  • Удалить строку из текстового поля, форм и т. Д., Которые могут быть сгруппированы
  • Добавить прослушиватель событий в текстовое поле Excel (потерять фокус)
  • Excel: текстовое поле объекта не может выполнять возврат каретки в защищенных или незащищенных состояниях листа (w / Text Unlocked) ... почему?
  • Excel Noob Скопировать ячейку Excel в текстовое поле HTML
  • VBA - Как я могу дать код ошибки на основе суммы моих значений текстового поля в форме пользователя?
  • Давайте будем гением компьютера.