如何使用VBA刷新导航窗格

3
我有一个前端数据库,并且我动态地将一些链接表添加到后端数据库中。接下来,我从隐藏的系统表中读取它们的ID,以便将它们添加到导航窗格中,在我创建的一些自定义组中。
虽然我相信我正在使用正确的表/值,但我找不到任何方法在我完成MSysNavPaneGroupToObjects表中的插入后刷新导航窗格。
关于我所努力实现的东西,唯一可以找到的信息是这里:Change Navigation pane group in access through vba 但是,在我的情况下,所有的值都被成功创建(我想),但我看不到导航窗格中的条目。有时候它可以工作,但大多数情况下我只能看到空组。
我想知道是否有人解决过类似的问题或者有文档/论坛可以找到更多信息。谢谢

一旦您将值添加到表中,如果单击导航窗格并按[F5],新条目是否显示?如果关闭并重新打开数据库,它们是否会出现? - Gord Thompson
谢谢,不幸的是他们没有,无论是按F5还是关闭并重新打开数据库。 - George Sofianos
你是只在第一次打开前端时添加链接表,还是随时都可以进行添加? - Gord Thompson
我正在使用一个表单来选择目标数据库。当我选择目标数据库时,我会删除先前链接的表,然后重新创建链接的表。我只有一个普通的路径到数据库,例如“C:\path\to\database.accdb”。然后我进行查询以查找新链接表的ID,并将新行插入到SysNavPaneGroupToObjects表中,对象ID为链接表的ID,组ID为我已添加的组的ID。由于它有时有效,而我的6个表分为两个不同的组,我相信这是正确的。 - George Sofianos
有时它可以工作,但大多数时候我只看到空的组。根据Wayne在他的回答中的代码评论进一步说明:“这个[MSysNavPaneObjectIDs]表会在Access的心愿下被重建”...你能否尝试从另一个应用程序(例如另一个Access数据库、VBScript或其他应用程序)运行更新MSysNavPane*表的代码,而同时被更新的数据库在MSACCESS.EXE中打开,以查看结果是否更一致? - Gord Thompson
我明天会尝试一下。我在这个问题中测试了两个答案,但它们都不起作用。所以现在我在思考,这可能与刷新导航窗格无关,而是MSysNavPane*表中存在一种“阻止”它正确更新的模式。我将尝试手动拖放一些表格,看看能否识别它并复制正确行为。 - George Sofianos
3个回答

6

尝试以下方法

Application.RefreshDatabaseWindow

或者:

CurrentDb.TableDefs.Refresh

谢谢,我得等到周一才能试试,因为我家里没有MS-Access。如果它有效,我会告诉你的。 - George Sofianos
我尝试了你的建议,但没有任何改变,所以我认为ms-access更新表格和我的代码同时更新表格之间存在冲突。当我最终解决这个问题时,我会更新问题或提供答案。无论如何,感谢你的时间。 - George Sofianos

1
如果写入到MSysNav*表中的更改在关闭并重新打开数据库后仍然没有出现在导航窗格本身中,则这不是真正的“刷新”问题。其他因素可能会干扰对这些表的更新,使您的更改无效。
相关问题的答案中,Wayne G. Dunn建议,“这个[MSysNavPaneObjectIDs]表会在Access的心血来潮时重建”,这可能与应用程序的VBA代码更新该表冲突。如果这是真的,并且MSACCESS.EXE在打开数据库时期望(有效地)独占访问MSysNav*系统表,则解决方法是确保正在修改的数据库在应用VBA代码应用MSysNav*修改时未在MSACCESS.EXE中打开。
一种方法是在“主”数据库中使用VBA代码:
  1. 将相关详细信息写入临时文本文件中
  2. 启动一个单独的进程执行更新,然后立即
  3. 使用Application.Quit关闭“主”数据库。

单独的进程可以在另一个Access数据库、VBScript或您喜欢的任何地方运行代码。它将:

  1. 从临时文本文件中读取相关详细信息,
  2. 在MSACCESS.EXE未打开时更新主数据库中的 MSysNav*表,
  3. 删除临时文本文件,
  4. 重新启动带有主数据库的MSACCESS.EXE,然后
  5. 自我终止。

在两个进程之间共享的“相关详细信息”取决于此方法的实现细节,但可能包括:

  • “主”数据库的完整路径(以便单独的进程可以找到它),
  • 相关副本的MSACCESS.EXE的完整路径(以便单独的进程完成后可以重新加载主数据库),以及
  • 要添加或更新的项目在主数据库的 MSysNav*表中。

很不幸,本周我没有时间对这些建议进行彻底的测试,并且我刚刚意识到我必须尽快将赏金授予某个人。在假期之间开始这个问题是个错误 :) 所以我将把赏金授予这个答案,因为我有一种感觉它并不是一个令人耳目一新的问题,一旦我了解是什么原因导致了这个问题,我会编辑/更新问题。谢谢你的建议,Gord。 - George Sofianos

1

在访问中存在一个错误,您需要刷新导航窗格才能显示它们或甚至关闭并重新打开。

另一个选项是隐藏然后显示,但这可能只是像其他建议一样刷新它。


隐藏。
DoCmd.RunCommand acCmdWindowHide

Show

DoCmd.SelectObject acTable, , True

我尝试了你的建议,但没有任何改变,所以我认为ms-access更新表格和我的代码同时更新表格之间存在冲突。当我最终解决这个问题时,我会更新问题或提供答案。无论如何,感谢你的时间。 - George Sofianos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接