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

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

VBA このような出力は不可能でしょうか?

Public Function first_date() i = 1 '←追加されるライン kidou = 2011 / 2 / 20   '←追加されるライン If i <> 1 Then With ThisWorkbook.VBProject.VBComponents("Module_first").CodeModule .InsertLines 2, vbTab & "i = 1" .InsertLines 3, vbTab & "kidou = " & Date + 10 End With MsgBox "1回目:起動期限 " & Date + 10 Exit Function Else MsgBox "2回目:起動期限は" & kidou End If End Function このような形でVBAの使用期限を自身のVBE書き込むという事をしたいのですが2回目以降のデータの取得が上手くいきません。 ただ単に変数kidouの型が上手く取得出来ず変な値が出てるだけのようなのですが、こういうデータの取得方法は不可能なのしょうか? 3行目の追加方法として一番ベストな方法を教えて頂ければと思います。色々やってみたのですが上手くいかず困ってます。 よろしくお願い致します。

  • neg69
  • お礼率34% (17/49)

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

  • ベストアンサー
  • 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/17068)
回答No.1

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

関連するQ&A

  • ワード2000のVBAについて

    ワード2000を使っています。 VBAで、ダイアログボックスを開き、指定したファイルのファイル名をフルパスで取得したいのですが、下記のコードでは、ファイル名しか取得できません。 どのようにしたら、フルパスを取得できるのでしょうか? たびたびすみませんが、誰か教えてください。 Dim Name With Dialogs(wdDialogFileOpen) If .Display = -1 Then Name = .Name End If End With MsgBox ("ファイル名は" & Name & "です。")

  • EXCEL2000VBA実践プログラミングリファレス「著者:大村あつし

    EXCEL2000VBA実践プログラミングリファレス「著者:大村あつし、栗山 恵吉、田中 博人、出版社エーアイ出版」のサンブルマクロが動かない。 マクロの初心者です。 私のパソコンはエクセル2007を利用しています。 サンプルマクロを動かす以前に、全てのサンプルに With ThisWorkbook.VBProject.VBComponents("Module1") に黄色のエラーが出てしまいます。 なぜかわかればご教示お願いします。 'コードを表示 Function GetCode(ByVal NowProc As String, ByVal NextProc As String) As String Dim myStartLine As Integer Dim myEndLine As Integer 黄色のエラー箇所⇒With ThisWorkbook.VBProject.VBComponents("Module1") myStartLine = .CodeModule.ProcBodyLine(NowProc, vbext_pk_Proc) If NextProc <> "" Then myEndLine = .CodeModule.ProcStartLine(NextProc, vbext_pk_Proc) Else myEndLine = .CodeModule.ProcCountLines(NowProc, vbext_pk_Proc) + myStartLine End If GetCode = .CodeModule.Lines(myStartLine, myEndLine - myStartLine) End With End Function

  • VBAの書き方を教えてください 3

    何度も申し訳ございません。 以前にもこちらで質問させて頂いている者です。 Sheet1のrange("A1")をVLOOKUPで検索後の文字を取得し、同じ名前のシートを検索し、さらにrange("A1000")をアクティブにしてここからコードをつなげて処理しています。 range("A1")の処理が終わったら、range("A2")の処理に入り、range("A3") range("A4")を続けて処理を行っているのですが、range("A4")でVLOOKUPの検索が空白の場合、On Error GoTo myErrorで次のrange("A5")の処理に入りますが、On Error Gotoは1回のみの処理しかできないみたいで、range("A5")が空白の場合、実行時エラー9が発生してしまいます。 教えて頂いたコードを解読し、On Error Resume Nextなどを使おうとしているのですが、上手くできません。 1から10まで質問しっぱなしなのですが、どなたかご協力を頂けないでしょうか。 とりあえず自分の必要なコードはある程度省いて、2つ分のみ記載します。 本来この後、10回同じ処理を行います。 よろしくお願い致します。 Private Sub 記帳_Click()  On Error GoTo myError1  Dim i As Long  Dim myFlg As Boolean    For i = 1 To worksheets.Count If worksheets(i).Name = Range("A1").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select    ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If myError1: On Error GoTo myError2 For i = 1 To worksheets.Count If worksheets(i).Name = Range("A2").Value Then myFlg = True Exit For End If Next i If myFlg = True Then With worksheets(i) .Activate .Range("A1000").End(xlUp).Select ActiveCell.Offset(1, 0).Select   ActiveCell = Range("J1") ActiveCell.Offset(0, 1).Select ActiveCell = Range("K1") End With Else MsgBox "該当シートなし" End If End sub

  • VBAのFileSearchでFoundFiles(i)の作成日時を取得したい

    タイトルどおりですが、Fileオブジェクトには DateCreatedプロパティーがあるようですが、 どこでこれを使用していいのかわかりません。 したのはHELPのサンプルですが、どうしたらいい ものでしょうか? With Application.FileSearch If .Execute() > 0 Then MsgBox .FoundFiles.Count & _" 個のファイルが見つかりました。" For i = 1 To .FoundFiles.Count Debug.Print .FoundFiles(i) Next i Else MsgBox "検索条件を満たすファイルはありません。" End If End With

  • VBAでスロットを作る

     VBAでゲームを作ろうとしています。まず、手始めに簡単なスロットを作っています。スロットを回転させて止めるまではできたのですがメッセージを出す段階でメッセージが2回、0とiの値が出ます。次のコードなのですが、なぜできないのか、どうすればできるようになるのか教えてください。よろしくお願いします。 Sub SlotLoop_1() Dim i As Long Static Flg As Boolean Flg = Not Flg 'ボタンを使えるようにする With [a1] 'A1を選ぶ Do If Flg = False Then Exit Do i = (i + 1) Mod 10 '(i+1)を10で割った余り。 .Value = i DoEvents Loop End With MsgBox i 'ここが問題 End Sub

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • エクセル VBA MsgBox

    1)下記の記述だと コンボが空白ならエラー表示が出て Okをクリックすると ”記録しますか?” となります! そこをエラー表示されたら UserFormに戻り 空白が無くなったら ”記録しますか?” というMegBoxにしたいのですが どう変化すれば良いのでしょうか? 教えて下さい! Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 If Controls("ComboBox" & i).Text = "" Then MsgBox "選択されていません確認して下さい!", vbInformation, "良く見て下さい!" Exit For End If Next If MsgBox("記録しますか?", vbOKCancel) = vbOK Then With UesrForm From.TextBox1 = Val(UesrFrom.ComboBox1) + _ Val(UesrFrom.ComboBox2) + Val(UesrFrom.ComboBox3) + _ Val(UesrFrom.ComboBox4) + Val(UesrFrom.ComboBox5) From.TextBox2 = Val(UesrFrom.ComboBox6) + _ Val(UesrFrom.ComboBox7) + Val(UesrFrom.ComboBox8) + _ Val(UesrFrom.ComboBox9) + Val(UesrFrom.ComboBox10) End With MsgBox " 記録します!" Unload Me Else MsgBox " キャンセル!!" End If End Sub

  • VBAで教えてください。

    データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub

  • (VBA)フィルタがかかっているかどうかの判断方法

    フィルタがかかっているかどうかを取得したいのですが フィルタがかかっているシートにて Sub test1() If ActiveSheet.FilterMode Then MsgBox "フィルタがかかってます" End If End Sub Sub test1の1() If ActiveSheet.FilterMode = True Then MsgBox "フィルタがかかってます" End If End Sub を実行しても"フィルタがかかってます"は表示されません。 Sub test2() If Rows(1).FilterMode Then MsgBox "フィルタがかかってます" End If End Sub Sub test3() If ActiveSheet.Rows(1).FilterMode Then MsgBox "フィルタがかかってます" End If End Sub こちらは オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) になってしまいます。 フィルタがかかっているか調べる方法はありますか? よろしくお願いします。

  • BASP21を使ってファイル添付メールを送信したい

    basp21 pro(http://www.b21soft.co.jp/basp21/)でメールにファイル添付したいのですが エクセルファイルを添付したいのですが、SendMailで型が一致しませんというエラーが出ます。 教えてください><; ファイル名に指定しているセルCells(i, 28) は =AC3&"\"&AD3 の様に場所を指定しています (AD3 部分が変わっていくので。ここを変えた方がいいでしょうか?) 内容は一部省略しておりますが ↓です Sub SendMailMacro1() Dim szServer, szTo, szFrom, szSubj, szBody, ret, szLogfile, z As String Dim szFile As Variant Dim i, j As Long Dim fs, a As Object On Error GoTo Err_Handler Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("C:\Program Files\log.txt", True) szServer = Worksheets("maildata").Cells(10, 2) szFrom = Worksheets("maildata").Cells(8, 2) With Worksheets("senddata") i = 2 Do While .Cells(i, 1) <> "END" If .Cells(i, 1) = "1" Then If .Cells(i, 3) = "1" Then szTo = .Cells(i, 5) & vbTab & "bcc" & vbTab & .Cells(1, 36) End If szBody = .Cells(i, 26) szSubj = .Cells(i, 25) szFile = .Cells(i, 28) ret = SendMail(szServer, szTo, szFrom, szSubj, szBody, szFile) If Len(ret) <> 0 Then a.WriteLine (Date & " " & Time & " " & ret & "-" & szTo & "-" & szBody) MsgBox "エラー ・・・ " & i & "行目 ( " & ret & ")" .Cells(i, 1) = "エラー" Else .Cells(i, 1) = "完了" End If End If i = i + 1 Loop End With MsgBox "終了" GoTo Exit_sub Err_Handler: MsgBox Err.Description, vbCritical, "Error" GoTo Exit_sub Exit_sub: a.Close End Sub 宜しくお願い致します<(_ _)>

専門家に質問してみよう