マクロを含んだエクセルのプログラムがあります。

これを、試用期間1週間などの時間制限を設けることはできるでしょうか。
イメージとしては、シェアウェアソフトの使用制限のような機能をつけたいのです。
よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/01/18 02:50:50
  • 終了:2008/01/19 03:18:06

ベストアンサー

id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422008/01/19 03:00:58

ポイント35pt

サンプルです。


レジストリに値をセットするにはSaveSettingを使います。

取得するにはGetSettingを使います。


以下のサンプルでは、最初にレジストリの値を取得し、まだ存在しない場合は始めて実行したと認識して、今日の日付をレジストリに書き込みます。

既に実行済みの場合は最初に実行された日付が取得できます。

今日の日付(Now())と比較して所定の日数を過ぎているかどうかチェックして、過ぎている場合はメッセージを表示したりして、実行せずにマクロを終了します。


Sub test()

    Dim t As String
    Dim dt As Date

    t = GetSetting("TestApp", "TestSection", "WindowX")
    If t = "" Then
        ' レジストリ値がない。初めて実行されたと認識し、今日の日付をセット
        t = Format(CLng(Now()))
        SaveSetting "TestApp", "TestSection", "WindowX", t
        ' ダミーのランダム値をセット
        SaveSetting "TestApp", "TestSection", "WindowY", Right$(Str(CDbl(Now())), 5)
    End If
    dt = CLng(t)
    
    If Now() > dt + 7 Then
        ' 初めて実行された日から7日以上経っている
        MsgBox "試用期間が過ぎました"
        Exit Sub
    End If

    
    ' ------------------------------------
    ' ここ以降に試用する処理を書く
    ' ------------------------------------

    MsgBox "試用プログラム"

End Sub

TestAppとかTestSectionは適当な名前に変更してください。

WindowXに日付をセットしています。(名前はカモフラージュで全然関係ない名前にしています)

WindowYにダミーのランダム値をセットしています。


また、マクロをパスワードで保護しておけばコードを見られることはありませんので、パスワードを突破されない限りどのように使用制限しているか調べようがなくなりますので回避されにくくなります。

マクロコードを隠す方法


ただしちょっと詳しい人であればレジストリを監視するツールを使ったり、レジストリ名を推測して回避されてしまうかもしれません。万全ではありませんがその辺はやむをえないと思います。

ささやかな抵抗として以下のようなものが考えられます。

  • レジストリのキー名を一見して関係なさそうな名前にしておく
  • ダミーで複数の値をセットする
  • 意味が一見してわからないようにする(サンプルでは、一見して日付とわからないよう数字でレジストリにセットしています。もっと複雑にすることもできます)
id:clinejp

詳しく解説していただきありがとうございました。

さっそく試してみます。

2008/01/19 03:17:50

その他の回答(1件)

id:degucho No.1

degucho回答回数246ベストアンサー獲得回数622008/01/18 10:26:24

ポイント35pt

VBA正攻法でいくなら初回起動時に日付を書き込んでおくとかでしょうか

http://officetanaka.net/excel/vba/tips/tips43.htm

応用すればライセンスキーの仕組みなんかも作れると思います


自分でレジストリをいじるようなひとには無意味かもしれませんが

(データを暗号化して消すだけではダメにするとかで対抗できるかな)

他のキーは権限の関係や手順(API)が面倒です

id:clinejp

なるほど、レジストリですか・・・。

なるほど。

すいませんが、具体例を挙げていただけると助かるんですが・・・。

2008/01/18 13:29:45
id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422008/01/19 03:00:58ここでベストアンサー

ポイント35pt

サンプルです。


レジストリに値をセットするにはSaveSettingを使います。

取得するにはGetSettingを使います。


以下のサンプルでは、最初にレジストリの値を取得し、まだ存在しない場合は始めて実行したと認識して、今日の日付をレジストリに書き込みます。

既に実行済みの場合は最初に実行された日付が取得できます。

今日の日付(Now())と比較して所定の日数を過ぎているかどうかチェックして、過ぎている場合はメッセージを表示したりして、実行せずにマクロを終了します。


Sub test()

    Dim t As String
    Dim dt As Date

    t = GetSetting("TestApp", "TestSection", "WindowX")
    If t = "" Then
        ' レジストリ値がない。初めて実行されたと認識し、今日の日付をセット
        t = Format(CLng(Now()))
        SaveSetting "TestApp", "TestSection", "WindowX", t
        ' ダミーのランダム値をセット
        SaveSetting "TestApp", "TestSection", "WindowY", Right$(Str(CDbl(Now())), 5)
    End If
    dt = CLng(t)
    
    If Now() > dt + 7 Then
        ' 初めて実行された日から7日以上経っている
        MsgBox "試用期間が過ぎました"
        Exit Sub
    End If

    
    ' ------------------------------------
    ' ここ以降に試用する処理を書く
    ' ------------------------------------

    MsgBox "試用プログラム"

End Sub

TestAppとかTestSectionは適当な名前に変更してください。

WindowXに日付をセットしています。(名前はカモフラージュで全然関係ない名前にしています)

WindowYにダミーのランダム値をセットしています。


また、マクロをパスワードで保護しておけばコードを見られることはありませんので、パスワードを突破されない限りどのように使用制限しているか調べようがなくなりますので回避されにくくなります。

マクロコードを隠す方法


ただしちょっと詳しい人であればレジストリを監視するツールを使ったり、レジストリ名を推測して回避されてしまうかもしれません。万全ではありませんがその辺はやむをえないと思います。

ささやかな抵抗として以下のようなものが考えられます。

  • レジストリのキー名を一見して関係なさそうな名前にしておく
  • ダミーで複数の値をセットする
  • 意味が一見してわからないようにする(サンプルでは、一見して日付とわからないよう数字でレジストリにセットしています。もっと複雑にすることもできます)
id:clinejp

詳しく解説していただきありがとうございました。

さっそく試してみます。

2008/01/19 03:17:50
  • id:KuroNeko666
    僕が作るなら…

    ~案1~
    初回起動時に、開発者用環境であるかチェックして、なければ新規シートに時刻を書き込む。
    そのシートは不可視にしてパスワードの保護。
    次回起動時からは、そのシートの時刻をチェックするとか。

    ~案2~
    初回起動時、VBAでVBA自身を書き換える。
    (YYYYMMDDという数値を起動時の日付とかに)
    さらに、ユーザ登録の過程でもういちどVBA自身のコードを書き換える。
    これもフラグ的な要素。
    あまりスマートではない方法だけれど(^_^;

    レジストリに意味もなく初回起動時の日付を登録しておくと、いい感じで勘違いしてくれそう。
    ふたつそろって初めて有効になる方法でも面白い
    (「内部で不正な処理が発生しました。次のコードを開発者へ送信してください。--412」とメッセージがでるとか)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません