【问题标题】:Excel userform occasionally will not enter data into the spreadsheetExcel 用户表单偶尔不会在电子表格中输入数据
【发布时间】:2019-01-10 03:33:07
【问题描述】:

我在 Excel VBA 中创建的用于将数据输入数据库的用户表单有效,但有时我的用户报告说他们使用表单输入的数据没有填充到电子表格中。我是 Excel VBA 编码和一般编程的新手,所以我不确定解决此类问题的最佳方法。

请注意这个问题是间歇性的,所以我不知道这是用户正在做的事情还是没有做的事情。

我最初认为数据可能会填充在电子表格的底部,因为“在数据库部分中查找第一个空行”出现错误,但是我在那里没有找到任何数据。

Private Sub CommandButton1_Click()
Dim lRow As Long
Dim ws As Worksheet
Set ws = Worksheets("QA Data")

'find first empty row in database
lRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
    SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1

'check for lookup code
If Trim(Me.txtLookup_Code.Value) = "" Then
    Me.txtLookup_Code.SetFocus
    MsgBox "Please enter a Lookup Code"
    Exit Sub
End If

'copy the data to the database
'use protect and unprotect lines,
'   with your password
'   if worksheet is protected
With ws
'   .Unprotect Password:="password"
    .Cells(lRow, 1).Value = Me.txtLookup_Code.Value
    .Cells(lRow, 2).Value = Me.cboCM_Name.Value
    .Cells(lRow, 3).Value = Me.txtCM_Errors.Value
    .Cells(lRow, 4).Value = Me.cboSP_Site.Value
    .Cells(lRow, 6).Value = Me.cboChecklist_Type.Value
    .Cells(lRow, 7).Value = Me.txtActivity_Description.Value
    .Cells(lRow, 8).Value = Me.cboProcessor_Name.Value
    .Cells(lRow, 9).Value = Me.txtCritical_Errors.Value
    .Cells(lRow, 10).Value = Me.txtNon_Critical_Errors.Value
    .Cells(lRow, 12).Value = Date
    .Cells(lRow, 13).Value = Application.UserName
'   .Protect Password:="password"
End With

'clear the data
Me.txtLookup_Code.Value = ""
Me.cboCM_Name.Value = ""
Me.txtCM_Errors.Value = ""
Me.cboSP_Site.Value = ""
Me.cboChecklist_Type.Value = ""
Me.txtActivity_Description.Value = ""
Me.cboProcessor_Name.Value = ""
Me.txtCritical_Errors.Value = ""
Me.txtNon_Critical_Errors.Value = ""
Me.txtLookup_Code.SetFocus

End Sub

Private Sub UserForm_Initialize()
Dim cName As Range
Dim cSite As Range
Dim cCheck As Range
Dim cProcessor As Range
Set ws = Worksheets("Lists")

For Each cName In ws.Range("CMName")
  With Me.cboCM_Name
    .AddItem cName.Value
    .List(.ListCount - 1, 1) = cName.Offset(0, 1).Value
  End With
Next cName

For Each cSite In ws.Range("SPSite")
    With Me.cboSP_Site
        .AddItem cSite.Value
        .List(.ListCount - 1, 1) = cSite.Offset(0, 1).Value
    End With
Next cSite

For Each cCheck In ws.Range("ChecklistType")
    With Me.cboChecklist_Type
        .AddItem cCheck.Value
        .List(.ListCount - 1, 1) = cCheck.Offset(0, 1).Value
    End With
Next cCheck

For Each cProcessor In ws.Range("ProcessorName")
    With Me.cboProcessor_Name
        .AddItem cProcessor.Value
        .List(.ListCount - 1, 1) = cProcessor.Offset(0, 1).Value
    End With
Next cProcessor

Me.txtLookup_Code.SetFocus

End Sub

我希望电子表格能够填充按下“添加”按钮时输入的数据,但有时它不起作用。

【问题讨论】:

  • 看不到任何明显的东西。一个问题可能是没有参考正确的工作簿。如果打开另一个工作簿并带有名为 QA Data 的工作表,则可能会导致问题。尝试将此Set ws = Worksheets("QA Data") 更新为Set ws = Thisworkbook.Worksheets("QA Data")。此外,请确保数据实际上不存在。可能是数据被附加到比预期更远的位置。
  • 我同意@RyanWildry。或者,是否有可能用户正在重命名工作表?也许将其指向 sheetID 名称而不是名称?
  • 您的 Find 缺少 After 参数(应该是 A1),因此它可能没有找到 last 行。这可能会导致覆盖现有数据:我总是在写入任何内容之前检查该行是否真的为空。
  • 我会尝试定义行的.end(xlup) 方法。是否可以多个用户同时更新?
  • 谢谢大家! Ryan - 我一直看到最后,数据不在那里。 PGCodeRider - 我不认为他们是,但我会像你说的那样修改它只是为了确定。 Nathan - 每个用户都有自己的电子表格,因此不共享。

标签: excel vba userform


【解决方案1】:

线

lRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
    SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
将找到一个值,该值不仅在最后一行,而且在该行的最后一列。

您可以想象它从ws.Range($XFD$1048576) 搜索到ws.Range("$A$1") 从右到左搜索,然后向上移动一行。因此,如果碰巧在ws.Range("$AA$57) 存在一个值,您的输出最终会出现在第 58 行。

查找用于您目的的最后一行的更一致的方法是让lRow = ws.Range("A" & Rows.Count).End(xlup).Row + 1. 使用此方法,您只需在 A 列中搜索最后填充的行,然后将其递减到下一个空行。 为了进一步消除异常错误,set ws = ThisWorkbook.Worksheets("QA Data") 可能符合您的最大利益。

就调试此类问题的建议而言,您可以创建一个额外的工作表,在本示例中我们将其称为“错误”,并在您的代码末尾添加 CommandButton1_Click()

With ThisWorkbook.Worksheets("Error")
    .Range("A" & .Range("A" & Rows.Count).End(xlUp).Row + 1) = "Data Entry Point @ Row " & lRow
End With

只是为了查看您的数据在哪里输出。

【讨论】:

  • 谢谢泰特!我将使用 xlup,它看起来更高效且不易出错。如果再次发生这种情况,调试屏幕肯定会派上用场。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多