2014-11-03 7 views
7

* .xlam 추가 기능에 userform을 만들고 IDE에 새로운 명령 모음과 단추를 만들었지 만 단추를 클릭하면 사용자 양식이 Excel에서 열리고 IDE에서 포커스가 멀리 이동됩니다. .Net COM 추가 기능을 사용하지 않고 호스트 응용 프로그램 대신 IDE에서 사용자 양식을 여는 방법이 있습니까?호스트 응용 프로그램 대신 IDE에 사용자 양식을 표시하는 방법이 있습니까?

다음은 명령 모음과 단추를 만들고 단추 클릭 이벤트를 처리하는 코드입니다.

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 

P. 명령 줄을 제거하려면이 코드 줄이 필요할 수 있습니다.

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

예 : 그것을 만들 A [VBE 추가 기능 (http://stackoverflow.com/a/1942651/ 1188513) 대신 Excel 추가 기능! ;) –

+0

포커스를 훔치지 않는 부동 사용자 폼을 의미합니까? –

+0

글쎄, Excel에서 포커스를 IDE에서 훔치지 않고 * userform *이 포커스를 얻길 바란다. @SiddharthRout이 가능한지 전혀 모른다. – RubberDuck

답변

7

다음은 대안입니다.

사용자 양식에 버튼을 넣으십시오. 데모 목적을 위해, 나는이

enter image description here

다음 사용자 정의 폼에이 코드를 넣어 사용하고

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() to this

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 add-in을 사용하기가 거의 쉽다.) –