通过Excel中的UserForm将数据输入电子表格

use*_*306 0 excel vba excel-vba excel-2010

我是Excel中的VBA新手,我有一个基本的用户表单,用于将数据放入工作表.来自表格的数据是进入单元格B13到G13,然后每隔一个条目应该在下一行向下进行,例如B14-G14.

我已经有了这个代码,但是它没有将数据输入到正确的单元格中,而是在同一行重复输入...

     Private Sub CommandButton1_Click()

Dim lngWriteRow As Long

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")

lngWriteRow = ws.Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0).Row

If lngWriteRow < 13 Then lngWriteRow = 13

    ws.Range("B" & lngWriteRow) = TextBox1.Value
    ws.Range("C" & lngWriteRow) = TextBox2.Value
    ws.Range("D" & lngWriteRow) = TextBox3.Value
    ws.Range("E" & lngWriteRow) = ComboBox1.Value
    ws.Range("F" & lngWriteRow) = TextBox4.Value
    ws.Range("G" & lngWriteRow) = ComboBox2.Value

End Sub
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?(下面的行已有数据)

提前致谢

Joo*_*ook 5

这条线路错了:

lngWriteRow = ws.Cells(Rows.Count, 12) _
.End(xlUp).Offset(1, 0).Row
Run Code Online (Sandbox Code Playgroud)

因为您指的是第12列,您不会更改 - 因此行保持不变.

请改用它

lngWriteRow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你想要一个初始偏移,要启动数据输入@第13行,请使用:

lngWriteRow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row

if lngWriteRow < 13 then lngWriteRow = 13
Run Code Online (Sandbox Code Playgroud)

你不能使用Offset(12,0),因为你每次都会使用它!

编辑

为了清楚起见,当将代码粘贴为工作表宏并多次点击F5时,这里可以在空白页上工作.所以,除非有解释,这是错误的,我认为这个问题已经解决了.

Private Sub Test()

Dim lngWriteRow As Long

Dim ws As Worksheet
Set ws = Worksheets("Sheet1")

lngWriteRow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row

If lngWriteRow < 13 Then lngWriteRow = 13

    ws.Range("B" & lngWriteRow) = "test"
    ws.Range("C" & lngWriteRow) = "test"
    ws.Range("D" & lngWriteRow) = "test"
    ws.Range("E" & lngWriteRow) = "test"
    ws.Range("F" & lngWriteRow) = "test"
    ws.Range("G" & lngWriteRow) = "test"

End Sub
Run Code Online (Sandbox Code Playgroud)

编辑

经过一些邮寄,这里是解决这个谜语的方法:没有说明,那些下面有填充的细胞,应该进入.

所以对于col-B来说更像是

title-row
row13
row..
row..
row63
space
other stuff
Run Code Online (Sandbox Code Playgroud)

基本上建议的修正工作 - 但他们在整个工作表上寻找B列中最后一个填充的单元格,这就是问题所在.

这是解决方案:

lngWriteRow = ws.Cells(ws.Range("B12:B63")Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row
Run Code Online (Sandbox Code Playgroud)

并在路上给你一些解释:

您不能使用,(Rows.Count,1)而不是(Rows.Count,2),因为您在列BG中添加数据,即2-7.你必须使用2-7,因为你正在寻找最后一排.如果您使用1,则在尝试添加新数据时,您正在查找A列中的最后一个值,该值不会更改.

您无法使用Offset(12,0),因为每次插入数据时都会创建一个偏移量 - 因此您最终会分开12行的行.

最后,您无法使用Rows.Count,因为这是65536左右,并且您在要添加的数据下面有数据.End(xlUp)将从太远的地方查找,并停在B列的最后一个单元格中,其中包含数据 - 但这不是B13,除非B14-B65536中没有数据.

希望这有助于理解这里的动态.