[[20160316164433]] 『テキストボックスを矢印キーで移動したい』(たけさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『テキストボックスを矢印キーで移動したい』(たけさん)

いつもありがとうございます。
Excelの一覧をを検索するコードです。
テキストボックス1〜5があり、5まで任意で入力しEnterキーで検索(フィルタ)されるようにしています。
現在1〜5まではEnterで移動するのですが、
合わせて上下の矢印キー(↓↑)でも、テキストボックスを異動できるようにしたいのです。

どの様に書き換えたら、そのような動きになるのでしょうか。
ご指導ください。よろしくお願いします。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub TextBox5_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _

    ByVal Shift As Integer)

Application.ScreenUpdating = False

If Worksheets("sheet1").AutoFilterMode Then

  'オートフィルタを解除
Worksheets("sheet1").AutoFilterMode = False
 End If

 If KeyCode <> 13 Then Exit Sub
 CommandButton1_Click
 Rows("1:1").Select

 Selection.AutoFilter Field:=17, Criteria1:="=*" & TextBox1.Value & "*", Operator:=xlAnd '17列目適用
 Selection.AutoFilter Field:=10, Criteria1:="=*" & TextBox2.Value & "*", Operator:=xlAnd 'メーカーCD
 Selection.AutoFilter Field:=18, Criteria1:="=*" & TextBox3.Value & "*", Operator:=xlAnd '仲間CD
 Selection.AutoFilter Field:=3, Criteria1:="=*" & TextBox4.Value & "*", Operator:=xlAnd  '入日記

 'テキストボックス5については何も入力されていなければフィルタ(処理)しない 入力されていればフィルタ
 If TextBox5.Value <> "" Then
 Selection.AutoFilter Field:=16, Criteria1:="=" & Format(TextBox5.Value, "###0"), Operator:=xlAnd '16列目金額
 End If

 '再計算
 Application.CalculateFull

 Application.ScreenUpdating = True

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

 '検索します

 If Worksheets("sheet1").AutoFilterMode Then
  'オートフィルタを解除
 Worksheets("sheet1").AutoFilterMode = False
 End If

 Rows("1:1").Select  'すべての列の1行目のセル範囲選択

 Selection.AutoFilter  'オートフィルタ

 'オートフィルタでテキストボックスに入った値を検索する

 Selection.AutoFilter Field:=17, Criteria1:="=*" & TextBox1.Value & "*", Operator:=xlAnd '17列目適用
 Selection.AutoFilter Field:=10, Criteria1:="=*" & TextBox2.Value & "*", Operator:=xlAnd '10列目メーカーCD
 Selection.AutoFilter Field:=18, Criteria1:="=*" & TextBox3.Value & "*", Operator:=xlAnd '18列目CD
 Selection.AutoFilter Field:=3, Criteria1:="=*" & TextBox4.Value & "*", Operator:=xlAnd   '3列目入日記

 'テキストボックス5については何も入力されていなければフィルタ(処理)しない 入力されていればフィルタ
 If TextBox5.Value <> "" Then
 Selection.AutoFilter Field:=16, Criteria1:="=" & Format(TextBox5.Value, "###0"), Operator:=xlAnd '16列目金額
 End If

 '再計算
  Application.CalculateFull

 Application.ScreenUpdating = True

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub CommandButton2_Click()

 'フィルタ結果をクリアする
 Selection.AutoFilter
 If ActiveSheet.AutoFilterMode = False Then
 Range("A2").AutoFilter
 End If

 'テキストボックスをクリアする
 Sheet1.TextBox1.Value = ""
 Sheet1.TextBox2.Value = ""
 Sheet1.TextBox3.Value = ""
 Sheet1.TextBox4.Value = ""
 Sheet1.TextBox5.Value = ""

 Range("P1").Select

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub CommandButton3_Click()

 'テキストボックスをクリアする
 Sheet1.TextBox1.Value = ""
 Sheet1.TextBox2.Value = ""
 Sheet1.TextBox3.Value = ""
 Sheet1.TextBox4.Value = ""
 Sheet1.TextBox5.Value = ""

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

 Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

 'テキストボックス2(メーカーCD)を入力後、テキストボックス1(適用)へ移動

    If KeyCode = vbKeyReturn Then 'Enterキーで移動
       TextBox1.Activate
    End If

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

 'テキストボックス1(適用)を入力後、テキストボックス3(仲間CD)へ移動

    If KeyCode = vbKeyReturn Then 'Enterキーで移動

       TextBox3.Activate
    End If

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

 'テキストボックス3(仲間CD)を入力後、テキストボックス4(入日記)へ移動

    If KeyCode = vbKeyReturn Then 'Enterキーで移動

       TextBox4.Activate
    End If

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

 'テキストボックス4(入日記)を入力後、テキストボックス5(金額)へ移動

    If KeyCode = vbKeyReturn Then 'Enterキーで移動

       TextBox5.Activate
    End If

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 このコードは シートに配置した ActiveXコントロールを対象にしてシートモジュールに書かれているのですか?
 あるいは、ユーザーフォームに書かれているのですか?

 後者なら、BeforeUpdate 等を使えばよろしいかと思うのですが、わざわざ KeyDown をつかっているということは
 前者ですかね?

