Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1719 / 13646 ツリー ←次へ | 前へ→

【72177】TextBox1へフォーカスを移動をさせたい y60 12/6/13(水) 23:05 質問[未読]
【72178】Re:TextBox1へフォーカスを移動をさせたい Abyss 12/6/13(水) 23:31 発言[未読]
【72179】Re:TextBox1へフォーカスを移動をさせたい y60 12/6/13(水) 23:56 お礼[未読]
【72374】TextBox3を入力可能状態にしたい y60 12/7/25(水) 23:55 質問[未読]
【72376】Re:TextBox3を入力可能状態にしたい ichinose 12/7/26(木) 5:53 発言[未読]
【72387】Re:TextBox3を入力可能状態にしたい y60 12/7/26(木) 16:25 お礼[未読]
【72375】Re:TextBox1へフォーカスを移動をさせたい UO3 12/7/26(木) 0:18 発言[未読]
【72388】Re:TextBox1へフォーカスを移動をさせたい y60 12/7/26(木) 16:32 お礼[未読]

【72177】TextBox1へフォーカスを移動をさせたい
質問  y60  - 12/6/13(水) 23:05 -

引用なし
パスワード
   アクティブセルへ入力した後、ユーザーフォームのTextBox1へ
フォーカスを移動をさせたい。
フォーカスがセルにもユーザーフォームにもない状態になっています。
よろしくお願いします。

Private Sub TextBox1_Change()
Dim n As Long
  Me.Label1.Caption = Len(Me.TextBox1.Text)
  If Len(Me.TextBox1.Text) = 30 Then
  If YN確認("30文字になりました" & vbCr & "データ入力しますか?") = vbYes Then
    ActiveCell.Value = Me.TextBox1.Text
    Application.Goto ActiveCell.Offset(1, 0)
    Me.TextBox1.Text = Empty
    '
    Me.TextBox1.TabIndex = 0
    Me.TextBox1.SetFocus  '<<<===TextBox1が入力可能状態にならない
  End If
  End If
End Sub

'入力確認メッセージを表示
Function YN確認(Msg As String)
Dim Style As VbMsgBoxStyle
Dim Title As String
  Style = vbYesNo + vbExclamation + vbDefaultButton1
  Title = "入力確認"
  YN確認 = MsgBox(Msg, Style, Title)  'vbYes = 実行 , vbNo = 中止
End Function

【72178】Re:TextBox1へフォーカスを移動をさせたい
発言  Abyss  - 12/6/13(水) 23:31 -

引用なし
パスワード
   こんばんは。

> Me.TextBox1.SetFocus  '<<<===TextBox1が入力可能状態にならない

この部分の代わりに、次のコードを差し替えてみてください。

  dim acc as iaccessible
  set acc = textbox1
  acc.accselect 16&
  acc.accselect 1&

【72179】Re:TextBox1へフォーカスを移動をさせたい
お礼  y60  - 12/6/13(水) 23:56 -

引用なし
パスワード
   Abyssさん、こんばんは。

>この部分の代わりに、次のコードを差し替えてみてください。
>
>  dim acc as iaccessible
>  set acc = textbox1
>  acc.accselect 16&
>  acc.accselect 1&

これでうまく動きました。
しかし、これは見たことがなく、ヘルプで調べても、
「質問の意味が分かりません・・・」と出てしまいます。

仕方なく、googleでiaccessibleを検索すると、いろいろ出てきましたが、難しくてすぐには分かりません。時間をかけて理解していきます。

おかげ様で、目的の動きを実現させることができました。
Abyssさん、本当にありがとうございました。

【72374】TextBox3を入力可能状態にしたい
質問  y60  - 12/7/25(水) 23:55 -

引用なし
パスワード
   続いて、質問させてください。
前回の
>>  dim acc as iaccessible
>>  set acc = textbox1
>>  acc.accselect 16&
>>  acc.accselect 1&

16&
1&
の定数のことは良く理解できてないままなのですが、できたら、この定数の意味も説明していただければ助かります。

本題の質問です。
前回の質問に関連しているので、このスレッドで続いて質問します。

Userform1に'TextBox1,'TextBox2,'TextBox3を配置しています。

'TextBox1***TextBox2の文字列の長さを格納
'TextBox2***指定文字数の文字列を入れて、この文字列をアクティブセルに格納
'TextBox3***任意の文字列を入れて、この文字列をアクティブセルの右隣セルに格納

TextBox3の値を入力確認メッセージで、Noを選んだとき、TextBox3を入力可能状態にしたいのですが、TextBox1にフォーカスが移動してしまいます。どのようにすればTextBox3を入力可能状態にできるでしょうか。

下記がそのコードです。

