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)
我怎么做到这一点?(下面的行已有数据)
提前致谢
这条线路错了:
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中没有数据.
希望这有助于理解这里的动态.