• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA このような出力は不可能でしょうか?)

VBAの使用期限を自身のVBEに書き込む方法は不可能?

このQ&Aのポイント
  • VBAで自身のVBEに使用期限を書き込む方法があるかどうか疑問です。
  • 2回目以降のデータ取得が上手くいかない問題が発生しています。
  • 変数の型がうまく取得できず、変な値が表示されてしまっています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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)
回答No.3

VBAの内容をVBAで変更するのは、マクロウィルスと似たような動きですので アンチウィルスソフトやExcel、OS から挙動不審!で叱られるかも (^^ゞ なので 案1 ファイルのプロパティに保存する メニュー→ファイル→プロパティ→ユーザー設定の所。 誰でも見え見えですけど、安直ですかね。 CustomDocumentProperties を調べては? 案2 レジストリに書き込む。 SaveSetting ステートメントや GetSetting 関数をお調べください。

neg69
質問者

お礼

自身に何かを付加→保持しそれを参照すると言う方法であれば何でも良かったのですが、やっぱりどこかにアウトプットするというのが一般論ですよね…それは自分でも解っているのですが、どうしてもアウトプットしない方法を取りたかったものですから。 プロパティに付加するなんて方法もあるんですね。勉強になりました。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

初回起動→電源OFF→電源ON→2回目起動 この間で何が保持できる情報か考えてみるとヒントになるだろう。 ファイル、レジストリ、も何も跡形も残さずにコードだけでするのは厳しい。 イメージでは、 INIファイルみたいなテキストファイル、(あれば参照、なければ作成等) や 最近使ったファイルの情報 や 動的に生成できるもの(日付やユーザ名等の合成で名称されたファイルとか) ただ、 思いつきでいろいろやってうまくいかない、ロス。こんなのサンプルすら少ない。 「保持できない」ものをいろいろやって保持しようとしてもやっぱりできない。 「保持できる」ものを使い方間違うとやっぱりできない。 確実なものをかき集めてみるのが良い。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

こういうのは、ディスクにテキストファイルを作って、レコードとして順次日付を書いていくというので、どうだろうか。 システム的に見渡した場合は、似た発想のことは、多数の場合に行われていると思う。レジストリと言うのもやや似ていると言えないかな。 OSにはユーザー共用の、データを後に引き渡すファイルは特に設けてないと思う。だから私設ファイルだ。 もちろんレコードに日付を書き出すキッカケは、Workbook_Openなどです。 そのファイルがどんどん増えて悪さをする恐れがあるので、防止策を考える必要はあるでしょう。 >VBAによるVBAへの書き込み という質問をしたのが、あなたなら、表題としては、的を得てない。VBAでVBAコードを作ることも、初心者が夢想する場合があるが、そういう場合を連想するので、表題としては不可。 コードに日付を埋め込むにしても、実行後には、後にこのコードで日付が書き換えられないように、抹消したいであろうが、実行中に自分自身のコードを抹消するなど、VBAでは考えないほうが良い。 昔、メモリが極小の時代に機械語レベルではそういうパターンがあったが。

関連するQ&A

専門家に質問してみよう