【发布时间】: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 - 每个用户都有自己的电子表格,因此不共享。