Страницы: 1
RSS
Заполнение таблицы на листе данными из UserForm
 
Здравствуйте. Помогите пожалуйста. 1. При нажатии на кнопку CommandButton1 ("Ввод данных в базу"), расположенную на UserForm1, данные на листе "База" вносятся не в 6 строку, а в 7. Как это исправить? 2. Как сцепить текст из ComboBox1, ComboBox2, ComboBox3, ComboBox4, TextBox1, расположенные на UserForm4, между собой через ", " и вставить полученный результат в TextBox9 расположенный на UserForm1 через кнопку CommandButton1 ("Ввод данных") расположенную на UserForm4?
 
Ad1) Например:

Код
    Dim ksv&
    'ksv = Sheets("База").UsedRange.Rows.Count + 1
    With ThisWorkbook.Sheets("База")
        ksv = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
    End With

Редакт.:


У вас есть "ListObject" на листе, я не заметил этого раньше:
Код
    With ThisWorkbook.Sheets("База")
        'ksv = .ListObjects("Таблица1").Range.Rows.Count + 4 '? надо проверить
        'ksv = .ListObjects("Таблица1").ListRows.Count + 5 '? надо проверить
        ksv = .ListObjects("Таблица1").DataBodyRange.Rows.Count + 5
    End With

Вместо:
Код
    Range("Baza!B" & ksv).Value = TextBox1.Value
    '...
    Range("Baza!R" & ksv).Value = ComboBox1.Value
можно:
Код
    Dim i As Integer
    With ThisWorkbook.Sheets("База")
        For i = 2 To 13
            .Cells(ksv, i).Value = Me.Controls("TextBox" & i - 1).Value
        Next
        For i = 15 To 17
            .Cells(ksv, i).Value = Me.Controls("TextBox" & i - 2).Value
        Next
        .Range("R" & ksv).Value = Me.ComboBox1.Value
    End With

Вместо:
Код
    TextBox1.Value = ""
    '...
    ComboBox1.Value = ""
можно:
Код
    For i = 1 To 15
        Me.Controls("TextBox" & i).Value = ""
    Next
    Me.ComboBox1.Value = ""

Будет немного короче в коде.
Изменено: ocet p - 25.12.2019 03:05:43
 
вносятся не в 6 строку, а в 7. Как это исправить?
1. Выполнять своё задание самому
2. Даже не глядя в пример простой ответ: заменить 6 на 7
Цитата
2. Как сцепить текст из ComboBox1, ComboBox2, ComboBox3, ComboBox4, TextBox1?
смотри &
Цитата
ставить полученный результат в TextBox9Через кнопку CommandButton1
Вписать в событие  нажатия кнопки что-то типа назначения
TextBox9=
Вроде доступно и подробно ответил
 
ocet p, респект Вашему коду. :)  
Код
Dim i As Integer    With ThisWorkbook.Sheets("База")
        For i = 2 To 13
            .Cells(ksv, i).Value = Me.Controls("TextBox" & i - 1).Value
        Next

Часто применяю в формах и пишу длинный код, а теперь можно сократить.
Но у меня  возник вопрос , как будет выглядеть код если применять не TextBox1.TextBox2 и тд.,а txt_Время, txt_ДатаОтгрузки, txt_Количество и т.д.?

Цитата
Бобровский написал:
Как сцепить текст из ComboBox1, ComboBox2, ComboBox3, ComboBox4, TextBox1, расположенные на UserForm4, между собой через ", " и вставить полученный результат в TextBox9 расположенный на UserForm1 через кнопку CommandButton1 ("Ввод данных") расположенную на UserForm4?
как вариант
Код
Private Sub CommandButton1_Click()
 With UserForm1
     .TextBox9 = Me.ComboBox1.Text & "," & Me.ComboBox2.Text & "," & Me.ComboBox3.Text & "," & Me.ComboBox4.Text & "," & Me.TextBox1.Text
 End With
      Unload Me
     UserForm1.Show
End Sub
[CODE][/CODE]У вас заполнен только один комбобокс,последующие пусты.
Изменено: Logistic - 25.12.2019 21:07:53
 
Немного не по теме, но классы творят чудеса   ;)
Немного переработал код UserForm1, может пригодится, можно сравнить с кодом из файла первого сообщения  ;)
Все работает абсолютно идентично. А по теме можно воспользоваться функцией Join, загнать данные либо прямо в TextBox, либо через переменную String, это кому как нравится.
Изменено: Nordheim - 25.12.2019 21:51:16
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, а если не использовать модули классов . Применять textBox с разными именами(txt_Дата, txt_Наименование). Как код прописать?
 
