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