访问 VBA SendKeys 替代方案
Posted
技术标签:
【中文标题】访问 VBA SendKeys 替代方案【英文标题】:Access VBA SendKeys alternative 【发布时间】:2018-11-26 07:36:43 【问题描述】:我刚刚在工作中继承了一个几年未动过的人事数据库,他们希望我让它发挥作用。我已经能够更新大部分内容,但我遇到了使用 SendKeys 操作输入的宏的问题:
Private Sub Command3_Click()
On Error GoTo Err_Command3_Click
DoCmd.OpenTable "tblEmployees", acNormal, acEdit
DoCmd.GoToControl [employee]
DoCmd.FindRecord Forms![EmployeeRemoval]![cboEmpSelect],
DoCmd.GoToControl [pastemployee]
SendKeys "1~", True
DoCmd.Close acTable, "tblEmployees"
Exit_Command3_Click:
Exit Sub
Err_Command3_Click:
MsgBox Err.Description
Resume Exit_Command3_Click
此时使用 Access 2010,它只是将程序发送到一个循环中,打开和关闭表格,同时打开和关闭 Num Lock。我认为最好的替代方法是 Update 语句,但不确定更新需要更新的单个单元格的 Where 标准是什么(在这种情况下,在任何给定时间只有一个有问题的员工的 PastEmployee 单元格需要更新为 True 而不是 False)。在宏中,它引用(通过 FindRecord 命令)一个 ComboBox,其中选择了从员工表中查询姓氏、名字和员工编号的员工。
db.Execute Update tblEmployees Set [PastEmployee] = 1 Where XXXXXXXX
在使 SendKeys 命令正常工作或使更新语句正常工作方面的任何帮助都会有所帮助。
【问题讨论】:
这是什么意思?狡猾的错误处理程序是否引入了问题? 【参考方案1】:贴出的代码不是宏,是VBA。 Access 中的宏非常不同。
用户不应与表格和查询进行交互,而应仅与表单和报告进行交互。
在访问是/否字段中,0
是 False
,-1
是 True
。
考虑:
Private Sub Command3_Click()
On Error GoTo Err_Command3_Click
CurrentDb.Execute "UPDATE tblEmployees SET PastEmployee=True WHERE employee=" & Me.cboEmpSelect
Exit_Command3_Click:
Exit Sub
Err_Command3_Click:
MsgBox Err.Description
Resume Exit_Command3_Click
End Sub
如果表单绑定到 tblEmployees 并专注于要编辑的记录,而不是 UPDATE 操作,只需:Me!PastEmployee = True
。虽然,如果在表单上查看记录,用户只需单击绑定到 PastEmployee 的复选框,不需要任何代码。
【讨论】:
在尝试更新语句时,它给我一个数据类型不匹配的标准表达式错误。我没有机会尝试 Me!PastEmployee=True,但这可能是解决手头问题的更简单方法。试一试后,我会回来查看。 Employee 的数据类型是什么? cboEmpSelect 的值是多少 - 数字还是文本? PastEmployee 是否为“是/否”字段? 员工是数字,cboEmpSelect 报告文本(导出姓、名),但同时查询文本和数字(员工和关联的姓、名)。 PastEmployee 是一个是/否字段。 那么这就是“类型不匹配错误”的来源。需要组合框具有员工编号但显示名称的值。不要在过滤条件中使用带有数字字段参数的撇号分隔符。以上是关于访问 VBA SendKeys 替代方案的主要内容,如果未能解决你的问题,请参考以下文章
.NET(C#) SendKeys模拟键盘按键不生效使用WinAPI的替代方案