2014-11-03 4 views
7

मैंने एक * .xlam ऐड-इन में उपयोगकर्ताफॉर्म बनाया और आईडीई में एक नया कमांडबार और बटन बनाया, लेकिन जब मैं बटन पर क्लिक करता हूं, तो उपयोगकर्ता फॉर्म Excel में खोला जाता है, और फोकस आईडीई से दूर किया जाता है। क्या .NET COM एड-इन का उपयोग किए बिना होस्ट एप्लिकेशन के बजाय आईडीई में उपयोगकर्ता फ़ॉर्म खोलने का कोई तरीका है?क्या होस्ट ऐप के बजाय आईडीई में उपयोगकर्ता फॉर्म प्रदर्शित करने का कोई तरीका है?

यहां वह कोड है जो कमांडबार और बटन बनाता है और बटन क्लिक ईवेंट को संभालता है।

Option Explicit 

Public WithEvents cmdBarEvents As VBIDE.CommandBarEvents 

Private Sub Class_Initialize() 
    CreateCommandBar 
End Sub 

Private Sub Class_Terminate() 
    Application.VBE.CommandBars("VBIDE").Delete 
End Sub 

Private Sub CreateCommandBar() 

    Dim bar As CommandBar 
    Set bar = Application.VBE.CommandBars.Add("VBIDE", MsoBarPosition.msoBarFloating, False, True) 
    bar.Visible = True 

    Dim btn As CommandBarButton 
    Set btn = bar.Controls.Add(msoControlButton, , , , True) 
    btn.Caption = "Show Form" 
    btn.OnAction = "ShowForm" 
    btn.FaceId = 59 

    Set cmdBarEvents = Application.VBE.Events.CommandBarEvents(btn) 

End Sub 

Private Sub cmdBarEvents_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean) 

    CallByName Me, CommandBarControl.OnAction, VbMethod 

End Sub 

Public Sub ShowForm() 
    Dim frm As New UserForm1 
    frm.Show 
End Sub 

पीएस आप commandbar दूर करने के लिए कोड की इस पंक्ति आवश्यकता हो सकती है ...

Application.VBE.CommandBars("VBIDE").Delete 
+0

हाँ: यह एक [VBE ऐड-इन] (http://stackoverflow.com/a/1942651/ 1188513) एक्सेल ऐड-इन के बजाय! ;) –

+0

क्या आपका मतलब एक फ़्लोटिंग उपयोगकर्ताफॉर्म है जो फोकस चोरी नहीं करता है? –

+0

ठीक है, मैं आईडीई से फोकस चोरी करने के बिना, * उपयोगकर्ताफॉर्म * फोकस प्राप्त करना चाहता हूं। मुझे पता नहीं है कि यह @ सिद्धार्थ रूट भी संभव है। – RubberDuck

उत्तर

7

यहाँ एक विकल्प है।

अपने उपयोगकर्ता फॉर्म पर एक बटन डालें। प्रदर्शन प्रयोजन के लिए, मैं इस

enter image description here

अगला userform में इस कोड डाल उपयोग कर रहा हूँ

Private Sub CommandButton1_Click() 
    Unload Me 
    Application.Visible = True 
End Sub 

अगला अपने वर्ग मॉड्यूल के शीर्ष पर इस पेस्ट

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Dim Ret As Long, ChildRet As Long 

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _ 
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _ 
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 

Private Const HWND_TOPMOST = -1 
Private Const SWP_NOACTIVATE = &H10 
Private Const SWP_SHOWWINDOW = &H40 

अंत में बदलने अपने Sub ShowForm() इस

Public Sub ShowForm() 
    Dim frm As New UserForm1 
    Dim Ret As Long 

    frm.Show vbModeless 

    Application.Visible = False 

    Ret = FindWindow("ThunderDFrame", frm.Caption) 

    SetWindowPos Ret, HWND_TOPMOST, 100, 100, 250, 200, _ 
    SWP_NOACTIVATE Or SWP_SHOWWINDOW 
End Sub 

यह है कि तुम क्या

enter image description here

संपादित

अधिक विचार आते है। जब उपयोगकर्ता स्माइली पर क्लिक करता है तो उपयोगकर्ता को अधिक उपयोगकर्ताफॉर्म बनाने से रोकने के लिए, नीचे दिए गए Sub ShowForm() को बदलें। (वैकल्पिक स्माइली निष्क्रिय करने के लिए हो सकता है और जब प्रपत्र उतारना इसे सक्षम फिर?)

Public Sub ShowForm() 
    Dim frm As New UserForm1 
    Dim Ret As Long 
    Dim formCaption As String 

    '~~> Set Userform Caption 
    formCaption = "Blah Blah" 

    On Error Resume Next 
    Ret = FindWindow("ThunderDFrame", formCaption) 
    On Error GoTo 0 

    '~~> If already there in an instance then exit sub 
    If Ret <> 0 Then Exit Sub 

    frm.Show vbModeless 
    frm.Caption = formCaption 

    Application.Visible = False 

    Ret = FindWindow("ThunderDFrame", frm.Caption) 

    SetWindowPos Ret, HWND_TOPMOST, 100, 100, 250, 200, _ 
    SWP_NOACTIVATE Or SWP_SHOWWINDOW 
End Sub 
+0

मैं कल इसे आजमाउंगा। एक पढ़ने के माध्यम से अच्छा लग रहा है। =) – RubberDuck

+0

@RubberDuck: kool :) Gnite! प्रयास के लिए –

+1

+1! ... लगता है * एक COM एड-इन के साथ जाने के लिए लगभग * आसान;) –

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

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