【发布时间】:2017-03-25 06:15:24
【问题描述】:
我已经为工作人员编写了一个用户表单,用于输入被没收物品的数据,打印出该表单的副本并保存所有输入的数据。
这 2 年来一直运作良好,但现在宇宙为我提供了一个更大更好的白痴。显然,行已从工作表中删除,以便某人可以将项目退回给某人而无需留下任何记录。
现在 - 任何输入到表单的数据都会覆盖之前的行。每个新输入都会覆盖更高(旧)的另一行。我正在使用以下几行来查找下一个空行并在工作表上输入数据。它写了 5 行相同的数据,因为下面的代码现在连续写了 5 次。
我看不到错误在哪里 - 或者不了解删除工作表上的行会产生什么影响或更改用户窗体上的代码?
' WRITE DATA TO SPREADSHEET
emptyRow = WorksheetFunction.CountA(Range("F:F")) + 1
RowCount = Worksheets("Sheet1").Range("A2").CurrentRegion.Rows.Count
With Worksheets("Sheet1").Range("A2")
.Offset(emptyRow, 0).Value = Me.txtSurname.Value
.Offset(emptyRow, 1).Value = Me.numCRN.Value
.Offset(emptyRow, 2).Value = Me.cboUnit.Value
.Offset(emptyRow, 3).Value = DateValue(Me.txtDateConf.Value)
.Offset(emptyRow, 4).Value = Me.numBoxnum.Value
.Offset(emptyRow, 5).Value = Me.txtItem6.Value
.Offset(emptyRow, 6).Value = Me.txtItemDesc6.Value
.Offset(emptyRow, 7).Value = Me.numQTY6.Value
.Offset(emptyRow, 8).Value = Me.cboCondition6.Value
.Offset(emptyRow, 9).Value = Me.cboReason6.Value
If Me.chkHistCheck6.Value = True Then
.Offset(emptyRow, 10).Value = "Yes"
Else
.Offset(emptyRow, 10).Value = "No"
End If
If Me.chkHistCheck6.Value = "" Then
.Offset(emptyRow, 10).Value = "No"
End If
.Offset(emptyRow, 11).Value = Format(Now, "dd/mm/yyyy hh:nn:ss")
End With
【问题讨论】:
-
不要依赖
CountA来查找最后使用的行。通常建议使用Range.End(xlUp),所以在你的情况下:emptyRow = Cells(Rows.Count, "F").End(xlUp).Row + 1 -
然后不是偏移到emptyRow,而是直接使用它:
With Worksheets("Sheet1").Cells(emptyRow, "A"),然后您的偏移线变为.Offset(, 0)... .Offset(, 1)....等 -
或者,如果你像我一样,永远不记得一列从 A 列偏移了多少列,你可以使用
With Worksheets("Sheet1").Cells(emptyRow, "A")(或只是With Worksheets("Sheet1").Rows(emptyRow))并将偏移量替换为@ 987654329@、.Cells(1, "B").Value = ..、.Cells(1, "C").Value = ..等 -
您的代码似乎没有问题。但是,我猜您的列“F:F”中可能有一个空白,用作
WorkSheetFunction.CountA中的范围。确保标题和最后一个单元格之间没有任何空单元格(只需使用Ctrl + Arrow Up/Down)。 -
作为另一种选择,在 VBA 即时窗口 (
Ctrl + G) 中运行代码WorksheetFunction.CountA(Range("F:F")) + 1并检查结果是否与工作表中的正确行索引匹配。