12-1 レジストリの概念
レジストリはWindowsが使用する特別な記憶領域です。Windowsの起動や動作に関する重要な設定値や、アプリケーションが使用する設定値などが記録されています。
- 改めて言われるとそんなかんじやね
- regeditにはよくお世話になりまする
Excel VBAにはレジストリを操作する専用の命令が用意されています。それらの命令はレジストリ内のユーザーが自由に編集できる領域だけを操作できます。Excel VBAの命令を使ってレジストリを操作する限り、誤ってレジストリデータを破壊して、Windowsが起動しなくなるなど重大なトラブルを招く事はありません。
- なるほど
12-2 操作できる場所
HKEY_CURRENT_USERS\Software\VB and VBA Program Settings
内に限られる- とテキストにはあるけど、うちの場合には別なところに記録される
HKEY_USERS\文字列\Software\VB and VBA Program Settings\MyMacro\Main
12-3 レジストリに登録する
SaveSetting アプリケーション名, セクション名, キー名, データ
- アプリケーション名:一般的にプログラム名や企業名
- セクション名:データを保存するフォルダ名に該当
- キー名:ファイル名に該当、その中に記録される内容がデータ
- おぉ
- なお、regedit開きながら、追加されるところを生でみようとしてもダメっぽい。
- 追加されてなくて、regedit開き直したら追加されてた。
- F5キーでも更新を確認できる。
12-4 レジストリを取得する
GetSetting (アプリケーション名, セクション名, キー名, 規定値)
Sub Macro1() ' ' レジストリからデータを取得する ' Dim buf As String buf = GetSetting("MyMacro", "Main", "Data", "存在しません") MsgBox buf ' End Sub
GetAllSettings(アプリケーション名,セクション名)
- セクション名で指定したセクションに登録されているすべてのキー名とデータを二次元配列で返す
Option Explicit Sub Macro1() ' ' レジストリからデータを取得する ' Dim tmp As Variant, i As Long SaveSetting "MyMacro", "Sample", "Data1", "Excel" SaveSetting "MyMacro", "Sample", "Data2", "VBA" tmp = GetAllSettings("MyMacro", "Sample") For i = 0 To 1 MsgBox tmp(i, 0) & vbCrLf & tmp(i, 1) Next i ' End Sub
- さらっと二次元配列ぶっ込んできた
12-5 レジストリを削除する
- DeleteSetting "マクロ名", "セクション名", "キー名"
Sub Macro1() ' ' セクション「Sample」内の「Data1」キーのデータを削除する ' DeleteSetting "MyMacro", "Sample", "Data1" ' End Sub
Sub Macro1() ' 'セクション「Sample」を削除する ' DeleteSetting "MyMacro", "Sample" ' End Sub
Sub Macro1() ' 'フォルダ「MyMacro」を削除する ' DeleteSetting "MyMacro" ' End Sub
12-6 レジストリを利用したマクロ例
前回の表示位置を再現する
Private Sub UserForm_Initialize() Dim pos As Long StartUpPosition = 0 pos = Val(GetSetting("MyMacro", "Form", "Top", "100")) Me.Top = pos pos = Val(GetSetting("MyMacro", "Form", "Left", "100")) Me.Left = pos End Sub Private Sub UserForm_QueryClose(Cancel As Integer, closemode As Integer) SaveSetting "MyMacro", "Form", "Top", Top SaveSetting "MyMacro", "Form", "Left", Left End Sub
前回の設定を再現する
Option Explicit Private Sub CommandButton1_Click() '実行 SaveSetting "MyMacro", "Form", "Text", TextBox1.Text If OptionButton1.Value = True Then SaveSetting "MyMacro", "Form", "Job", "印刷" Else SaveSetting "MyMacro", "Form", "Job", "プレビュー" End If Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub UserForm_Initialize() Dim pos As Long, buf As String buf = GetSetting("MyMacro", "Form", "Text") TextBox1.Text = buf buf = GetSetting("MyMacro", "Form", "Job") If buf = "印刷" Then OptionButton1.Value = True Else OptionButton2.Value = True End If StartUpPosition = 0 pos = Val(GetSetting("MyMacro", "Form", "Top", "100")) Me.Top = pos pos = Val(GetSetting("MyMacro", "Form", "Left", "100")) Me.Left = pos End Sub Private Sub UserForm_QueryClose(Cancel As Integer, closemode As Integer) SaveSetting "MyMacro", "Form", "Top", Top SaveSetting "MyMacro", "Form", "Left", Left End Sub
同じファイルを処理しない
Sub Macro1() ' ' Macro1 Macro ' Dim Target As String, buf As String '開くファイルの選択 Target = Application.GetOpenFilename("*.txt,*.txt") '前回処理したファイル名をレジストリから取得 buf = GetSetting("MyMacro", "Job", "Files") '両者の比較 If Target = buf Then '同じであれば処理しない MsgBox "処理済です" Else '違っていれば処理 'Line Inputは1行分のデータの読み込み '#1 は一つ目のファイル、という意味 Open Target For Input As #1 Line Input #1, buf Close #1 Range("A1") = buf '処理したファイルをレジストリに記録 SaveSetting "MyMacro", "Job", "Files", Target End If ' End Sub