2012-04-26 12 views
5

मैंने सोचा कि यह आसान होगा, लेकिन यह काफी कठिन साबित हो रहा है। किसी भी सलाह या विचारों को अपमानित किया जाएगा।वीबीए एक फॉर्म बटन को दबाए जाने के लिए फ़ंक्शन को कैसे बल दें

मेरे पास एक्सेल में एक फॉर्म है कि यदि कोई निश्चित बटन दबाया जाता है तो मुझे उस बटन के कोड के कोड से पहले पासवर्ड दर्ज करने की आवश्यकता होती है।

मैं सिर्फ एक InputBox इस्तेमाल कर सकते हैं, लेकिन वह किसी और पासवर्ड को देखने के लिए जब यह में टाइप की अनुमति देगा। इसलिए मैं एक पाठ बॉक्स के साथ एक दूसरे फार्म का उपयोग करें और सेट इसे करने के लिए PasswordChar पैरामीटर है *

यहाँ करना चाहते हैं समस्या यह है। मैं इस

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

checkPassword की तरह कोड का उपयोग करना चाहते एक समारोह है कि एक पैरामीटर के रूप में एक स्ट्रिंग लेता है। यह फ़ंक्शन एक फॉर्म खोलता है और संदेश को एक योग्य में डाल देता है। उपयोगकर्ता को पासवर्ड दर्ज करना चाहिए और ठीक क्लिक करना चाहिए।

उप btnOK_Click() को जांचना चाहिए कि पासवर्ड सही है और फिर उस फ़ंक्शन को बल दें जो वापस लौटने के लिए फॉर्म खोला गया है यदि पासवर्ड ठीक था या गलत पासवर्ड गलत था।

मैं काम नहीं कर सकता कि फ़ंक्शन को वापस लौटने के लिए कैसे मजबूर किया जाए। जब मैं उपयोगकर्ता ठीक क्लिक करता हूं और फिर फॉर्म को उतारना चाहता हूं तो मैंने एक वैश्विक चर को सही या गलत पर सेट करने का प्रयास किया है। यह फ़ंक्शन वापसी करता है, लेकिन यह फ़ॉर्म द्वारा निर्धारित सभी वैश्विक चर को भी रीसेट करता है।

यहाँ मेरी समारोह है कि प्रपत्र

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 

कॉल यहां उप रूपों ठीक बटन से जुड़ा हुआ है:

Private Sub passwordok_Click() 

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

End Sub 

उत्तर

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") 
+0

हाय एलेक्स, इस समाधान के लिए धन्यवाद। मैंने सिद्धार्थ से समाधान की कोशिश की और यह ठीक काम किया (सिद्धार्थ को फिर से धन्यवाद), लेकिन आपका समाधान जो मैं मूल रूप से करना चाहता था उसके करीब है। मैंने कोशिश की है और यह बहुत अच्छा काम करता है, बहुत आसान और छोटे लोड करता है। धन्यवाद – PrestonDocks

+0

मैंने इसका इस्तेमाल किया, यह बेहद काम करता है, सिवाय इसके कि मुझे 'userStatus = Me.passwordtext.Text =" password "'को' अनलोड करें 'के बाद रखना होगा क्योंकि अनलोड लोड वैरिएबल रीसेट करता है, क्या इससे समस्याएं पैदा हो सकती हैं? – user1759942

5

मैं सिर्फ एक InputBox इस्तेमाल कर सकते हैं, लेकिन यह किसी और को टाइप किए जाने पर पासवर्ड देखने की अनुमति देगा। इसलिए मैं टेक्स्टबॉक्स के साथ दूसरे फॉर्म का उपयोग करना चाहता हूं और इसे पासवर्डशेर पैरामीटर *

यहाँ मेरी डेटाबेस से कुछ है।

अस्वीकरण: मैं यह लिख नहीं किया था और मुझे याद नहीं कि यह कौन

उपयोग लिखा है: एक मॉड्यूल

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 

में

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 

SNAPSHOT

enter image description here

+0

कोड साझा करने के लिए धन्यवाद किया जाता है। यह ठीक काम किया। – PrestonDocks

+0

आपका स्वागत है। मैं वास्तव में चाहता हूं कि मैं ऊपर दिए गए कोड को चिपकाने के बजाय मूल लेखक के लिए एक लिंक उद्धृत कर सकता हूं। अगर मुझे कभी पता चलता है, तो मैं वापस आऊंगा और इस पोस्ट को संपादित करूंगा। :) –

संबंधित मुद्दे