0

我希望在 MS Access 2010 数据库中制作一个简单的表单,用户可以在其中选择要使用的主题。如何通过vba更改数据库的主题?谷歌对这个问题没有太大帮助。

4

1 回答 1

2

我知道这个问题是不久前提出的,但是由于我在研究设置主题时遇到了这个问题,所以我想我应该尝试提供一些我发现的东西。

在让用户选择主题时,我认为最简单的方法就是将“颜色”按钮放在功能区中。如果您碰巧制作了自己的自定义色带,您可以使用它<control idMso="ThemeColorsGallery" />来引用“颜色”选项。

如果您想尝试更精确地控制发生的事情,我想我可能已经找到了一个选项,但它涉及更多一点,我还没有制定出细节。不过,我想发布它,因为我认为有人可能想要使用它。

在控制图片库功能时,我意识到隐藏的“MSysResources”表中有一个“Office Theme”条目。我相信“MySysResources”表中“Office 主题”行中的任何内容都决定了程序启动时加载的主题。我测试这个想法的方法是我选择了一个主题,然后走到桌子旁,将附件保存到桌面。然后我去选择了一个不同的主题,并通过查看我的一些表格来确保它就位。然后,我回到表格并删除了“Office Theme”行中的内容,并将保存的文件上传回附件中。在我关闭并重新打开程序后,

我设想可能使用的方式是您可以通过代码分配该附件。特别是,如果您想基于特定于您的程序的配置选项覆盖默认设置,这似乎很有用。

2015 年 8 月 18 日更新: 有人要求提供有关我如何通过 VBA 设置主题的更多详细信息,因此我将在此处提供。基本理论是我将 MSysResources 中附件字段中的数据保存到表中。然后,如果我需要用我保存的主题覆盖当前主题,我会从我的表中提取它并将其保存在适当的 MSysResources 记录中。请注意,我使用 MySQL 作为我的表存储平台,并且使用名为“Lgo”的 MediumBlob 字段来存储数据。

这是我使用的两个函数。第一个函数将主题保存到我的 MySQL 表中。第二个函数提取保存的数据并将其保存在 MSysResourcestable 中当前主题的顶部。请注意,要查看第二个函数的效果,您必须在运行该函数后关闭并重新打开程序。

Function SveThm()'Save Theme
    Dim MSR As Recordset, Atc As Recordset, LR As Recordset
    Set MSR = CurrentDb.OpenRecordset("SELECT * FROM MSysResources WHERE [Name]='Office Theme'", dbOpenDynaset)
    If MSR.RecordCount > 0 Then
        Set Atc = MSR!Data.Value
        Set LR = CurrentDb.OpenRecordset("SELECT * FROM tbllgo;", dbOpenDynaset)
        If LR.RecordCount = 0 Then LR.AddNew Else LR.Edit
        LR!Stn = LgoStn
        LR!Lgo = CStr(Atc!FileData)
        LR!Typ = Typ
        LR.Update
        LR.Close
        MsgBox "Your theme has been saved."
    End If
End Function

Function SetMSys()'Set MSysResources
    Dim MSys As Recordset, Lgo As Recordset, Atc As Recordset
    Set MSys = CurrentDb.OpenRecordset("SELECT * FROM MSysResources WHERE [Name]='Office Theme'", dbOpenDynaset)
    If MSys.RecordCount > 0 Then
        MSys.Edit
        Set Atc = MSys!Data.Value
        Atc.Edit
        Set Lgo = CurrentDb.OpenRecordset("SELECT Lgo FROM tbllgo;", dbOpenDynaset)
        If Lgo.RecordCount > 0 Then Atc!FileData = Lgo!Lgo
        Lgo.Close
        Atc.Update
        MSys.Update
    End If
End Function
于 2014-12-03T21:24:10.497 回答