Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
パスワード保護のシートを解除するパスワードが正しくなかったときの分岐の書き方
投稿日時: 21/02/25 16:23:29
投稿者: シナモンジンジャー

特定の人だけが入力できるセルがあるために、パスワードを設定したシートを作成しました。パスワードを設定する構文はたくさん見るのですが、パスワードで解除するときのパスワードが正しくなかったときの分岐の構文をなかなか探せませんでした。
試しにパスワードを"5675"に設定してあるシートを作成し、それを解除するマクロを次のように作ってみたのですが、うまくいきません。
どういうふうに書くのが正しいのか分かる方教えてください。
 
Sub 保護解除()
 
' 保護解除 Macro
    Sheets("発信簿").Select
 
  If frmPs.txtLockPw.Text <> "5675" Then
 
  MsgBox "パスワードが正しくありません。" & vbCrLf & "再度入力してください。"
 Exit Sub
 End If
 
  ThisWorkbook.Worksheets("発信簿").Unprotect Password:="5675"
  
 End Sub

回答
投稿日時: 21/02/25 16:56:13
投稿者: WinArrow
投稿者のウェブサイトに移動

このコードでは、ダメなんですか?
 
>うまくいきません。
 
意図する動きが説明されていませんので、
うまくいかない
を推測できません。
 

回答
投稿日時: 21/02/25 17:03:46
投稿者: WinArrow
投稿者のウェブサイトに移動

VBAでエラーを検知したい
ってことでしょうか?
 
サンプルコード

Dim PSW As String

    PSW = InputBox("パスワード入力")
    
    On Error Resume Next
    Sheets("Sheet1").Select
    ActiveSheet.Unprotect Password:=PSW
    If Err <> 0 Then
      MsgBox Err.Description
    Exit Sub
    End If
    On Error GoTo 0

投稿日時: 21/02/25 19:41:35
投稿者: シナモンジンジャー

ご教示ありがとうございます。
作成したリストは、このシートの保護を解除するマクロボタンクリックでパスワードボックスが表示され、そこに5675と入力すると保護が解除されます。ここまではうまくいくのですが、正しくないパスワードを入力した場合は、マクロのエラーでストップしてしまいます。
希望としては「パスワードが正しくありません。再度入力してください。」というコメントが出てマクロを出るというようなリストになっているのですが、
 If frmPs.txtLockPw.Text <> "5675" Then
の部分が構文エラーになっており、マクロを閉じることができません。
構文エラーの表示ではなく、「パスワードが正しくありません。再度入力してください。」というコメントが出てマクロを出るようにしたいのですが、難しいのでしょうか。

回答
投稿日時: 21/02/25 20:04:33
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

発信簿というシートを作成し、シートパスワード「5675」を設定。
frmPsというユーザーフォームを作成。
frmPsにtxtLockPwというパスワード入力用のテキストボックスとコマンドボタンを配置。
コマンドボタン押下時に保護解除を呼び出す。
上記でパスワードが正誤の場合を試してみましたが、希望の動作をしました。
 
構文エラーとのことですが、具体的にはどういうエラーでしょうか?

回答
投稿日時: 21/02/25 20:47:28
投稿者: WinArrow
投稿者のウェブサイトに移動

>frmPs.txtLockPw.Text
が何?なのか説明がないので・・・・・
 
基本的に、このコードは不要と思います。
掲示コードはサンプルなので
紹介したコードを理解して、
エラーメッセージは、自分でお好みに合わせて変えてください。
 

回答
投稿日時: 21/02/26 08:06:03
投稿者: WinArrow
投稿者のウェブサイトに移動

 

引用:
 If frmPs.txtLockPw.Text <> "5675" Then
の部分が構文エラーになっており、マクロを閉じることができません。
 

↑のコードは、あなたが自分で入力した文字列を判断している構文です。
Excelが質問タイトルにある「シート保護解除で、間違った文字列を判断」しているわけではありません。
ですから、「シート保護解除で、間違った文字列を判断」とは別の問題です。
 
何回もいいますが
 「シート保護解除で、間違った文字列を判断」に特化するには、
このコードは不要だと思います。
  

コードの中に、5675 のような文字を記述しない方がよいでしょう。
 悪意の第3者に漏れてしまう可能性があります。
 
 

投稿日時: 21/02/26 21:31:44
投稿者: シナモンジンジャー

