Автоматическое создание текстовых полей на основе количества строк
Есть ли способ в VBA Excel Userform автоматически создавать текстовые поля в пользовательской форме на основе количества строк на конкретном листе?
Мои данные указаны в Листе 1, начиная с A1, являясь:
- A1: Дата выставления счета
- B1: номер счета-фактуры
- C1: сумма счета
- D1: полученная оплата
Теперь есть много строк данных (счетов), и нет способа узнать, сколько строк связано с конкретным клиентом. Полученные текстовые поля «Платежи» будут пустыми, когда пользовательская форма загрузится, пока дата счета, номер счета и сумма счета будут взяты из листа 1.
- Код устранения неполадок для макросов и текстовых полей
- Ограничение текстовой строки VBA в текстовом поле
- Стрелка в текстовом поле пользовательской формы, VBA
- Форматирование текстовых полей в форме пользователя
- Как получить доступ к текстовому блоку, размещенному на листе в модуле VBA?
Тогда было бы очень легко заполнить оплаченные полученные текстовые боксы, которые могут быть применены к конкретному счету.
- Очистка строки, при выборе элемента в текстовом поле, из текстового поля и исходного листа
- Дублируйте то, что находится в текстовом поле в других текстовых блоках на других листах
- Назначение значений текстового поля соответствующим ячейкам на основе имени
- Текстовое поле ActiveX на листе листа Excel заменяет границу и шрифт при утрате фокуса
- Как загрузить значения ячейки Excel в пустые текстовые поля в графическом интерфейсе tkinter после того, как файл был выбран и «Открыть файл» и загружен?
- сохранение данных в текстовом поле для Excel в vb.net
- Добавление текстовых и текстовых значений в ячейку
- Неверное текстовое поле в форме 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
Форма будет выглядеть следующим образом:
Значения могут быть введены в столбец «Платный», и они будут скопированы в электронную таблицу при нажатии кнопки «Сохранить».
Чтобы объяснить логику, она проходит через каждую заполненную строку, создает соответствующие элементы управления и заполняет значения. В процедуре «Сохранить» строки снова зацикливаются, а значения оплаты копируются обратно в электронную таблицу.