【问题标题】:Hide characters in macro for password control隐藏宏中的字符以进行密码控制
【发布时间】:2017-01-18 11:22:35
【问题描述】:

我创建了一个宏来插入图像,当个人按下电子表格上的按钮时,下面的宏将运行,并且会出现一个消息框供个人输入密码,如果正确,图像将被插入。这很好用,但我希望消息框用星号隐藏密码,例如********

这是当前的宏:

Sub M_Reeve()

'Create the password message box

Dim Answer As String
    Answer = InputBox("Input Operator Stamp Password", "Password")

    If Answer = "Martin" Then

       'Run the copy and paste "Stamp1" macro from module 2

    Stamp1

        'return an error if wrong password

    Else: MsgBox "Wrong password", vbCritical + vbOKCancel, "Incorrect Password"
    End If

End Sub

提前致谢

【问题讨论】:

  • 我很确定您不能在 InputBox 中执行此操作,但您可以在 UserForm 的 TextBox 中执行此操作! ;)
  • 好的,我创建了一个用户,设法让它将文本显示为 ****,但我不知道如何在我的宏中链接到它。用户表单上的当前代码是: Private Sub TextBox1_Change() End Sub Private Sub UserForm_Click() End Sub
  • 这个链接应该可以帮助你:gregmaxey.com/word_tip_pages/userform_pass_data.html

标签: vba excel passwords


【解决方案1】:

这对我来说适用于 Excel 2010 32 位。

创建新模块并粘贴此代码:

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

    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

然后在您的代码中将InputBox 替换为InputBoxDK

我在网上的其他网站上找到了这段代码,我记得是@Siddharth Rout 写的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 2014-12-31
    • 1970-01-01
    • 2014-07-25
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多