sironekotoroの日記

Perl で楽をしたい

Excel VBAスタンダード 公式テキスト 12章 レジストリの操作

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