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

解決したいこと

エクセルのVBAマクロを設定したファイルについて
認証設定をしています。
・自分で調べた結果Sheet1.Range("A2")にライセンスキーを入れるような設定になりました。

運用:

(1)Sheet1.Range("A2") を空にした状態でブックを開く

・期待動作: すべてのシートが非表示になり、UserForm3 が表示される。
ライセンスキーを入力すると通常通り動作する。
★UserForm3はライセンスキーを入力するようになっています。

(2)Sheet1.Range("A2") に正しいライセンスキーを記載した場合

・期待動作: 認証成功メッセージが表示され、すべてのシートが表示される。

(3)アクティブシートを変更した場合の挙動

他のシートをアクティブにして再度開いた場合でもエラーが発生しない。

この方針で以下の<ThisWorkbook>に以下ソースを設定しましたが、エラーが出ます。

Private Sub Workbook_Open()
    Dim ws As Worksheet
    Dim licenseKey As String

    ' シートにライセンスキーが保存されているか確認
    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 sheet.Visible <> xlSheetVeryHidden Then
                sheet.Visible = xlSheetVeryHidden
            End If
        Next sheet

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

        ' ユーザーに通知
        MsgBox "ライセンス認証が必要です。このブックは利用できません。", vbCritical

        ' ブックを閉じる
        Application.OnTime Now + TimeValue("00:00:01"), "CloseWorkbook"
    Else
        ' 認証成功
        MsgBox "ライセンス認証に成功しました。", vbInformation
        ShowAllSheets
    End If
End Sub

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


●エラーメッセージ:
実行時エラー’1004’
’Visible’メソッドは失敗しました:’Worksheet’オブジェクト

該当するエラーソースコード

sheet.Visible = xlSheetVeryHidden

↓以下コードの3行目がエラー↓

' シートが非表示可能な状態の場合のみ処理
            If sheet.Visible <> xlSheetVeryHidden Then
                sheet.Visible = xlSheetVeryHidden
                

備考

当該エクセルブック、シート共に保護設定はしていません。

対処方法ご存じの方いらっしゃいましたら
お教えいただけます様よろしくお願い申し上げます。

0

1Answer

すべてのシートを非表示にできない為ではないでしょうか。
最低、1シートは表示のままとするようにしてみてはどうでしょう。

1Like

Comments

  1. @qii-yah

    Questioner

    @nak435さま

    この度も早々にご連絡いただきありがとうございます。
    ●最低、1シートは表示のままとするようにしてみてはどうでしょう。
    ➡' 最初に表示するシートを設定(必ず非表示にしないシートを指定)
    Set firstSheet = ThisWorkbook.Sheets(1)
    firstSheet.Activate
    この設定で表示のままにするように設定しているつもりなのですが
    上手くいかないのです。

    よろしくお願い申し上げます。

  2. この設定で表示のままにするように設定しているつもりなのですが
    上手くいかないのです。

    それでは、なっていません。
    次のように変更してみてください。

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

    Questioner

    @nak435 さま
    エラー解消できました!
    いつも本当に的確にありがとうございます!

  4. @qii-yah

    Questioner

    @nak435 さま
    何度もすみません。
    先ほどのエラーは解消されたのですが
    次のエラー(別のソース)が発生しています。
    (先ほどのファイルの実行後、Userformに移動し
    Userformでエラーがでています。)

    教えていただくことは可能でしょか?
    何卒、よろしくお願い申し上げます。

    ●エラーメッセージ:
    コンパイルエラー
    SubまたはFunctionが定義されていません。

    ’Visible’メソッドは失敗しました:’Worksheet’オブジェクト

    ●エラー対象ソースコード:
    ' シートを表示
    Call ShowAllSheets

    ●UserFormに記述したソース全体:
    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 ShowAllSheets
        
        ' ユーザーフォームを閉じる
        Me.Hide
    Else
        ' 認証失敗
        MsgBox "ライセンスキーが無効です。", vbCritical
    End If
    

    End Sub

  5. privateになっているので、外から呼び出せないのでは?

    - Private Sub ShowAllSheets()
    + Public Sub ShowAllSheets()
    
  6. @qii-yah

    Questioner

    はい。私もそうかと思い、<ThisWorkbook>のソースの中の一部を変更したのですが
    まだ、同じエラーが続くのです。

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

    どこが原因なのでしょうか?
    いつも申し訳ありません。

Your answer might help someone💌