如何使用VBA在Access中加载表单,使特定选项卡可见或不可见? 问题

如何使用VBA在Access中加载表单,使特定选项卡可见或不可见? 问题,vba,ms-access,tabs,Vba,Ms Access,Tabs,如何使用VBA在Access中加载表单,使特定选项卡可见或不可见 说明: 我有一个Acess数据库,有4个包含按钮的表单。今天,我开始创建色带来去除表单中的色带,这样所有内容都可以排序,并且易于查看。我希望在从主窗体打开窗体之前,Access数据库中的选项卡不可见 主窗体(未显示选项卡)-->通过单击主窗体中的按钮切换到另一个窗体(现在我想在打开窗体后显示特定选项卡) 我用“Ribbon Creator 2019”为Office 2019制作了我的彩带 问题: 我不能解决它。。。我尝试了很多方法

如何使用VBA在Access中加载表单,使特定选项卡可见或不可见

说明: 我有一个Acess数据库,有4个包含按钮的表单。今天,我开始创建色带来去除表单中的色带,这样所有内容都可以排序,并且易于查看。我希望在从主窗体打开窗体之前,Access数据库中的选项卡不可见

主窗体(未显示选项卡)-->通过单击主窗体中的按钮切换到另一个窗体(现在我想在打开窗体后显示特定选项卡)

我用“Ribbon Creator 2019”为Office 2019制作了我的彩带

问题: 我不能解决它。。。我尝试了很多方法,直到我发现excel工作表有一个功能,可以通过切换工作表来显示特定的选项卡。这正是我想要的,但我无法让它为我的访问工作

通过获取活动窗体的名称,我无法使其工作,在我看来,这将是最快的方法

我的方法: 我将XML中的“StartFromScratch”设置为“true”,并为选项卡命名如下:“CustomTagValue1:=xstart”

我的选项卡代码(模块):

另一个模块中用于声明我的选项卡的代码:

Option Compare Database
Option Explicit

'**************************************************************************
'                      About this Code:
'
' This Code checks if a Formular is in active use by his 'Name'. Simple.
'**************************************************************************


Dim MyTag As String

'Callback for customUI.onLoad
Sub RibbonOnLoad(ribbon As IRibbonUI)
    Set Rib = ribbon
End Sub

Sub GetVisible(control As IRibbonControl, ByRef visible)
    If control.Tag Like MyTag Then
        visible = True
    Else
        visible = False
    End If
End Sub

Sub RefreshRibbon(Tag As String)
    MyTag = Tag
    If Rib Is Nothing Then
        MsgBox "Fehler RBC1018, bitte starten Sie das Programm neu."
    Else
        Rib.Invalidate
    End If
End Sub

格式为onLoad的代码:

Private Sub Form_Load(ByVal Sh As Object)

    Select Case Screen.ActiveForm
    Case "frmVerteiler": Call RefreshRibbon(Tag:="xverteiler")
    Case Else: Call RefreshRibbon(Tag:="")
    End Select


End Sub
帮助:


我希望它能像这个excel文档一样工作:

只需为每个表单创建一个自定义功能区,就可以大大减少工作量,而且更容易,这样您就不必编写各种代码来隐藏功能区上的“显示”选项卡。因此,只需为给定表单指定正确的功能区,无需任何代码

我还建议您不要在功能区中使用回调。如果采用这种方法,则功能区可以直接调用现有的按钮代码。因此,您现在拥有的代码、按钮可以传输到该表单的功能区,您不必设置功能区回调,所有现有的按钮代码都可以保持“原样”,并直接从功能区调用—功能区将运行表单中的按钮代码

您所需要做的就是声明您想要调用的任何函数作为公共函数

然后按如下方式设置on操作:

=MyPublicFunctionName()

请仔细注意我们是如何拥有
=
()
(您必须拥有这些),它们必须在引号下

例如,对于xml,我们有:

onAction=“=MyDelete()”

请注意,上述内容与功能区的回调有何不同(回调使用sub,这是一个函数)。更好的是,上述方法不必将代码放在标准代码模块中,但可以将函数放在当前形式中。因此,无需宏,无需回调,代码可以以当前形式运行(就像命令按钮一样)。在10种情况中,有9种情况下,特定表单和按钮所需的代码无论如何都属于特定表单代码模块。事实上,开始使用表单中的代码并将其放在标准的公共代码模块中是一种非常糟糕的编程实践。原因很多,但如果您有access中允许的同一表单的多个实例,则可能会出现各种问题。此外,当在应用程序之间复制表单时,或者甚至在同一应用程序中复制表单时,意味着您具有我们作为access开发人员通常不期望的外部代码依赖性(我们假设在大多数情况下,我们用于表单的代码属于表单代码模块,我100%同意)。我愿意接受这样的想法,即这确实违背了将UI和代码分开的众所周知的概念,但这就是访问的“工作方式”。因此,访问方式确实与我们行业的趋势背道而驰

请记住,上面的函数调用思想与我们从第一天开始就可以使用的格式相同,在access的早期版本中,菜单栏也是如此。因此,如果您想将菜单条形码更改为ribbon,请使用上述方法。此外,如果您有几个按钮以给定的形式运行代码,那么上述语法同样允许您将代码保持在当前形式,并简单地将按钮代码声明为公共函数(如果这样做,您可以真正轻松地将按钮从一个表单移动到功能区)

如果在菜单或功能区中指定的函数名在窗体的代码模块中被命名为public,则具有当前焦点的当前窗体将是首先查找该函数以执行的位置。这一点非常重要,因为这意味着您可以为五个不同的表单使用一个自定义菜单栏,但五个不同的表单中的每一个都将运行一个自定义的删除例程(例如,不要弄乱screen.Activeform)。而且,你不必像回电话那样使用一堆杂乱无章的案例陈述。事实上,所有代码都保留在表单中,也就是在表单代码模块中,它最初可能是或属于的表单

因此,如果具有焦点的给定表单可能需要特定的专门删除代码,那么当从菜单栏中的on操作或现在的ribbon调用表单模块中的forms函数代码时,将运行该代码

这意味着如果将on操作设置为=MyDelete()

然后在您拥有的每个表单中,您只需声明一个公共函数,例如

CODE
Public function MyDelete() 
    Code here to delete the record 
End function
然而,对于超过一半甚至接近90%的表单,完全可能需要一个通用的catchall delete例程,该例程适用于不需要专门定制删除代码的所有表单。在这种情况下,您只需将函数放在标准代码模块中(再次作为公共代码模块)。如果当前表单没有该函数,那么它将从标准代码模块运行(同样是理想行为,这也是onAction在ribbon之前的工作方式)

另外,请注意,您还传递了v
CODE
Public function MyDelete() 
    Code here to delete the record 
End function
CODE
   <button id="MyDelete" label="Delete Record"
    imageMso="Delete" size="large"
    onAction="=MyDelete('Staff','tblStaff')"
    supertip="Delete this record"
 />
CODE
 Public Function MyDelete(strPrompt As String, strTable As String)
  Dim strSql        As String
  Dim f             As Form
  Set f = Screen.ActiveForm
  If MsgBox("Delete this " & strPrompt & " record?", _
                vbQuestion + vbYesNoCancel, "Delete?") = vbYes Then

 etc....
CODE
Public Function MyDelete(s1 as string, s2 as string)
 If lngHistory > 0 Then
    Beep
    MsgBox "You cannot delete a person with past history bookings!" & vbCrLf & vbCrLf & _
              "You should simply check the 'Do NOT INCLUDE in mailings' to remove from" & vbCrLf & _
              " future mailings.", vbExclamation, "Rides"
  Exit Sub

End If