【问题标题】:Entering Data into a spreadsheet through a UserForm in Excel通过 Excel 中的用户窗体将数据输入电子表格
【发布时间】:2012-11-20 11:40:58
【问题描述】:

我是 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

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

提前致谢

【问题讨论】:

  • 您应该删除其他问题并在此处进行编辑。你对我给你的解决方案有什么问题?它完成了您最初的要求 - 那么,发生了什么变化?!
  • @Jook,实现类似NextRow = Cells(Rows.Count, "A").End(xlUp).Row + 1 的东西,它应该总是转到下一行。
  • @t.thielemans 我认为他的问题不在于下一行,而是从第 13 行开始,然后转到下一行以获取更多数据。
  • @Jook,我认为他的意思是如果他运行它将填充第 13 行(或他从任何行开始)的列,但如果他再次运行它,它将覆盖当前数据,因为起始位置是固定的。所以我看到它的方式:他运行这个第 13 行被填满,再次运行它,第 14 行被填满,等等。

标签: vba excel excel-2010


【解决方案1】:

这里的这一行是错误的:

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

编辑:

如果您想要一个 initial 偏移量,以在第 13 行开始数据输入,请使用:

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

if lngWriteRow < 13 then lngWriteRow = 13

你不能使用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

编辑

经过一些邮件,这里是这个谜题的解决方案:没有说明,那些下面有填充的单元格,应该输入。

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

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

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

解决方法如下:

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

顺便给你解释一下:

您不能使用(Rows.Count,1) 代替(Rows.Count,2),因为您要在B-G 列中添加数据,即2-7。由于方式,您必须使用 2-7,您正在寻找最后一行。如果您使用 1,则您正在寻找 A 列中的最后一个值,当您尝试添加新数据时,该值不会改变。

您不能使用Offset(12,0),因为这会在您每次插入数据时创建一个偏移量 - 所以您最终会得到相隔 12 行的行。

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

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

【讨论】:

  • +1 用于添加检查以确保值不低于 13 ;)
  • 这不起作用,它仍然只会将它放在同一个单元格中
  • @user1662306 那么一定有别的东西,我测试了这个,工作正常。
  • 我已经编辑了原始问题。代码看起来正确吗?
  • @user1662306 不,您仍在使用Offset(12,0)(Rows.Count, 1)
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多