2016-07-20 10 views
0

ユーザーがリストボックス内の項目をダブルクリックして、直近のテキストボックスに貼り付ける方法を見つけようとしています。だから、リストボックスからエントリを最近のテキストボックスに追加するVBAユーザーフォームをダブルクリックする

With ListBox1 
    .AddItem "<PARENT> Customer's PARENT Company " 
    .AddItem "<SALESEXEC> The sales executive responsible for the account" 
    .AddItem "<FIRSTNAME> Customer's First Name" 
End With 

のようなリストボックスで、私は、テキストボックスにこれらの値を過去のことができるようにしたいのですが、フォームに複数のテキストボックスを持っているので、私はそれは、彼らが集中している最後の1になりたいです。私は次のようなことをすることを考えていた。問題は私がGotFocus何かをするイベントを得ることができないということです。 Enterイベントでは機能しますが、それは一度しか動作しません。

Public hasFoc As String 
Private Sub TextBox4_GotFocus() 
    Debug.Print ("TextBox4 Clicked") 
    hasFoc = "TextBox4" 
End Sub 

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 

'Get index of clicked element, and paste the "<>" 
'value into the most recently used textbox 

End Sub 

編集:私はVBAで前にクラスを扱っていませんが、私のクラスモジュールは、次のようになります。

Option Explicit 

Public WithEvents txtBox As MSForms.TextBox 

'/ To Mimic Enter event . 
Private Sub txtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
    '/ Assign to global variable 
    Set g_ActiveTextBox = txtBox 
End Sub 

'/ To Mimic Enter event . 
Private Sub txtBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    '/ Assign to global variable 
    Set g_ActiveTextBox = txtBox 
End Sub 

答えて

1

あなたはMouseDownイベントを捕捉することによって、入力イベントを模倣し、カスタムイベントハンドラクラスを作成することができますKeyDownイベントが含まれます。ユーザーフォームが読み込まれると、すべてのテキストボックスをカスタムイベントにフックします。ユーザーがTextBoxにアクセスするたびに、その変数を(標準モジュールの)グローバル変数に格納します。 ListBox DblClickで、選択した項目テキストをTextBoxに設定するだけです。シンプル!!!カスタムイベント処理のため

VBAクラス(EventH)::)

は、以下の完全なVBAコードを参照してください。テキストボックスとリストボックス

Option Explicit 

Dim oCol     As New Collection '/ Holds the custom events and keeps them alive 

Private Sub UserForm_Initialize() 
    '/ Start EventHandler hooking. 
    Call addEventhandlers 
End Sub 

Sub addEventhandlers() 
    '/ Adds custom event handler to all TextBoxes of this UserForm 
    Dim oEventH  As EventH 
    Dim ctrl  As Control 

    For Each ctrl In Me.Controls 
     If TypeName(ctrl) = "TextBox" Then 
      Set oEventH = New EventH 
      Set oEventH.txtBox = ctrl 
      oCol.Add oEventH 
     End If 
    Next 

End Sub 

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    '/ Copy Text from ListBox to Last active TextBox 
    Dim i As Long 

    If Not g_ActiveTextBox Is Nothing Then 
     For i = 0 To Me.ListBox1.ListCount - 1 
      If Me.ListBox1.Selected(i) Then 
       g_ActiveTextBox = Me.ListBox1.List(i) 
      End If 
     Next i 
    End If 
End Sub 

標準モジュールと

Option Explicit 

Public WithEvents txtBox As MSForms.TextBox 

'/ To Mimic Enter event . 
Private Sub txtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
    '/ Assign to global variable 
    Set g_ActiveTextBox = txtBox 
End Sub 

'/ To Mimic Enter event . 
Private Sub txtBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    '/ Assign to global variable 
    Set g_ActiveTextBox = txtBox 
End Sub 

VBAユーザーフォームは、グローバル変数を宣言します。

ます。Option Explicit

Global g_ActiveTextBox  As MSForms.TextBox '/ Global variable to hold the last active textbox 
               '/ Don't act smart and move it to UserForm as public. 
               '/ That will fail. 
+0

私は本当に答えが、唯一の問題は、私はEventH'として暗いoEventH 'は、「ユーザー定義型が定義されていません」というエラーを取得することです感謝しています。なぜこれが起こるか知っていますか? – RWA4ARC

+1

イベントハンドラクラスの名前を 'EventH'の名前に変更する必要があります。 – cyboashu

+0

これは可能かもしれないと思っていましたが、以前はVBAでクラスを処理していませんでした。私はクラスに含める必要がある初期化関数はありますか?または、名前を変更する簡単な方法はありますか? – RWA4ARC

関連する問題