qii-yah
@qii-yah

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

エクセルの認証設定

Q&A

解決したいこと

エクセルの認証設定が上手くいきません。
ご存じの方、教えていただけます様、
よろしくお願い申し上げます。

●期待する動作は以下です。

(1)正常なライセンス認証
・Sheet1 のセル A2 に正しいライセンスキー (VALID_LICENSE_KEY) が記述されている場合、認証成功メッセージを表示し、ブックを利用可能にする。
・認証が成功した場合でも、UserForm3 が表示されるのは不要。

(2)ライセンス未登録または無効な場合
・UserForm3 を開いてライセンスキーを入力させる。
・入力後に正しいキーが提供されれば認証成功、シートを表示。
・正しいキーが提供されなければ、シートを隠し、ブックを閉じる。

(3)エラー発生の防止
・Sheet1 のセル A2 が空の場合でもエラーが発生せず、正常に未認証処理が行われる。

これらの<期待する動作>が実現できるように、以下3か所にソースコードを記述しました。
しかし、
UserForm3が表示され、正しいライセンスキーを入力すると
<ライセンス認証に成功しました。>というメッセージが表示され、一旦、ファイルが通常通り開きますが、
OKボタンをクリックすると
<ライセン認証が必要です。このブックは利用できません。>というメッセージが表示され、全てのシートが隠れ、
マクロの操作画面(編集画面)へも接続できない状況になります。(エクセル自体のシートが0の状態)となり
復活できない状況になります。

★UserForm3が表示され、正しいライセンスキーを入力できないときも、
<ライセン認証が必要です。このブックは利用できません。>というメッセージが表示され、全てのシートが隠れ、
マクロの操作画面(編集画面)へも接続できない状況になります。(エクセル自体のシートが0の状態)となり
復活できない状況になります。

<ThisWorkbook>に記述したソースコード:

Private Sub Workbook_Open()
    Dim ws As Worksheet
    Dim licenseKey As String
    Static isAuthenticated As Boolean ' 認証状態を保持するフラグ

    ' 認証済みの場合、処理をスキップ
    If isAuthenticated Then
        ShowAllSheets
        Exit Sub
    End If

    ' シートにライセンスキーが保存されているか確認
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(1)
    licenseKey = ws.Range("A2").Value
    On Error GoTo 0

    ' ライセンスキーが存在しない、または無効な場合
    If licenseKey = "" Or Not IsLicenseValid(licenseKey) Then
        Dim sheet As Worksheet
        Dim firstSheet As Worksheet
        
        ' 最初に表示するシートを設定(必ず非表示にしないシートを指定)
        Set firstSheet = ThisWorkbook.Sheets(1)
        firstSheet.Activate

        For Each sheet In ThisWorkbook.Sheets
            ' 非表示可能な状態の場合のみ処理
            If firstSheet.Name <> sheet.Name Then
                sheet.Visible = xlSheetVeryHidden
            End If
        Next sheet

        ' ユーザーフォームを表示
        UserForm3.Show

        ' ユーザーフォームが閉じられた後、認証済みなら終了
        If isAuthenticated Then Exit Sub

        ' 認証失敗時の通知とブックの閉じる処理
        MsgBox "ライセンス認証が必要です。このブックは利用できません。", vbCritical
        Application.OnTime Now + TimeValue("00:00:01"), "CloseWorkbook"
    Else
        ' 認証成功
        isAuthenticated = True
        MsgBox "ライセンス認証に成功しました。", vbInformation
        ShowAllSheets
    End If
End Sub

' 非表示解除のロジック
Public Sub ShowAllSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ws.Visible = xlSheetVisible
    Next ws
End Sub

<UserForm3>に記述したソースコード:

