通过Excel中的UserForm将数据input到电子表格中

我是Excel中的VBA新手,我有一个基本的用户表单,它将数据放入工作表中。 表单中的数据是在单元格B13到G13中input的,然后每隔一个条目在下一行完成,例如B14-G14。

我已经有这个代码,但它没有input数据到正确的单元格,并重复input它在同一行…

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 

我将如何实现这一目标? (下面的行已经有数据)

提前致谢

这行这里是错误的:

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

因为你指的是第12栏,你没有改变 – 因此这一行保持不变。

改用这个

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

编辑:

如果你想要一个初始的偏移量,启动数据input@行13,使用这个:

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

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

编辑

为了清楚起见,这里在一张空白纸上工作,当代码作为工作表macros被粘贴,并多次触碰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 

编辑

经过一些邮寄后,这里就是解决这个谜题的方法:没有说明,那里面有填满的单元格,这些单元格应该被input。

所以对于col-B更像

 title-row row13 row.. row.. row63 space other stuff 

基本上build议的更正工作 – 但他们寻找在整个工作表B列最后填充单元格,这是问题。

这是解决scheme:

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

在路上给你一些解释:

您不能使用(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中没有数据。

希望这有助于理解这里的dynamic。