Excel VBA質問箱 IV

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

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


2122 / 13645 ツリー ←次へ | 前へ→

【69806】setfocus が効かない mai 11/8/31(水) 9:58 質問[未読]
【69807】Re:setfocus が効かない Yuki 11/8/31(水) 11:18 発言[未読]
【69808】Re:setfocus が効かない mai 11/8/31(水) 11:52 質問[未読]
【69809】Re:setfocus が効かない mai 11/8/31(水) 12:00 発言[未読]
【69811】Re:setfocus が効かない Yuki 11/8/31(水) 12:44 発言[未読]
【69812】Re:setfocus が効かない mai 11/8/31(水) 13:10 お礼[未読]
【69814】Re:setfocus が効かない jyun 11/8/31(水) 13:59 回答[未読]
【69817】Re:setfocus が効かない mai 11/8/31(水) 14:45 お礼[未読]
【69813】Re:setfocus が効かない mai 11/8/31(水) 13:40 質問[未読]
【69815】Re:setfocus が効かない Yuki 11/8/31(水) 14:04 発言[未読]
【69816】Re:setfocus が効かない mai 11/8/31(水) 14:42 質問[未読]
【69819】Re:setfocus が効かない Yuki 11/8/31(水) 15:31 発言[未読]
【69826】Re:setfocus が効かない mai 11/9/1(木) 17:00 お礼[未読]
【69820】Re:setfocus が効かない jyun 11/8/31(水) 15:37 回答[未読]
【69825】Re:setfocus が効かない mai 11/9/1(木) 11:59 お礼[未読]

【69806】setfocus が効かない
質問  mai  - 11/8/31(水) 9:58 -

引用なし
パスワード
   ユーザーフォーム上にテキストボックスがあり、そのテキストボックスに不適合な値を入力した場合は、警告メッセージを出して、再度、入力させる為に、
そのテキストボックスにフォーカスを移動させたいのですが、
なぜか、何も反応してくれません。

理由がわからず困っています。

どうか、伝授お願いします

下記がコードです

Private Sub 品番txt_Exit(ByVal Cancel As MSForms.ReturnBoolean)

'重複を制御するための処理

Dim MyD As Object

Set MyD = CreateObject("scripting.dictionary")

 For I = 4 To Range("Z" & Rows.Count).End(xlUp).Row
  If Cells(I, "Z").Value <> "" Then
  If Not MyD.exists(Cells(I, "Z").Value) Then
    MyD.Add Cells(I, "Z").Value, ""
  End If
  End If
 Next I
 
 If MyD.exists(品番txt.Text) Then
   MsgBox "品番が重複してます。", vbCritical
  
  ’ここのフォーカスが効いてくれない
 
  With Me.品番txt
      .SetFocus
      .SelStart = 0
      .SelLength = Len(品番txt)
   End With

 End If
 

End Sub

【69807】Re:setfocus が効かない
発言  Yuki  - 11/8/31(水) 11:18 -

引用なし
パスワード
   ▼mai さん:
>  ’ここのフォーカスが効いてくれない
> 
>  With Me.品番txt
>      .SetFocus
>      .SelStart = 0
>      .SelLength = Len(品番txt)
>   End With

.SetFocus を止めて
.Cancel = true にしたら如何ですか。

【69808】Re:setfocus が効かない
質問  mai  - 11/8/31(水) 11:52 -

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

アドバイスありがとうございます。

下記のように.Cancel=Trueを入れて試したところ、

Cancelプロパティを設定できません。メンバがみつかりません。とエラーがでてしまうのですが、何がいけないのでしょうか?

もしよろしければ、アドバイスお願いします

 
 If TOS.exists(TOStxt.Text) Then
  
   MsgBox "TOSが重複してます。", vbCritical
  
   With Me.TOStxt
      .Cancel = True
   End With

 End If

End Sub


>▼mai さん:
>>  ’ここのフォーカスが効いてくれない
>> 
>>  With Me.品番txt
>>      .SetFocus
>>      .SelStart = 0
>>      .SelLength = Len(品番txt)
>>   End With
>
>.SetFocus を止めて
>.Cancel = true にしたら如何ですか。

【69809】Re:setfocus が効かない
発言  mai  - 11/8/31(水) 12:00 -

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

何度もすみません

 Cancel=True

で、処理がうまく進みました。

でも、このテキストボックス内の入力値を全選択させたいのですが、

  .SelStart = 0
  .SelLength = Len(品番txt)


今回のようなやり方にすると、それが、できないんですよね??

>▼mai さん:
>>  ’ここのフォーカスが効いてくれない
>> 
>>  With Me.品番txt
>>      .SetFocus
>>      .SelStart = 0
>>      .SelLength = Len(品番txt)
>>   End With
>
>.SetFocus を止めて
>.Cancel = true にしたら如何ですか。

【69811】Re:setfocus が効かない
発言  Yuki  - 11/8/31(水) 12:44 -

引用なし
パスワード
   ▼mai さん:
> Cancel=True
>で、処理がうまく進みました。
>
>でも、このテキストボックス内の入力値を全選択させたいのですが、

  処理
  With Me.品番txt
    .SelStart = 0
    .SelLength = Len(.Value)
  End With
  Cancel = True

SetFocusを止めてであってそのほかは消したら駄目ですよ。

【69812】Re:setfocus が効かない
お礼  mai  - 11/8/31(水) 13:10 -

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

ありがとうございました。
思い通りの結果になりました。

でも、なんでSetFocusは効かなかったんでしょうか?

なぞです

