- ベストアンサー
VBAの使用期限を自身のVBEに書き込む方法は不可能?
- VBAで自身のVBEに使用期限を書き込む方法があるかどうか疑問です。
- 2回目以降のデータ取得が上手くいかない問題が発生しています。
- 変数の型がうまく取得できず、変な値が表示されてしまっています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私個人としては、#3の CustomDocumentPropertiesをお勧めしますが、いずれにしても、サンプル・コードでも書かなければ、話は進まないと思います。 問題点は、「起動期限」を越えた時に、場合によっては、自己破壊マクロを置かないといけないような気がします。例えば、Batchファイルなどを生成して、そこで、それで、実行させるとか考えられるけれども、アンチウィルスソフトに阻止される可能性が高いです。簡単だと思っても、相手は知らないのだから、ちょっとしたトリッキーな工夫をすれば可能だとは思います。 VBAで、VBAコードを書き換える方法は、辞めたほうがよいです。コードを隠しても、見え見えになってしまいますから、常識的なユーザーからは拒否されてしまいます。 もちろん、iniファイルの再生成を拒むようにするには、やはりレジストリに暗号化したファイルの書き込みが必要だと思います。SaveSettingは、簡単ですから、比較的、見つけられやすいです。あまり、複雑なことをするには、CA付きのデジタル証明が必要です。 '// '文字数制限のために、Win32 APIは、それぞれ入れてください。(Private キーワードにしてください) WritePrivateProfileString GetPrivateProfileString Private Sub FirstIniWrite() Dim sFN As String Dim sName As String Dim myKey As String Dim msg As String Dim Ret As Long Dim mDate As Variant Const vbMyError As Integer = 513 On Error GoTo ErrHandler fn = ThisWorkbook.Name fn = Left(fn, InStrRev(fn, ".") - 1) 'デフォルトでは、C:\Windows フォルダ sFN = Application.DefaultFilePath & "\" & fn & ".ini" If Dir(sFN) <> "" Then msg = iniRead(sFN) If Len(msg) < 2 Then Err.Raise vbMyError Else mDate = msg End If Else sName = "Test" myKey = "Key1" msg = Format$(Date + 10, "yyyymmdd") Ret = WritePrivateProfileString(sName, myKey, msg, sFN) If Ret = 0 Then MsgBox "iniファイルの作成に失敗ししまた。", vbCritical Err.Raise vbMyError End If End If msg = Format(msg, "0000/00/00") If DateValue(msg) >= Date Then MsgBox "使用期限は" & CDate(msg) & "までです。", vbInformation Else MsgBox "使用期限は過ぎました。", vbExclamation End If Exit Sub ErrHandler: MsgBox "エラーが発生しています。", vbCritical End Sub Private Function iniRead(ByVal sFN As String) As String Dim sName As String, myKey As String, mSize As Long, nRetStr As String, default As String Dim Ret As Long Dim getRetStr As String sName = "Test" myKey = "Key1" nRetStr = String(256, Chr(0)) mSize = Len(nRetStr) Ret = GetPrivateProfileString(sName, myKey, default, nRetStr, mSize, sFN) iniRead = Mid(nRetStr, 1, InStr(nRetStr, vbNullChar) - 1) End Function
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
VBAの内容をVBAで変更するのは、マクロウィルスと似たような動きですので アンチウィルスソフトやExcel、OS から挙動不審!で叱られるかも (^^ゞ なので 案1 ファイルのプロパティに保存する メニュー→ファイル→プロパティ→ユーザー設定の所。 誰でも見え見えですけど、安直ですかね。 CustomDocumentProperties を調べては? 案2 レジストリに書き込む。 SaveSetting ステートメントや GetSetting 関数をお調べください。
- layy
- ベストアンサー率23% (292/1222)
初回起動→電源OFF→電源ON→2回目起動 この間で何が保持できる情報か考えてみるとヒントになるだろう。 ファイル、レジストリ、も何も跡形も残さずにコードだけでするのは厳しい。 イメージでは、 INIファイルみたいなテキストファイル、(あれば参照、なければ作成等) や 最近使ったファイルの情報 や 動的に生成できるもの(日付やユーザ名等の合成で名称されたファイルとか) ただ、 思いつきでいろいろやってうまくいかない、ロス。こんなのサンプルすら少ない。 「保持できない」ものをいろいろやって保持しようとしてもやっぱりできない。 「保持できる」ものを使い方間違うとやっぱりできない。 確実なものをかき集めてみるのが良い。
- imogasi
- ベストアンサー率27% (4737/17069)
こういうのは、ディスクにテキストファイルを作って、レコードとして順次日付を書いていくというので、どうだろうか。 システム的に見渡した場合は、似た発想のことは、多数の場合に行われていると思う。レジストリと言うのもやや似ていると言えないかな。 OSにはユーザー共用の、データを後に引き渡すファイルは特に設けてないと思う。だから私設ファイルだ。 もちろんレコードに日付を書き出すキッカケは、Workbook_Openなどです。 そのファイルがどんどん増えて悪さをする恐れがあるので、防止策を考える必要はあるでしょう。 >VBAによるVBAへの書き込み という質問をしたのが、あなたなら、表題としては、的を得てない。VBAでVBAコードを作ることも、初心者が夢想する場合があるが、そういう場合を連想するので、表題としては不可。 コードに日付を埋め込むにしても、実行後には、後にこのコードで日付が書き換えられないように、抹消したいであろうが、実行中に自分自身のコードを抹消するなど、VBAでは考えないほうが良い。 昔、メモリが極小の時代に機械語レベルではそういうパターンがあったが。
お礼
自身に何かを付加→保持しそれを参照すると言う方法であれば何でも良かったのですが、やっぱりどこかにアウトプットするというのが一般論ですよね…それは自分でも解っているのですが、どうしてもアウトプットしない方法を取りたかったものですから。 プロパティに付加するなんて方法もあるんですね。勉強になりました。