MS Access 2010 データベースで、ユーザーが使用するテーマを選択できる単純なフォームを作成したいと考えていました。vba を使用してデータベースのテーマを変更するにはどうすればよいですか? Google は、この質問に対してあまり役に立ちませんでした。
1 に答える
この質問は少し前に出されたことは知っていますが、テーマの設定を調査しているときにこの質問に出くわしたので、見つけたもののいくつかを提供しようと思いました.
ユーザーにテーマを選択させる場合、リボンに「色」ボタンを配置するのが最も簡単な方法だと思います。独自のカスタム リボンを作成したことがある場合<control idMso="ThemeColorsGallery" />
は、[色] オプションを参照するために使用できます。
何が起こるかをより正確に制御したい場合は、オプションを見つけたかもしれませんが、それはもう少し複雑で、詳細はまだわかっていません. でも誰かに使ってもらいたいと思ったので載せてみました。
イメージ ギャラリー機能の制御に取り組んでいるときに、非表示の「MSysResources」テーブルに「Office テーマ」のエントリがあることに気付きました。「MySysResources」テーブルの「Office Theme」行にあるものは、プログラムの起動時に読み込まれるテーマを決定すると思います。私がこのアイデアをテストした方法は、テーマを選択してからテーブルに移動し、添付ファイルをデスクトップに保存するというものでした. 次に、別のテーマを選び、フォームのいくつかを見て、それが適切であることを確認しました. 次に、表に戻り、「Office テーマ」行にあったものを削除し、保存したファイルを添付ファイルにアップロードしました。プログラムを閉じて再度開いた後、
これが使用される可能性があると私が想像する方法は、コードを介してその添付ファイルを割り当てることができるということです。特に、プログラムに固有の構成オプションに基づいてデフォルト設定を上書きしたい場合、これは便利なようです。
2015 年 8 月 18 日更新: VBA を介してテーマを設定する方法について追加の詳細を求める人がいたので、ここで提供します。基本的な理論は、MSysResources の添付ファイル フィールドからテーブルにデータを保存することです。次に、保存したテーマで現在のテーマを上書きする必要がある場合は、テーブルから抽出して、適切な MSysResources レコードに保存します。テーブル ストレージ プラットフォームとして MySQL を使用しており、"Lgo" という名前の MediumBlob フィールドを使用してデータを格納していることに注意してください。
これが私が使用する2つの関数です。最初の関数は、テーマを MySQL テーブルに保存します。2 番目の関数は、保存されたデータを抽出し、MSysResourcestable にある現在のテーマの上に保存します。2 番目の関数の効果を確認するには、関数を実行した後にプログラムを閉じて再度開く必要があることに注意してください。
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