Option Explicit
Private Sub CommandButton1_Click()
    Dim userKey As String
    Dim ws As Worksheet

    ' 入力されたライセンスキーを取得
    userKey = TextBox1.Text

    ' ライセンスキーを検証
    If IsLicenseValid(userKey) Then
        ' 認証成功
        MsgBox "ライセンス認証に成功しました。", vbInformation

        ' ライセンスキーをシートに保存
        Set ws = ThisWorkbook.Sheets(1)
        ws.Range("A2").Value = userKey

        ' 認証状態を更新
        Call SetAuthenticatedFlag(True)

        ' シートを表示
        ThisWorkbook.ShowAllSheets

        ' ユーザーフォームを閉じる
        Me.Hide
    Else
        ' 認証失敗
        MsgBox "ライセンスキーが無効です。", vbCritical
    End If
End Sub

<標準モジュール>に記述したソースコード:

Option Explicit

' ライセンスキーを検証する関数
Public Function IsLicenseValid(userKey As String) As Boolean
    ' 正しいライセンスキー
    Const VALID_LICENSE_KEY As String = "VALID_LICENSE_KEY"

    ' 入力キーを検証
    IsLicenseValid = (userKey = VALID_LICENSE_KEY)
End Function

' 認証状態を操作するための関数
Public Sub SetAuthenticatedFlag(value As Boolean)
    Static isAuthenticated As Boolean
    isAuthenticated = value
End Sub

' ブックを閉じる処理
Public Sub CloseWorkbook()
    ThisWorkbook.Close SaveChanges:=False
End Sub

0

1Answer

(エクセル自体のシートが0の状態)となり復活できない状況になります。

<標準モジュール>の最後のCloseWorkbook()によって、ワークブックがクローズされるからです。
Excelを一旦終了して、マクロを無効状態で当ワークブックを開き、ThisWorkbook.Close SaveChanges:=Falseをコメントにして(代わりにprintでも入れて)デバッグされてはどうでしょうか?

1Like

