为什么不逐行输入用户表单数据?

时间:2019-02-15 21:27:20

标签: excel vba

用户表单数据正在覆盖自身,而不是逐行输入。

我尝试了ActiveCell,Cell,Set和Range的不同组合。从互联网上获取出于类似目的的代码并进行调整均未成功。

R

我希望用户表单中的每个提交都填充一个新行,以创建一个列表。实际发生的是所有内容都写入第2行。

请以不赞成票和旗帜给反馈。

2 个答案:

答案 0 :(得分:2)

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”是一种不好的做法,因为它可能导致奇怪/令人讨厌的错误-而不是使用变量(这会使您的代码更具可重用性,并且不易出错!)

答案 1 :(得分:0)

您的代码

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列中是否有空单元格,将选择找到的单元格(原因不明),并将一些数据写入第二行的某些单元格并清除文本框的值

问题

您遍历第1列。找到一个空单元格后,是否要将这些值写入找到的第一个空行中的BD列或写入第1列中的空单元格的同一行中的BD列?

是空还是相同?

您是否只希望在发现一个空单元格或在使用的第1列范围内为所有找到的空单元格发生一次?

一次还是全部?

第1列的使用范围例如A1或您选择上一个使用的单元格。
您可以通过选择第1列的最后一个单元格(“ A”)并按住RIGHT CTRL并按UP来手动确定最后使用的单元格。这将在代码中完成,但是如果您要查找更多的空单元格,这只是您的视觉检查。

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和文本框并将其限制为{ {1}}?