【69813】Re:setfocus が効かない
質問  mai  - 11/8/31(水) 13:40 -

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

何度もすみません。

VBEの画面からツールバーのユーザーフォームの実行を押して動かすと、
思った通りに動いてくれるのですが、
なぜか、普通に作成したコマンドボタンから、実行させると、
まったく、効かないのです。

何が原因なのか・・・?
考えられる原因として
もし分かったら教えていただきたいです。

【69814】Re:setfocus が効かない
回答  jyun  - 11/8/31(水) 13:59 -

引用なし
パスワード
   >でも、なんでSetFocusは効かなかったんでしょうか?
>なぞです

ヘルプによると
Exit イベントは、同一フォーム上にある別のコントロールにフォーカスを移す直前に発生します。

動作の順番は、
Exitイベントのプロシージャを実行後、別のコントロールにフォーカスを移します。
だからExitイベントでSetFocusみたいな事をしても無駄です。
別のコントロールにフォーカスを移すのをキャンセルするために引数のCancelがあります。

【69815】Re:setfocus が効かない
発言  Yuki  - 11/8/31(水) 14:04 -

引用なし
パスワード
   ▼mai さん:
>▼Yuki さん:
>
>何度もすみません。
>
>VBEの画面からツールバーのユーザーフォームの実行を押して動かすと、
>思った通りに動いてくれるのですが、
>なぜか、普通に作成したコマンドボタンから、実行させると、
>まったく、効かないのです。

それは多分
Cancel = true
のせいだと思います。
条件式の中に Cancel = true を入れてあげないと
常に Cancel = true が効いて動かないと思われます。

コードUpして頂かないと想像だけでっす。

【69816】Re:setfocus が効かない
質問  mai  - 11/8/31(水) 14:42 -

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

>それは多分
>Cancel = true
>のせいだと思います。
>条件式の中に Cancel = true を入れてあげないと
>常に Cancel = true が効いて動かないと思われます。
>
>コードUpして頂かないと想像だけでっす。


条件式を入れるという意味が、理解できてないです(悲)
とりあえず、こういう意味なのかな?と思い、コードを追加してみましたが、
結果は同じでした。
もう少し、詳しく教えていただけないでしょうか?

しつこくてすみません・・・

前文省略・・・

 If MyD.exists(品番txt.Text) Then
  
   MsgBox "品番が重複してます。", vbCritical
  
  
  Cancel = True

  If Cancel = True Then
 
  With Me.品番txt
      .SelStart = 0
      .SelLength = Len(品番txt)
   End With
  End If
 End If

End Sub

【69817】Re:setfocus が効かない
お礼  mai  - 11/8/31(水) 14:45 -

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

ありがとうございます。
Exitイベントの意味をいまいち理解できていなかったようです。
そういうことだったんですね。

なるほどです。

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

【69819】Re:setfocus が効かない
発言  Yuki  - 11/8/31(水) 15:31 -

引用なし
パスワード
   ▼mai さん
コマンドボタンから実行するときは
品番txtのExitイベントのチェック部分を
コメントにして下さい。
サンプルです。

Private Sub CommandButton1_Click()
  '〜 略
  If MyD.exists(品番txt.Text) Then
    MsgBox "品番が重複してます。", vbCritical
    With Me.品番txt
      .SelStart = 0
      .SelLength = Len(品番txt.Value)
    End With
  End If
End Sub

Private Sub 品番txt_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  '〜 略
' ******* コマンドボタンから実行のとは コメント ********
  If MyD.exists(品番txt.Text) Then
    MsgBox "品番が重複してます。", vbCritical
    With Me.品番txt
      .SelStart = 0
      .SelLength = Len(品番txt.Value)
    End With
    Cancel = True
  End If
' ******************* 此処まで ***************
End Sub

【69820】Re:setfocus が効かない
回答  jyun  - 11/8/31(水) 15:37 -

引用なし
パスワード
   >VBEの画面からツールバーのユーザーフォームの実行を押して動かすと、
>思った通りに動いてくれるのですが、
>なぜか、普通に作成したコマンドボタンから、実行させると、
>まったく、効かないのです。

そのコマンドボタンのコードを示してもらわないと?ですが、
想像するによくある話としてモードレスで表示しているとか。

以下はモードレスの場合の話です。
Cancel = Trueはやめて、
OnTimeメソッドを用いイベントプロシージャが完了したあとで
SetFocusメソッドを発行する方法があります。

 '省略・・・
 If MyD.exists(品番txt.Text) Then
  MsgBox "品番が重複してます。", vbCritical
  'Cancel = True
  Application.OnTime Now(), "FormsSetFocus"
  With 品番txt
   .SelStart = 0
   .SelLength = Len(.Value)
  End With
 End If


'標準モジュール
Sub FormsSetFocus()
 UserForm1.品番txt.SetFocus 'UserForm名は適宜設定
End Sub

【69825】Re:setfocus が効かない
お礼  mai  - 11/9/1(木) 11:59 -

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

jyunさんのおっしゃるとおり、モードレスにしてあります。
教えていただいたとおり、コードを記述してみたところ、
うまく動きました。

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

OnTimeメソッドについて自分でも調べてみようと思います。

【69826】Re:setfocus が効かない
お礼  mai  - 11/9/1(木) 17:00 -

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

返信遅くなりすみません。
Yukiさんのアドバイスのようにやってみましたが、いまいちうまくいかず、
四苦八苦してました。

今回は、jyunさんのアドバイスで思ったとおりの動作が確認できましたので、
そちらを使おうと思います。

いろいろと教えていただきありがとうございました。

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