Logistic, Покажите пример кода. Что именно нужно делать с разноименными контролами?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Logistic написал:
код если применять не TextBox1.TextBox2 и тд.,а txt_Время, txt_ДатаОтгрузки, txt_Количество и т.д.?
Например:
Код
    Dim ctrl
    
    ctrl = Array("TextBox1", "TextBox4", "TextBox6", "TextBox8", "TextBox10", "TextBox11", "TextBox12", "TextBox15")
    
    For i = LBound(ctrl) To UBound(ctrl)
        MsgBox Me.Controls(ctrl(i)).Value
    Next


пс:
Бобровский имеет такие конструкции ( UserForm1.Controls("TextBox" & i) ) в коде, например, в ListBox1_DblClick
Изменено: ocet p - 26.12.2019 01:41:16
 
ocet p, Logistic, Nordheim, Спасибо за проделанную работу. Открыли, посмотрели, подправили. Учёл все замечания по коду, подправил. Но ... блин :( не заполняет в таблице на листе, у меня, первую строку после шапки. Забыл уточнить, таблица заполняется по мере ввода новых клиентов.
Код
With ThisWorkbook.Sheets("База")
        'ksv = .ListObjects("Таблица1").Range.Rows.Count + 4 '? надо проверить
        'ksv = .ListObjects("Таблица1").ListRows.Count + 5 '? надо проверить
        ksv = .ListObjects("Таблица1").DataBodyRange.Rows.Count + 5
    End With

Выше указанный код, заполняет всё время только одну строку(
 
Доброе утро.
Прикладываю файл  в котором эл.управления названия : TextBox1.2.3.4..Combobox1.Combobox2 и названия: txtДата,txtНомер и т.д.
Как прописать код для обоих вариантов .Заранее благодарен
 
Для циклической очистки:
Один из вариантов в сообщении 8 от ocet p,
Второй вариант - создать для нужных элементов контейнер Frame (в файле примере)
Третий вариант - заполнить Tag нужными значениями и в цикле условие по этим значениям, но  придется "пробегать" по всем контролам.
Изменено: Nordheim - 26.12.2019 09:39:36
"Все гениальное просто, а все простое гениально!!!"
 
Код
ksv = .ListObjects("Таблица1").Range.Row + .ListObjects("Таблица1").ListRows.Count +1
 
Nordheim, спасибо.Буду разбираться. ;)  
 
Logistic, я обычно делаю так
Код
Private Sub CommandButton1_Click()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If Mid(ctrl.Name, Len(ctrl.Name) - 2, 1) = 1 Then
            ctrl.Value = "Элемент гр.1"
        ElseIf Mid(ctrl.Name, Len(ctrl.Name) - 2, 1) = 2 Then
            ctrl.Value = "Элемент гр.2"
        ElseIf Mid(ctrl.Name, Len(ctrl.Name) - 2, 1) = 3 Then
            ctrl.Value = "Элемент гр.3"
        ElseIf Mid(ctrl.Name, Len(ctrl.Name) - 2, 1) = 4 Then
            ctrl.Value = "Элемент гр.4"
        End If
    Next
End Sub
 
RAN, А почему If..Then...ElseIf, а не Select Case?
Изменено: Nordheim - 26.12.2019 12:52:37
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, потому, что так захотелось левой задней ноге.  :D
Других причин нет.
 
RAN, с таким вариантом, как вы предложили  столкнулся впервые. А  как вывести данные с формы на лист?
Изменено: Logistic - 26.12.2019 12:56:34
 
:)
 
RAN, благодарю Вас  .  :D  
 
Цитата
Бобровский написал:
Но ... блин ... :( ...  не заполняет в таблице на листе, у меня, первую строку после шапки
:) Зачем блин а не пельмени ? ... :) .... У нас на, тот пример, теперь пельмени и борщ ...  :)

Вы можете также сделать это таким образом:
Код
    Dim ksv&, i%, prov$
    
    With ThisWorkbook.Sheets("База")
        ksv = .ListObjects("Таблица1").ListRows.Count
        prov = Trim(Join(Application.Index(.Range("A5").Offset(ksv, 0).Resize(1, 3).Value, 0), ""))
    End With
    
    If prov = "" Then ksv = 5 + ksv - 1 Else ksv = 5 + ksv
    
    With ThisWorkbook.Sheets("База")
        For i = 2 To 13
            .Cells(ksv + 1, i).Value = ...
        Next
        For i = 15 To 17
            .Cells(ksv + 1, i).Value = ...
        Next
        .Range("R" & ksv + 1).Value = ...
    End With
    '...

... но я не проверял это "от начала до конца" ...
Страницы: 1
Наверх