計算条件とか、ある種の定数とか、プログラム内で設定した内容を記録して、次にエクセルを起動した際に再現したい、ということがよくあります。たとえば、フォームなどのサイズや表示位置とか、使っている人のユーザー名とか・・・・
普通は、そのブックの適当なワークシートに記載しておけば、それは簡単に実現できます。記録するということは、もともとエクセルの基本的な機能ですからね。しかし、それは当該ブック内からしか参照できないので、他のブックや他のアプリケーションと共用しようとすると、なかなか大変です。しかも、自分特有の値であったとしてもそのブックを他の人が使えば書き換えられてしまいます。
ブックとは別のファイルに、自分のコンピューターだけに記録できないものか、と考えてやってみました。
やりかたはいろいろあるでしょうが、ここで紹介するのは、設定内容を C ドライブの AppData フォルダーに記録する方法です。
設定内容を表す文字列を用意して SaveMySetting を呼ぶと、所定のファイルにテキストとして書き込みます。ReadMySetting を呼ぶと、そのテキストを読み取ります。
とりあえず、SettingModule で実行するのはそれだけです。
標準モジュール SettingModule
'----- setting を記録するフォルダー名とファイル名 Private Const mySettingFolder = "CastFactory" Private Const mySettingFile = "setting.txt"
'========== 設定内容の記録と取得 '----- 記録 'テキストファイルに setting が記載される Public Sub SaveMySetting(setting As String) Dim fileNumber fileNumber = FreeFile Open mySettingPath For Output As #fileNumber Print #fileNumber, setting Close #fileNumber End Sub
'----- 取得 'ファイルがなければ、Empty を返す Public Function ReadMySetting() As String Dim fileNumber, text fileNumber = FreeFile On Error Resume Next Open mySettingPath For Input As #fileNumber If Err.Number = 0 Then Line Input #fileNumber, text Close #fileNumber ReadMySetting = text End Function
'----- 記録するファイルのパスを取得する '通常は C:\Users\(ユーザー名)\AppData\Roaming\CastFactory\setting.txt 'フォルダがなければ作成 Private Property Get mySettingPath() Dim path With CreateObject("WScript.Shell") path = .specialfolders("AppData") & "" & mySettingFolder End With If Dir(path, vbDirectory) = "" Then MkDir path mySettingPath = path & "" & mySettingFile End Property
これを、実際には次のように用います。
まず、設定内容を項目ごとに sepChar(ここでは ",")で区切った文字列をつくり、先の SaveMySetting を呼んでシステムフォルダーに書き込みます。
読み取る際には、ReadMySetting を呼ぶとその文字列が返ってきますので、sepChar で配列 settingValues に分割します。通常は、その配列を適宜もとの設定項目に代入する、という手はずになります。
ここでは、読み取った設定内容をアクティブシートに表示することにしました。
標準モジュール MainModule
Private Const sepChar = ","
'========== setting の内容 'これは、適当です。設定内容を、"," で区切って記述しておきます。 Private Property Get settingText() Dim settingValues settingValues = Array("abc", 123, "DEF", 4.5678) settingText = Join(settingValues, sepChar) End Property
'========== setting の内容を記録/取得 '記録 Public Sub PushSetting() SaveMySetting settingText End Sub '取得 Public Sub PullSetting() Dim settingValues() As String settingValues = Split(ReadMySetting, sepChar) showSettingValues settingValues End Sub
'試しに、アクティブシート上に取得した setting 内容を記載 Private Sub showSettingValues(sv() As String) Dim index With ActiveSheet.Cells(1, 1) For index = 0 To UBound(sv) .Offset(index, 0).Value = sv(index) Next End With End Sub