Comments

  1. UserForm3が表示され、正しいライセンスキーを入力すると
    <ライセンス認証に成功しました。>というメッセージが表示され、一旦、ファイルが通常通り開きますが、
    OKボタンをクリックすると
    <ライセン認証が必要です。このブックは利用できません。>というメッセージが表示され

    この原因は、次の if文において、isAuthenticated が false だからです。

            ' ユーザーフォームが閉じられた後、認証済みなら終了
            If isAuthenticated Then Exit Sub
    
  2. この原因は、次の if文において、isAuthenticated が false だからです。

    さらに、この原因は、

    <ThisWorkbook>のWorkbook_Open()と<標準モジュール>のSetAuthenticatedFlag()で宣言したisAuthenticatedはそれぞれ別物であるためです。

    同一実態を期待されていると思いますが、そのためには、両関数からisAuthenticatedの宣言を削除して、代わりに、<標準モジュール>の2行目に、次の1行を追加します。

    Global isAuthenticated As Boolean
    
  3. @qii-yah

    Questioner

    @nak435 さま

    引き続きアドバイスありがとうございます。
    今、少し混乱していますので
    明日、再度整理し、ご報告させていただきます。
    いつもありがとうございます。

  4. @qii-yah

    Questioner

    @nak435さま

    おはようございます。
    まず、現状の結果ですが、

    <(エクセル自体のシートが0の状態)となり復活できない状況になる。>
    現象はなくなりました!
    本当にありがとうございます!

    次に、

    ●この原因は、次の if文において、isAuthenticated が false だからです。
    ●さらに、この原因は、
    ●<ThisWorkbook>のWorkbook_Open()と<標準モジュール>のSetAuthenticatedFlag()で宣言したisAuthenticatedはそれぞれ別物であるためです。
    ●同一実態を期待されていると思いますが、そのためには、両関数からisAuthenticatedの宣言を削除して、代わりに、<標準モジュール>の2行目に、次の1行を追加します。
    ●Global isAuthenticated As Boolean

    ➡これらをすべて記述変更しましたら
    <Global isAuthenticated As Boolean>に対してエラーがでましたので
    この箇所を元に戻してみました。

    そうしますと、
    <ライセン認証が必要です。このブックは利用できません。>というメッセージが表示されますが
    このダイアログを閉じると通常のファイルに戻ります。

    ➡現時点での不具合は、
    ライセンスキーが正しくても、誤ていても最後に
    <ライセン認証が必要です。このブックは利用できません。>というメッセージが表示されるという状況です。

    これをなくすには、どうすれば宜しいでしょうか。
    本当に何度も申し訳ありません。

    念の為、以下に最新の記載コードを基準させていただきます。
    何卒よろしくお願い申し上げます。

    e.jpg

  5. @qii-yah

    Questioner

    <ThisWorkbook>に記述したソースコード:
    Private Sub Workbook_Open()
    Dim ws As Worksheet
    Dim licenseKey As String

    ' 認証済みの場合、処理をスキップ
    If isAuthenticated Then
        ShowAllSheets
        Exit Sub
    End If
    
    ' シートにライセンスキーが保存されているか確認
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(1)
    licenseKey = ws.Range("A2").value
    On Error GoTo 0
    
    ' ライセンスキーが存在しない、または無効な場合
    If licenseKey = "" Or Not IsLicenseValid(licenseKey) Then
        Dim sheet As Worksheet
        Dim firstSheet As Worksheet
        
        ' 最初に表示するシートを設定(必ず非表示にしないシートを指定)
        Set firstSheet = ThisWorkbook.Sheets(1)
        firstSheet.Activate
    
        For Each sheet In ThisWorkbook.Sheets
            ' 非表示可能な状態の場合のみ処理
            If firstSheet.Name <> sheet.Name Then
                sheet.Visible = xlSheetVeryHidden
            End If
        Next sheet
    
        ' ユーザーフォームを表示
        UserForm3.Show
    
        ' ユーザーフォームが閉じられた後、認証済みなら終了
        If isAuthenticated Then Exit Sub
    
        ' 認証失敗時の通知とブックの閉じる処理
        MsgBox "ライセンス認証が必要です。このブックは利用できません。", vbCritical
        Application.OnTime Now + TimeValue("00:00:01"), "CloseWorkbook"
    Else
        ' 認証成功
        isAuthenticated = True
        MsgBox "ライセンス認証に成功しました。", vbInformation
        ShowAllSheets
    End If
    

    End Sub

    ' 非表示解除のロジック
    Public Sub ShowAllSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
    ws.Visible = xlSheetVisible
    Next ws
    End Sub

  6. @qii-yah

    Questioner

    <UserForm3>に記述したソースコード:
    Option Explicit
    Private Sub CommandButton1_Click()
    Dim userKey As String
    Dim ws As Worksheet

    ' 入力されたライセンスキーを取得
    userKey = TextBox1.Text
    
    ' ライセンスキーを検証
    If IsLicenseValid(userKey) Then
        ' 認証成功
        MsgBox "ライセンス認証に成功しました。", vbInformation
    
        ' ライセンスキーをシートに保存
        Set ws = ThisWorkbook.Sheets(1)
        ws.Range("A2").value = userKey
    
        ' 認証状態を更新
        Call SetAuthenticatedFlag(True)
    
        ' シートを表示
        ThisWorkbook.ShowAllSheets
    
        ' ユーザーフォームを閉じる
        Me.Hide
    Else
        ' 認証失敗
        MsgBox "ライセンスキーが無効です。", vbCritical
    End If
    

    End Sub

    Private Sub UserForm_Click()

    End Sub

  7. @qii-yah

    Questioner

    <標準モジュール>に記述したソースコード:
    Option Explicit

    ' ライセンスキーを検証する関数
    Public Function IsLicenseValid(userKey As String) As Boolean
    ' 正しいライセンスキー
    Const VALID_LICENSE_KEY As String = "VALID_LICENSE_KEY"

    ' 入力キーを検証
    IsLicenseValid = (userKey = VALID_LICENSE_KEY)
    

    End Function

    ' 認証状態を操作するための関数
    Public Sub SetAuthenticatedFlag(value As Boolean)
    Static isAuthenticated As Boolean
    isAuthenticated = value
    End Sub

    ' ブックを閉じる処理
    Public Sub CloseWorkbook()
    'ThisWorkbook.Close SaveChanges:=False
    End Sub

Your answer might help someone💌