2017-09-03 15 views
1

ワークシートの名前(「日付」)があります。このワークシートを非表示にし、パスワードのみで表示します。 Application.ActiveSheet.Visible = False/True。Userformパスワードはワークシートの表示を非表示にします

私はユーザーフォームの設定をしています。以下は私のフォームの背後にあるコードです。

enter image description here

Private passwordStatus As Boolean 

Private Sub CommandButton1_Click() 
    Dim a As String 
    Dim Password As String 

    a = "123" 
    Password = TextBox1.Text 
    'Set Pawwordstatus at False before Testing 
    passwordStatus = False 
    If Password = a Then 
     MsgBox "Password Correct.", vbInformation 
     passwordStatus = True 
     Unload Me 
    Else 
     MsgBox "Password Incorrect. Please try again.", vbCritical 
    End If 
End Sub 

Function checkPassword() As Boolean 
    UserForm1.Show 
    'Shows the User Form. And after Closing the Form 
    'The PasswordStatus Value will be returned and you can check if 
    'it is true 
    checkPassword = passwordStatus 
End Function 

問題:私は毎回、ユーザーがユーザーフォームを示すとパスワードは、アクセス要求され、このワークシートにアクセスしようとしたというのが私のワークシートイベントの後ろに書くことがどのようなコードを確認していません。

私ははThisWorkbookの背後に、このコードを持っている:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    Worksheets("Dates").Visible = False 

    'must save, if not save, it is not effect. 
    Me.Save 

End Sub 

答えて

0

はまず、標準ModuleThisWorkBookモジュールが追加で

Public LastActiveSht As Worksheet 
Public IsPassword As Boolean 

その後、パブリック変数を宣言し

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 
    Set LastActiveSht = Sh 
End Sub 

Sub Workbook_SheetActivate(ByVal Sh As Object) 
    If Sh.Name = "Dates" Then 
     LastActiveSht.Activate 
     Application.EnableEvents = False 
     IsPassword = False 
     UserForm1.Show 
     Application.EnableEvents = True 
    End If 
End Sub 

あなたUserForm1ためCommandButton1_Clickは大丈夫そうですが、私は

としてそれを少し変更しました
Private Sub CommandButton1_Click() 
    Dim a As String 

    a = "aaa" 
    Password = TextBox1.Text 
    If Password = a Then 
     MsgBox "Password Correct.", vbInformation 
     IsPassword = True 
     Unload Me 
    Else 
     MsgBox "Password Incorrect. Please try again.", vbCritical 
    End If 
End Sub 

今、シートを非表示にしたり、それが見えないようにする必要はありません、あなたの上に使用が、毎回シート:ユーザーがUserForm1でのCLOSEボタンをクリックしたときに処理するために、USERFORMモジュール

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    If IsPassword Then LstSht.Activate 
End Sub 

NOTEに次のコードを追加しますDatesが選択されている場合は、正しいパスワードを入力する必要があります。

+0

これに感謝します。このワークブックでLstSht.Activateに「オブジェクトが必要です」というエラーが表示されています。 – James

+0

@James - Oopa!私の間違い。 'LstSht.Activate'は' LastActiveSht.Activate'になります – Mrig

+0

もう一度素晴らしい仕事に感謝します – James

1

があればxlVeryHiddenに与えられたワークシートのVisibleプロパティを設定すると、ブックのオープンイベントにパスワードフォームを表示するには、イベントを保存して、前にワークブックを使用しますパスワードは正しいです。

このようにしてファイルを保存すると非表示になり、パスワードを開いたユーザーだけが表示されるようになります。

0

これはパスワードフォームの呼び出しです。ボタン(ActiveXコントロール)があるワークシートのコードシートにインストールします。それは

Private Sub CommandButton1_Click() 

    Dim PwForm As UserForm1 
    Dim a As String 
    Dim Password As String 

    Set PwForm = New UserForm1 
    With PwForm 
     .Tag = Password 
     .Show 
     If .Tag = 1 Then 
      ' show & activate (select) the hidden sheet 
     End If 
    End With 
    Unload PwForm 
    Set PwForm = Nothing 
End Sub 

このコードは、以下に示す機能Passwordを呼び出します(たとえば、CmdPasswordとして、私は意味のある名前を与えるだろう、)のCommandButton1のクリックに反応します。上記の手順と同じコードシートにインストールしてください。

Private Function Password() As String 
    ' 03 Sep 2017 

    Dim Fun As String 
    Dim PwArr As Variant 
    Dim i As Long 

    PwArr = Array(80, 97, 115, 115, 119, 111, 114, 100) 
    For i = 0 To UBound(PwArr) 
     Fun = Fun & Chr(PwArr(i)) 
    Next i 
    Password = Fun 
End Function 

パスワードを偽装しようとします。配列はサブCallCreatePasswordによって作成されます。これと呼び出す関数CreatePasswordは、プロジェクトの一部である必要はありません。このコードは他の場所に置くことができます。それがどこにあっても、それは標準コードモジュール上にあり、その下に呼び出される関数でなければなりません。

Private Sub CallCreatePassword() 
    ' 03 Sep 2017 

    ' =================================================== 
    ' Use this sub to call the CreatePassword sub 
    ' which will print a string of numbers to the Immediate window. 
    ' Paste that string into the PwArr array in the function Password 
    ' =================================================== 

    CreatePassword ("Password")    ' enter the password of your choice 
End Sub 

Private Sub CreatePassword(ByVal Pw As String) 
    ' 03 Sep 2017 

    Dim Fun() As String 
    Dim i As Integer 

    ReDim Fun(0 To Len(Pw) - 1) 
    For i = 1 To Len(Pw) 
     Fun(i - 1) = Asc(Mid(Pw, i, 1)) 
    Next i 
    Debug.Print Join(Fun, " ,") 
End Sub 

クリックしてください。手順に戻る。そのフォームを表示する前に、パスワードがフォームのTagプロパティに書き込まれます。 Showコマンドを使用すると、コントロールがユーザーフォームに渡されます。このprocのコードは、ユーザーフォームのHideコマンドの後にのみ実行され続けます。

ユーザーフォームには2つのボタンがあります(あなたのようなものではありません)。両方ともHideコマンドを含みますが、1または0のいずれかをTagプロパティに設定します。これらの手順は両方とも、Userform1のコードシートにインストールする必要があります。

Private Sub CmdCancel_Click() 

    Tag = "" 
    Hide 
End Sub 

Private Sub CmdOK_Click() 
    ' 03 Sep 2017 

    With TextBox1 
     If .Text = Tag Then 
      Tag = 1 
      Hide 
     Else 
      MsgBox "This password is not correct." & vbCr & _ 
        "Press ""Cancel"" to exit." 
      .Text = "" 
      .SetFocus 
     End If 
    End With 
End Sub 

フォームが非表示になった後、クリック手順は続行されます。タグの値= 1(実際には文字列)の場合、非表示のワークシートが表示され、アクティブになります。そうではありません。いずれの場合も、手順は終了する。

シートをVeryHiddenにするには、Before_Closeを発生させるイベントプロシージャを追加します。

+0

上記のコードに感謝します。このコード全体がユーザーフォームの背後にあるのですか? – James

+0

私は次のコードでエラーになっています:オートメーションエラー:呼び出し先(サーバー{サーバーアプリケーションではない})は利用できず消えました。すべての接続が無効です。呼び出しが実行された可能性があります。 "If .Tag = 1 Then" – James

+0

上記の答えにインストール手順を追加しました。 – Variatus

関連する問題