エクセルの認証設定
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