ご回答ありがとうございます。
シンプルに保護解除のコードを下のように作っております。これだとパスワード画面の設定は
Office既定のまま表示されるので、これを使えるのですが、パスワードエラーのときに不安要素
があって対応をしたかったのです。
 
Sub 保護解除()
 
' 保護解除 Macro
    Sheets("発信簿").Select
   ActiveSheet.Unprotect '
End Sub
 
パスワード[5675]で保護されたシートを上記のマクロボタンで開くとパスワード入力のダイアロ
グボックスがでてきて、そこに[5675]と入力すれば、保護解除できますが、正しくないパスワー
ドを入力すると、
--------------------------------------------------------------------------
実行時エラー'1004'
入力したパスワードが間違っています。CapsLockキーの状態に注意して、大文字と
小文字が正しく使われていることを確認してください。
終了(E)  デバッグ(D)   ヘルプ(H)
--------------------------------------------------------------------------
というOffice既定コメントボックスが表示されます。このとき[終了]をすると問題は無いです
が、[デバッグ(D)]をクリックするとマクロコードリストが表示されてしまい、これを書き換え
られるとトラブルのもとになるので、パスワード不整合のときOffice既定コメントボックスで
なく、マクロで記載したコメントを表示してマクロから出たいのです。
もし、Office既定コメントボックスに[デバッグ(D)]が表示されないようにできるなら、それで
もかまわないのですが、よろしくご教示ください。
 
 
 

回答
投稿日時: 21/02/26 21:51:44
投稿者: WinArrow
投稿者のウェブサイトに移動

私の提示したコードには、
エラートラップを組み込んであります。
 
Excelが検知したエラーをユーザーが受取り(エラーロラップという)
どのようなエラーなのかを解析する目的です。
エラーの種類はエラーコードで判断できます。
このユーザーとは、あなたのことです。
 
どのようなエラーメッセージにするかは、あなたが考えることです。

回答
投稿日時: 21/02/26 21:58:59
投稿者: WinArrow
投稿者のウェブサイトに移動

ところで、
 
構文エラー
については、
回答者からの質問にも反応がありませんが
進展、または、解決したのですか?

回答
投稿日時: 21/02/26 23:09:03
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一度、エラートラップを使ったコードを紹介します。
 

    On Error Resume Next
    ActiveSheet.Unprotect
    If Err <> 0 Then
        MsgBox "パスワードは間違っています。" & vbLf & _
            "再入力してください。"
    End If
    On Error GoTo 0

 
注意しておきますが、
エラートラップは、いろいろな使い方があるので、十分勉強して使うようお勧めします。
理解しないまま、中途半端に使うと
悩むことに繋がります。

投稿日時: 21/02/27 10:04:06
投稿者: シナモンジンジャー

WinArrow 様
 
何回も丁寧にご説明していただいたのに、リストを転記して実行してもうまく行かずご返事が遅くなりました。
原因は、On Error GoTo 0 のコードの位置が間違っていたことでした。
実際は、マクロから入ったらパスワード入力後に数行を使って書式の設定変更も書いていて、その前に
On Error GoTo 0
を書いていたので、いつも書式の変更の行で実行エラーが出ておりました。
WinArrow 様が7回目で書いていただいたコードを転記して、書式の設定変更の行の後に
On Error GoTo 0
を移動したら、思ったとおりの実行結果になりました。
本当に何回も丁寧にご説明いただきありがとうございました。これで職場での共有データもトラブル無く実行できるとうれしい限りです。下にうまくいったコードを記しておきます。
[シート保護]のボタンは非表示の列に設置しておき、列表示して[シート保護]のボタンが出てくるようにしてあります。●の部分は、保護解除後に確認者が自分の番号を入力し、それを氏名に戻すところです。
*************************************************************
Sub 保護解除()
 
' 保護解除 Macro
    Sheets("発信簿").Select
    
   On Error Resume Next
   ActiveSheet.Unprotect
    If Err <> 0 Then
        MsgBox "パスワードが正しくありません。" & vbLf & _
            "再度入力してください。"
    End If
 
' パスワード保護のボタンを表示させる
    Columns("J:J").ColumnWidth = 1.33
    Columns("K:L").ColumnWidth = 8.33
 
' 書式で非表示になっていた番号を氏名に戻す
     Range("I4:I2003").NumberFormatLocal = "[=12]""●永"";[=21]""竹●"";""●園"""
     On Error GoTo 0
  
End Sub
************************************************************