(β) 2016/03/16(水) 17:17


 KeyCode = 38 ⇒ 上矢印キー
 KeyCode = 40 ⇒ 下矢印キー
 を追記してはいかがでしょうか。

(ろっくん) 2016/03/16(水) 17:20


 あぁ、TextBox●.Activate とありますので シートモジュールなんですね。
 では、ろっくんさんの回答で。

(β) 2016/03/16(水) 17:29


 本題とは関係がないのですが、オートフィルターが設定されていないシートに対して
 AutoFilterMode を False にしてもエラーにはなりません。

 なので、If で判定する必要はなく、無条件に Worksheets("sheet1").AutoFilterMode = False
 でOKです。

(β) 2016/03/16(水) 17:33


 シート上の ActiveX のテキストボックスのタブオーダ制御、ちょっと書いてみました。
 Enterキー、Tabキー、↓キーで、次に移る、Shift/Tabキー、↑キーで、前に戻る。
 タブオータは、★コードで指定します。ここは実際のものに書き換えてください。

 ●ThisWorkBookモジュール

 Private Sub Workbook_Open()
    preset
 End Sub

 ●標準モジュール

 Dim txPool As Collection

 Sub preset()
    Dim cls As Class1
    Dim txOrder As Variant
    Dim tb As MSForms.TextBox
    Dim nxt As MSForms.TextBox
    Dim pre As MSForms.TextBox
    Dim x As Long
    Dim p As Long
    Dim n As Long

    Set txPool = New Collection
    txOrder = Array("TextBox1", "TextBox3", "TextBox2", "TextBox4") '★

    For x = LBound(txOrder) To UBound(txOrder)
        Select Case x

            Case UBound(txOrder)
                p = x - 1
                n = LBound(txOrder)
            Case LBound(txOrder)
                p = UBound(txOrder)
                n = x + 1
            Case Else
                p = x - 1
                n = x + 1
        End Select

        Set tb = Sheet1.OLEObjects(txOrder(x)).Object
        Set nxt = Sheet1.OLEObjects(txOrder(n)).Object
        Set pre = Sheet1.OLEObjects(txOrder(p)).Object

        Set cls = New Class1
        cls.Init tb, pre, nxt
        txPool.Add cls
    Next

 End Sub

 ●クラスモジュール(Class1)

 Dim WithEvents myTB As MSForms.TextBox
 Dim myNxt As MSForms.TextBox
 Dim myPre As MSForms.TextBox

 Sub Init(tb As MSForms.TextBox, pre As MSForms.TextBox, nxt As MSForms.TextBox)
    Set myTB = tb
    Set myNxt = nxt
    Set myPre = pre
 End Sub

 Private Sub myTB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim tb As MSForms.TextBox
    Select Case KeyCode
        Case vbKeyReturn, vbKeyDown
            Set tb = myNxt
        Case vbKeyUp
            Set tb = myPre
        Case vbKeyTab
            If Shift = 1 Then
                Set tb = myPre
            Else
                Set tb = myNxt
            End If
    End Select

    If Not tb Is Nothing Then tb.Activate

 End Sub

(β) 2016/03/17(木) 10:00


ろっくんさん

KeyCode = 38
KeyCode = 40

できました!!!ありがとうございます
_(_^_)_
(たけさん) 2016/03/17(木) 13:28


βさん

いつも本当にありがとうございます!!!
こんなに短時間に...!!!
実際のものに書き換えして、ご報告させていただきます
本当にありがとうございます

୧꒰*´꒳`*꒱૭✧
(たけさん) 2016/03/17(木) 13:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.