我最近开始了一份新工作。这是一个管理职位,公司没有太多 IT 部门。因此,我一直在尝试创建自己的管理工具。我的同事也害怕 Access,不想参与我通过它创建的任何东西。我觉得这一点值得一提,是因为对我目前的问题最明显的解决方案是“只使用 Access”,如果我发现自己在这方面能力不足,我可能最终不得不这样做。
我目前正在研究的工具之一是技能矩阵/继任计划。在一张工作表中,我列出了员工职位描述中要求完成的任务以及他们是否需要培训。
我希望所有用户交互都发生在“搜索”工作表上,这样,如果有需要,除了我之外的任何人都不会在源头手动操作“后端”数据。运行搜索后,录制的宏会从另一张工作表中复制、粘贴和格式化一组索引匹配公式以显示结果。在本例中,培训完成为“否”的员工列表。
从此列表的结果中,我希望用户能够选择他们想要更新的单元格,然后单击按钮将源单元格从“否”更新为“是”。以下是我对如何实现这一点的猜测。我对 VBA 一无所知。
Sub updateyes()
SendKeys "(^[)"
Worksheets("Sheet1").Activate
ActiveCell.Value = "Yes"
Sheets("Search & Update").Select
Range("A6").Select
End Sub
sendkey 本身成功移动到源单元格并选择它。总体而言,上述代码仅更新“后端”工作表上最后手动选择的任何单元格。
我无法让代码引用特定的单元格,因为它取决于用户当前正在选择哪个单元格。
总结一下我想要实现的目标是:
用户选择要更新的单元格,单击按钮。宏移动到所选的源单元格,从否更新为是,返回“搜索”工作表。
很简单,不是吗?从我之前收到的回复来看,我可能不擅长这个。提前谢谢大家。
答案1
您的代码依赖于非常脆弱的Select
和Activate
,并且隐式引用活动工作簿和活动工作表。
Worksheets("Sheet1").Activate '~> implicitly refers to ActiveWorkbook
ActiveCell.Value = "Yes" '~> implicitly refers to ActiveSheet
Sheets("Search & Update").Select '~> implicitly refers to ActiveWorkbook
Range("A6").Select '~> implicitly refers to ActiveSheet
这将是你的朋友:
Dim sheetOne As Worksheet
Set sheetOne = Worksheets("Sheet1")
Dim searchSheet As Worksheet
Set searchSheet = Worksheets("Search & Update")
现在,我们不再需要选择和激活东西,使用这些明确的参考。
而不是这样:
ActiveCell.Value = "Yes"
做这个:
sheetOne.Range("A6").Value = "Yes"
(如果这就是你的代码想要做的——它不是很清楚它是什么应该正在做