Автоматическое создание текстовых полей на основе количества строк
Есть ли способ в VBA Excel Userform автоматически создавать текстовые поля в пользовательской форме на основе количества строк на конкретном листе?
Мои данные указаны в Листе 1, начиная с A1, являясь:
- A1: Дата выставления счета
- B1: номер счета-фактуры
- C1: сумма счета
- D1: полученная оплата
Теперь есть много строк данных (счетов), и нет способа узнать, сколько строк связано с конкретным клиентом. Полученные текстовые поля «Платежи» будут пустыми, когда пользовательская форма загрузится, пока дата счета, номер счета и сумма счета будут взяты из листа 1.
- Как я могу суммировать значение в 8 текстовых файлах с одним текстовым полем?
- Excel 2010 не может вставляться в текстовое поле формы
- Использование пользовательской формы VBA в Excel 2011 на Mac (запрограммировано в Windows): текстовое поле не работает
- Имя свойства динамически созданных текстовых полей
- Excel VBA - Shapes Текстовое поле OnChange событие
Тогда было бы очень легко заполнить оплаченные полученные текстовые боксы, которые могут быть применены к конкретному счету.
- VBA выводит значение ComboBox в следующую свободную ячейку в столбце
- Excel VBA; UserForm, запуск одного фрагмента кода для разных значений TextBox
- Excel - изменение BackColor текстовых полей UserForm и ComboBoxes с помощью VBA
- Передайте значение текстового поля UserForm в ячейку
- Создание текстового поля для запуска формулы VBA
- Удалить строку из текстового поля в слайде PowerPoint из папки - Компонент Error ActiveX не может создать объект
- Копирование / управление форматированным текстом в текстовых блоках в Excel 2013 с использованием VBA
- Возьмите текстовое поле и перейдите в определенную ячейку.
Предположим, что форма с именем «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
Форма будет выглядеть следующим образом:
Значения могут быть введены в столбец «Платный», и они будут скопированы в электронную таблицу при нажатии кнопки «Сохранить».
Чтобы объяснить логику, она проходит через каждую заполненную строку, создает соответствующие элементы управления и заполняет значения. В процедуре «Сохранить» строки снова зацикливаются, а значения оплаты копируются обратно в электронную таблицу.