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

Есть ли способ в 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 

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

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

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

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

  • Диалоговое окно WPF modess из надстройки MS Excel
  • Excel Noob Скопировать ячейку Excel в текстовое поле HTML
  • Excel: текстовое поле объекта не может выполнять возврат каретки в защищенных или незащищенных состояниях листа (w / Text Unlocked) ... почему?
  • Получение текста из хеш-таблицы текстовых полей
  • Присоединение текстового поля к точке или строке на диаграмме в Excel / VBA
  • Выделить текст в Userform TextBox
  • Как установить имя текстового поля как переменную и разрешить изменять имя в цикле?
  • Текстовое поле Excel ActiveX - количество символов или регистр изменений
  • Как активировать входной режим с VBA на текстовом поле неактивного x, вставленного в рабочий лист?
  • Получить значения для текстового поля из ячейки Excel в C #
  • Как установить текстовое поле в пользовательской форме для дробного значения?
  • Interesting Posts

    Преобразование формата даты и времени в текстовый формат в excel

    Итерации по коллекции

    Excel Macro для замены диакритических символов

    создавать несколько книг в определенном месте папки

    Функция Excel weeknum показывает неправильный номер недели?

    как программно создавать лист excel из шаблона excel?

    VBA стирает формат номера в местной валюте

    Как преобразовать n строк xlsx в csv в Python, сохраняя значения даты

    C # Не удается сохранить данные в текстовом поле, чтобы перенести документ

    Groovy POI создал ячейки, считанные пустыми другими программами, пока ENTER не будет нажат вручную в ячейках

    Отображение значения ячейки, основанной на значении Row другого. Отслеживание журналов

    Выравнивание таблицы, перенесенной в огурец из Excel

    Не удалось загрузить надстройку Excel 2003

    заполнять диапазон со значениями из одного столбца на основе значений в другом

    Excel VBA – получить значение ячейки как текст в формате RTF

    Давайте будем гением компьютера.