5

これは簡単だと思いましたが、かなり難しいことがわかりました。どんなアドバイスやアイデアも評価されます。

Excelにフォームがあり、特定のボタンが押された場合、そのボタンのコードを実行する前にユーザーがパスワードを入力する必要があります。

inputboxを使用することもできますが、入力時に他の人がパスワードを確認できるようになります。したがって、テキストボックスを含む2番目のフォームを使用し、PasswordCharパラメーターを*に設定します。

ここに問題があります。このようなコードを使いたい

if checkPassword("Please enter your password") = False then exit sub

checkPassword文字列をパラメータとして受け取る関数です。この関数はフォームを開き、メッセージをラベルに入れます。ユーザーはパスワードを入力して[OK]をクリックする必要があります。

潜水艦btnOK_Click()はパスワードが正しいことを確認してから、フォームを開いた関数に、パスワードがOKの場合はTrueを、パスワードが正しくない場合はFalseを返すように強制する必要があります。

関数を強制的に戻す方法がわかりません。ユーザーが[OK]をクリックしてからフォームをアンロードするときに、グローバル変数をTrueまたはFalseに設定してみました。これにより、関数が返されますが、フォームで設定されたすべてのグローバル変数もリセットされます。

これがフォームを呼び出す私の関数です

Function checkPassword(message As String) As Boolean

  frmPassword.Show
  frmPassword.passwordMsg.Caption = message

  'passwordStatus is a global variable
  If passwordStatus = True Then checkPassword = True Else  checkPassword = False

End Function

フォームの[OK]ボタンにリンクされているサブは次のとおりです。

Private Sub passwordok_Click()

  If Me.passwordtext.Text = "password" Then
      passwordStatus = True
  Else
      passwordStatus = False
  End If
  Unload Me

End Sub
4

2 に答える 2

5

inputboxを使用することもできますが、入力時に他の人がパスワードを確認できるようになります。したがって、テキストボックスを含む2番目のフォームを使用し、PasswordCharパラメーターを*に設定します。

これが私のデータベースからのものです。

免責事項:私はこれを書きませんでした、そして私はこれを書いた人を覚えていません

使用法

Private Sub passwordok_Click()
    Dim Prompt, password As String
    Prompt = "Please enter your password."
    password = InputBoxDK(Prompt)

    MsgBox password '<~~ Do whatever you want to do with this
End Sub

モジュール内

Option Explicit

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function GetModuleHandle Lib "kernel32" Alias _
"GetModuleHandleA" (ByVal lpModuleName As String) As Long

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _
(ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

'Constants to be used in our API functions
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const HC_ACTION = 0

Private hHook As Long

Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
    Dim RetVal
    Dim strClassName As String, lngBuffer As Long

    If lngCode < HC_ACTION Then
        NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
        Exit Function
    End If

    strClassName = String$(256, " ")
    lngBuffer = 255

    'A window has been activated
    If lngCode = HCBT_ACTIVATE Then
        RetVal = GetClassName(wParam, strClassName, lngBuffer)
        'Class name of the Inputbox
        If Left$(strClassName, RetVal) = "#32770" Then
            'This changes the edit control so that it display the password character *.
            'You can change the Asc("*") as you please.
            SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
        End If
    End If

    'This line will ensure that any other hooks that may be in place are
    'called correctly.
    CallNextHookEx hHook, lngCode, wParam, lParam

End Function

Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _
Optional YPos, Optional HelpFile, Optional Context) As String
    Dim lngModHwnd As Long, lngThreadID As Long
    lngThreadID = GetCurrentThreadId
    lngModHwnd = GetModuleHandle(vbNullString)
    hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
    InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
    UnhookWindowsHookEx hHook
End Function

スナップショット

ここに画像の説明を入力してください

于 2012-04-26T09:10:07.937 に答える
3

ダイアログから値を返すことは一般的なタスクであり、非常に簡単に実行できます。

最も単純なパターンは、関数をダイアログフォーム自体に配置し、その関数にホストフォームをモーダルに表示させることです。

Private passwordStatus As Boolean

Function checkPassword(message As String) As Boolean
  '//setup the form
  Me.passwordMsg.Caption = message

  '//show the form modally, this will not return until the form is unloaded 
  '//i.e. when the button is clicked; so values in private variable are still valid
  Me.Show vbModal

  '//form is unloaded (via unload me or a close) return the value;
  checkPassword = passwordStatus
End Function

Private Sub passwordok_Click()
  passwordStatus = Me.passwordtext.Text = "password"
  Unload Me
End Sub

使用されます

passworkOk = frmPassword.checkPassword("enter your blabla")
于 2012-04-26T09:56:57.103 に答える