Vba 在DoCmd.OpenForm之后焦点未设置在正确的字段上

Vba 在DoCmd.OpenForm之后焦点未设置在正确的字段上,vba,ms-access,Vba,Ms Access,我正在开一张如下的表格 DoCmd.OpenForm "frmPatient", acNormal, , , acFormEdit, acWindowNormal 通常,焦点到达的默认选项卡和字段是合适的。但在某些情况下,我想把它设置到一个不同的领域。我在下一行代码中尝试这样做: Forms("frmPatient")("cmdLabReport").SetFocus 出于某种原因,这并不完全有效。显示表单的正确选项

我正在开一张如下的表格

    DoCmd.OpenForm "frmPatient", acNormal, , , acFormEdit, acWindowNormal
通常,焦点到达的默认选项卡和字段是合适的。但在某些情况下,我想把它设置到一个不同的领域。我在下一行代码中尝试这样做:

    Forms("frmPatient")("cmdLabReport").SetFocus
出于某种原因,这并不完全有效。显示表单的正确选项卡,但接收焦点的字段错误。我怀疑这是因为中间代码可能仍在后台执行。

此表单上有一个选项卡控件“TabMain”,而我设置焦点的控件位于表单正常打开的另一个选项卡上。选项卡控件的更改事件由SetFocus命令触发

TabMain\u Change中的最后一个命令是发送选项卡的
SendKeys
命令。使用此选项的原因将涉及大量的解释。我只想说,正是这个命令改变了我的注意力。窗体上的控件,该控件在我的SetFocus命令之后在选项卡索引上获得焦点

奇怪的是,如果我在SetFocus命令之后直接打开
MsgBox
,执行的
SendKeys
将应用于
MsgBox
,而不是frmPatient上的控件。因此,似乎发生了一些不正常的事情,因为
SendKeys
MsgBox
之后执行,尽管在它之前被调用过

代码顺序:

DoCmd.OpenForm "frmPatient", acNormal, , , acFormEdit, acWindowNormal
Forms("frmPatient")("cmdLabReport").SetFocus
MsgBox "Some messsage here", vbYesNo
TabMain\u Change由
.SetFocus
调用,并执行
SendKeys
。 上面的
MsgBox
打开时焦点设置为“否”(换句话说,执行了一个选项卡,因为这种类型的框通常以“是”作为默认值打开)


因此,一个难看的修正,我将焦点设置为选项卡索引位于所需控件之前的项。丑陋。

如果您想在
事件触发后触发代码。由于触发了事件,设置焦点
,请使用一个或多个
事件
进行后续操作

访问是完全同步的,这意味着:

  • 您的代码可以运行
  • 侦听由代码运行触发的事件的任何代码
  • 如果代码触发事件,则在代码完成时或手动运行允许访问处理事件的
    DoEvents
    时处理该事件


    请注意,与
    SendKeys
    相关的任何内容都是故障。如果要将焦点设置为特定选项卡上的特定控件,请执行此操作,不要将焦点设置为选项卡,然后使用
    SendKeys
    将焦点设置为控件。

    表单事件顺序:打开>加载>调整大小>激活>当前。我不知道TabMain事件-这到底是什么?你是对的,这不是标准事件流的一部分。TabMain是我在表单上为TabControl确定的名称。事件序列中的实际方法是frmPatient.TabMain\u Change。当我试图设置焦点时,可能会调用它?我在原始问题的基础上添加了另一个关于MsgBox调用干预效果的信息。Access不是多线程应用程序。谢谢您的回答。当我并置观察这两种说法时,我会笑一笑:访问是完全同步的<代码>发送键有问题。这意味着
    SendKeys
    是异步的,还是住在阁楼上的疯狂叔叔?为了正确地修复代码,我必须弄清楚如何消除对
    SendKeys
    的需要,如果没有这些键,我无法弄清楚如何打开具有可滚动内容的选项卡,并让它们从顶部开始。对于正确的StackOverflow内容,这应该是它自己的问题,而不是在这里处理,我假设。
    SendKeys
    主要是麻烦,因为它会为那些想做你没有解释的事情的人制造噩梦。比如说几年后,有人选择自动化您的表单,并创建一个脚本,打开Access,打开表单,在表单上执行操作,假设发生了操作,然后再次关闭表单,而Access不可见。这突然变得不可能,因为Access在不可见时无法正确使用
    SendKeys
    。有人在你的应用程序中添加了一个控件,该控件会更改选项卡顺序,
    SendKeys
    突然开始导航到不同的控件,等等。你在那里没有我的争论,因为你亲身经历了噩梦。哦,对于导航到不同的页面而不滚动,do check现有问题尚未回答您的问题,例如(尝试通过设置选项卡控件的值来导航,而不是使用
    SetFocus
    ),我在发布之前会尽力检查答案,是的,我几乎总是为导航设置选项卡控件的值。默认情况下,选项卡上材料内容的存在和间距会导致某些选项卡滚动,而不是打开并滚动到顶部。对于中的这个新路径,我将尝试让正在打开的表单上的一个子节点在设置焦点之前进行选项卡选择。如果选项卡已经设置,setfocus可能不会触发选项卡更改。好建议。