Private Sub TextBox2_Change()
Dim n As Long
Dim acc As IAccessible
  If Len(Me.TextBox2.Text) = Me.TextBox1.Value Then
    If YN確認("指定データ数になりました" & vbCr & "データ入力しますか?") = vbYes Then
      ActiveCell.Value = Me.TextBox2.Text
     'TextBox3へフォーカス移動
      Set acc = TextBox3
    Else
      Set acc = TextBox2
    End If
    acc.accSelect 16&
    acc.accSelect 1&
  End If
End Sub

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim acc As IAccessible
Dim strm As String
Dim i As Long
  If Me.TextBox3.Text = "" Then Exit Sub
  If YN確認("データ入力しますか?") = vbYes Then
    ActiveCell.Offset(0, 1).Value = TextBox3.Text
    Application.GoTo ActiveCell.Offset(1, 0)  'カーソルを下へ
    Me.TextBox2.Text = Empty
    Me.TextBox3.Text = Empty
    '
    'TextBox2へフォーカス移動
    Set acc = TextBox2
  Else
    'TextBox3へフォーカスを戻す
    Set acc = TextBox3    '<<==1.vbNoでは、TextBox3が入力可能状態にならない

  End If
  acc.accSelect 16&
  acc.accSelect 1&
End Sub

'実行確認メッセージを表示
Function YN確認(Msg As String)
Dim Style As VbMsgBoxStyle
Dim Title As String
  Style = vbYesNo + vbExclamation + vbDefaultButton1
  Title = "実行の確認"
  YN確認 = MsgBox(Msg, Style, Title)  'vbYes = 実行 , vbNo = 中止
End Function

【72375】Re:TextBox1へフォーカスを移動をさせたい
発言  UO3  - 12/7/26(木) 0:18 -

引用なし
パスワード
   ▼y60 さん:

こんばんは

横から失礼します。
モードレス表示でのメッセージによるカーソルの消滅ですよね。
(実際には、TextBox1がActiveControlなんですがカーソルが消滅している状況)

Abyssさんのアドバイスのコードとは別に、ichinoseさんが別の板で紹介された方法。

まず、以下の処理でイベントの連鎖がおこりますので、それを回避するために
TextBox1_Change の最初に
If TextBox1.Tag = "Skip" Then Exit Sub といった記述をしておいて

MsgBox の後、
TextBox1.Tag="Skip"
TextBox1.Visible=False
DoEvents
TextBox1.Visible=True
TextBox1.SetFocus
TextBox1.Tag=""

このように書いてお試しいただけませんか?

【72376】Re:TextBox3を入力可能状態にしたい
発言  ichinose  - 12/7/26(木) 5:53 -

引用なし
パスワード
   おはようございます。


>'TextBox3***任意の文字列を入れて、この文字列をアクティブセルの右隣セルに格納
>
>TextBox3の値を入力確認メッセージで、Noを選んだとき、TextBox3を入力可能状態にしたいのですが、TextBox1にフォーカスが移動してしまいます。
Exitイベントの場合は、別の方法が必要みたいですねえ。

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  With TextBox3
    If .Text = "" Then
     MsgBox "ng"
     Application.OnTime Now(), _
           "'SetFocussp ""userform1"",""TextBox3""'"
                     '↑ユーザーフォームの名前
    End If
  End With
End Sub


標準モジュールに

Sub setfocussp(ByVal frm As Variant, ctl As Variant)
  Dim cfrm As Object
  For Each cfrm In UserForms
    If UCase(cfrm.Name) = UCase(frm) Then
     cfrm.Controls(ctl).setfocus
     Exit For
    End If
  Next
End Sub


尚,Textbox3のExitイベント内のコードは、例題です。

【72387】Re:TextBox3を入力可能状態にしたい
お礼  y60  - 12/7/26(木) 16:25 -

引用なし
パスワード
   ichinose さん、ありがとうございます。

おかげさまで、
入力確認メッセージで、Noを選んだとき、TextBox3を入力可能状態にすることができました。
このようなコードは、とても思いつかないので、この質問箱のありがたさがよく分かります。

本当にありがとうございました。

>     Application.OnTime Now(), _
>           "'SetFocussp ""userform1"",""TextBox3""'"
>                     '↑ユーザーフォームの名前


>Sub setfocussp(ByVal frm As Variant, ctl As Variant)
>  Dim cfrm As Object
>  For Each cfrm In UserForms
>    If UCase(cfrm.Name) = UCase(frm) Then
>     cfrm.Controls(ctl).setfocus
>       Exit For
>      End If
>    Next
>  End Sub

【72388】Re:TextBox1へフォーカスを移動をさせたい
お礼  y60  - 12/7/26(木) 16:32 -

引用なし
パスワード
   UO3 さん、ありがとうございます。

>モードレス表示でのメッセージによるカーソルの消滅ですよね。
>(実際には、TextBox1がActiveControlなんですがカーソルが消滅している状況)

これが原因ということがわかり、とても勉強になりました。

また、提示のコードを使っても、Textbox1が入力状態になることが確認できました。
本当にありがとうございました。

1719 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free