Почему данные формы пользователя не вводятся построчно? - PullRequest
0 голосов
/ 16 февраля 2019

Данные пользовательской формы перезаписываются, а не вводятся строка за строкой.

Я пробовал разные комбинации ActiveCell, Cell, Set и Range.Вытащить код из интернета для схожих целей и подправить не удалось.

Private Sub CheckOut_Click()

Dim xCell As Range
For Each xCell In ActiveSheet.Columns(1).Cells
If Len(xCell) = 0 Then
xCell.Select
Exit For
End If
Next

Range("B2").Value = TextBox1.Text
Range("C2").Value = TextBox2.Text
Range("D2").Value = ("OUT")
TextBox1 = ""
TextBox2 = ""

End Sub

Я хочу, чтобы каждая отправка в пользовательской форме заполняла новую строку, создавая список.Что на самом деле происходит, так это все, что записывается в строку 2.

Пожалуйста, дайте обратную связь голосами вниз и флажками.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Ваш код

Private Sub CheckOut_Click()

    Dim xCell As Range

    ' Loop through cells of first column. You can also use "A" instead of 1.
    ' Since you haven't used ActiveSheet with the ranges, it is also not
    ' needed here. It would be better to specify the worksheet e.g. "Sheet1".
    For Each xCell In ActiveSheet.Columns(1).Cells
        ' Check if length of value of current cell is 0.
        ' Usually 'If xCell = "" Then' is used.
        If Len(xCell) = 0 Then
            ' Select (Go to) current cell. What for?
            xCell.Select
            ' Exit the For Next loop. Will jump to 'Range("B2") ...'
            Exit For
        End If
    Next

    ' Write certain values to cells of 2nd row.
    Range("B2").Value = TextBox1.Text
    Range("C2").Value = TextBox2.Text
    Range("D2").Value = ("OUT")
    ' Clear the Text boxes.
    TextBox1 = ""
    TextBox2 = ""

End Sub

В двух словах, код проверит наличие пустой ячейки в столбце 1, выберет найденную ячейку (по неизвестной причине) и запишет некоторые данные в определенные ячейки в2-й строке и очистите значения текстовых полей.

Вопросы

Вы перебираете столбец 1. Когда найдена пустая ячейка, хотите ли вы записать значения в столбцы BD всначала обнаружили пустую строку или столбцы BD в той же строке, где была найдена пустая ячейка в столбце 1?

Пусто или то же самое?

Хотите, чтобы это происходило только один раз, когда пустоячейка была найдена или для всех найденных пустых ячеек в используемом диапазоне столбца 1?

Один раз или все?

Используемый диапазон столбца 1 будет, например, от A1 или ячейки, выбранной вами до последней использованной ячейки.
Вы можете вручную определить последнюю использованную ячейку с помощьювыбрав последнюю ячейку столбца 1 («A»), удерживая правую клавишу CTRL и нажимая ВВЕРХ.Это будет сделано в коде, но это просто для вас, чтобы иметь представление о том, что будет проверяться на наличие пустых ячеек, если вы хотите найти больше из них.

A1 или ...?

Вы должны ответить на эти вопросы в своем вопросе, который вы можете изменить, используя кнопку редактирования под ним.

Возможное решение

Private Sub CheckOut_Click()

    Dim xCell As Range  ' Current Cell in Column "A"
    Dim FER As Long     ' First Empty Row

    ' Loop through cells of Column "A".
    For Each xCell In Columns("A")
        ' Check if value of Current Cell is "".
        If xCell.Value = "" Then
            ' Select Current Cell. If necessary.
            xCell.Select
            ' Calculate First Empty Row using column "B".
            FER = Range("B" & Rows.Count).End(xlUp).Row + 1
            ' Write values to Target Cells in First Empty Row.
            Range("B" & FER).Value = TextBox1.Text
            Range("C" & FER).Value = TextBox2.Text
            Range("D" & FER).Value = ("OUT")
            ' Clear the Text boxes.
            TextBox1 = ""
            TextBox2 = ""
            Exit For ' Stop looping.
        End If
    Next

End Sub

Замечания

Как это могло бы иметь смысл?

Что, если OP не сообщил нам, что xCell.Select вызывает событие Selection Change, которое записывает значения в xCell и текстовые поля и ограничивает эток используемому диапазону столбца A?

0 голосов
/ 16 февраля 2019
Dim ws as Worksheet
Dim freeRow as long
Set ws = ActiveSheet 'Is it really necessary to use the active sheet?
freeRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row + 1 'End(xlUp) jumps to the next free cell

ws.Cells(freeRow, 2) = TextBox1.Text
ws.Cells(freeRow, 3) = TextBox2.Text
ws.Cells(freeRow, 4) = "OUT"
TextBox1.Text = ""
TextBox2.Text = ""

Обычно считается, что ".select" - это плохая практика, поскольку она может привести к странным / неприятным ошибкам - лучше использовать переменные (это делает ваш код более пригодным для повторного использования и менее подверженным ошибкам!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...