[[20170819153442]] 『UserformでコントロールTabStopが効かない』(欲張り爺) ページの最後に飛ぶ

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

 

『UserformでコントロールTabStopが効かない』(欲張り爺)

 お久しぶりです。又、お世話になっております。
 (症状)ブックを開きフォームも開いた時、全くコントロールへのフォーカス移動が出来ません。
 Tabを押しての移動も出来ず、思いもよらない動作をします。TextBoxでエンターキーを押しても同じ。
 出来る操作はスピンボタン(シートの行移動)とコマンドボタンと終了Xボタンです。
 一旦フォームを閉じて再度開き直すと予定道理の動作となるのです。何故でしょう?

 実際のフォーム内のコントロール配置
    (事前設定)      (オープン後の追加)
 コマンドボタン X 4個   ラベル  X 18個
 スピンボタン  X 1個   TextBox X 18個
 ラベル     X 2個

 イベント処理
 (UserForm)Initialize,Activate,Terminate
   TextBox_Exit,Spin_Change,Spin_KeyDown   この程度です。

 どの様に説明してよいかも分からず質問させて頂きました。
 ゴチャゴチャ書いているプロシージャが原因とは思えないのですが・・・
 コントロール配列にBpca(疑似からの脱出)を利用。(殆ど意味分からずツールとして活用)

 もう1件不思議な現象があります。
 先頭列が日付のデータレコードで、先頭行からスピンボタンで最終行+1行まで行き戻る時です。(空白行からの戻り)
 それまではシートデータをTextboxへ表示しているのが、日付データTextboxだけが真っ白となります。
 只、マウスをヒットさせたりエンターキーで移動してフォーカスを当てると出現。摩訶不思議?

 TextBox1= Range("00").Value とすれば問題無く表示されます。
 TextBox1=(Format(Range("00").Value,"yyyy年mm月dd日" とした場合
 空白行では 1899年12月30日となって困りました。

 これを避ける為に次の様に対処
   TextBox1=IIF(Range("00").Value ="","",(Format(,"yyyy年mm月dd日" ))
     結果が表示されなくなったのです。

 ちなみにこのブックにはもう1つフォームがあり、こちらもオープン後のコントロール追加をしていますが問題なしです。
 TextBoxでは無くComboBoxです。このフォームを開いた後では、問題フォームも問題無しとなるのです。

 色々試しましたが分かりませんでした。私のPCだけの問題でしょうか?
 よろしくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 >私のPCだけの問題でしょうか?

 エクセルの標準機能の話じゃないので、再現手順を詳細に提示して頂かないと
 判断がつけられないんじゃないですかねぇ。

 尤も、その手順を示されたとしても、Bpcaを使うのが必須でしょうから、
 テストしてくれる回答者は少数になる様な気がしますけども。

 後半の質問は、色々な現象が書かれているので的が絞れません。
 肝心な部分は何処なんですか? その部分を再掲して頂けませんか?

 だいたい、この部分のステートメント類は本当ですか? 適当に手打ちされた情報だとすると判断材料にならないですけど。
          ↓
 > TextBox1=(Format(Range("00").Value,"yyyy年mm月dd日" とした場合
 > 空白行では 1899年12月30日となって困りました。
 >
 > これを避ける為に次の様に対処
 >   TextBox1=IIF(Range("00").Value ="","",(Format(,"yyyy年mm月dd日" ))
 >     結果が表示されなくなったのです。

 本当に空白(行?)なんですか? これをやってみると、空白文字が返ってきますよ? 実体は「0」ではないですか?
              ↓
       MsgBox Format(Empty, "yyyy年mm月dd日")

(半平太) 2017/08/19(土) 22:27


 後半部の具体的内容はデータレコードをTextBoxへの書出しです。

 MsgBox Format(Empty, "yyyy年mm月dd日") の結果は何も表示されないメッセージとなります。
 結果は空白文字という事になるのでしょう。実体は「0」であり[Empty]です。

 以下実際のコードです。 
 Private sub Disp()    '1レコード分を表示
 Dim i As Integer, xCtl As Control, Var As Variant

    for i=1 to n 
       Set xCtl = Controls("Tx" & i)        'Tx = TextBox"
       Var = ActiveCell.Offset(, i - 1).Value       '絶えず先頭列をActivateし、ここが基準位置

       Select Case 区分    '列入力規定で表示
          Case 1         '日付
 '            xCtl = Var                                  ⇒ yyyy/mm/dd で表示され空白行時や戻った時の問題出ず
 '            MsgBox Format(Empty, "yyyy年mm月dd日")   ⇒ 空白文字
 '            xCtl = Format(Var, "yyyy年mm月dd日")    ⇒ 空白行で 1899年12月30日

             '以下は問題コード。空白行で表示されなくなるが、最終行へ戻った時に日付が表示されない。
             'このTextBoxをクリックすれば表示される。(★空白行へ行き戻った時のみ発生★)。
              If IsEmpty(Var) Then xCtl = ""
                 xCtl= ""
              Else
                 xCtl= Format(Var, "yyyy年mm月dd日")
              End IF
          Case 2
             省略

 このブックの作成意図はデータシートから入力フォームを作成するものです。
 汎用性のある入力フォームであれば、都度フォームを作成しなくてよいからです。
 列数が未定なのでフォームを開いた後にコントロール追加しました。
 データシートから見出し行(項目行)からその文字列と列数を取得。

 Form1:各項目の書式をComboBoxから選択するのみ。 日付/日本語入力/郵便番号等
 Form2:基本はTextBoxが中心。シートからFormのTextBoxへの書出しとTextboxでの変更をシートへ直接書き戻す。

 1番目問題のTabキーやEnterキーを受付けず。
 Form1では問題が起きない。Form2を最初に開くと何故か症状が出る。
 尚、Form2に置いたコマンドボタンで行追加/削除を先に実行すると問題は起きない。(?)

 十分とは言えない説明ですがこれが現状です。
(欲張り爺) 2017/08/20(日) 08:11

 MsgBox VarType(0) & vbLf & VarType(Empty) & vbLf & _
       VarType(Range("A1").Value) & vbLf & VarType(Range("A1").Formula) & vbLf & VarType(Range("A1").Text)

 VarType関数の返す値
http://officetanaka.net/excel/vba/function/VarType.htm

 こっちの方が良かったかな?

 >実体は「0」であり[Empty]です

 Range("A1:A2").Delete
 Range("A1").Value = 0
 MsgBox IsEmpty(Range("A1").Value) & vbLf & _
        IsEmpty(Range("A2").Value)

(BJ) 2017/08/20(日) 11:06


 >              If IsEmpty(Var) Then xCtl = ""
 >                xCtl= ""
 >              Else
 >                xCtl= Format(Var, "yyyy年mm月dd日")
 >              End IF

 これ、コンパイルするとは思えませんが?
(seiya) 2017/08/20(日) 12:49

 BJさん 
              新規ブック  該当ブックのセル
 最初のメッセージの結果 ⇒  2 0 0 8 8       2 0 0 8 8     ←★結果は同じ
 [Vartype] は知りませんでした。有難うございます

 >実体は「0」であり[Empty]です    ←★この事は事前に調べて分かっていました。

 その為に If IsEmpty(Var) Then xCtl = "" else xCtl = xxxx     としたのですが・・・

 現在はIF文を使わず、リテラル値となっているTextBoxの値をそのまま出し入れしています。
 この方法では何ら問題を起こさないからです。只、どうしてこの現象が起きるのか知りたいのも本音です。

 本来の質問 [TabキーやEnterキーを受付けず] 何故でしょう。
 該当フォームのコードは380行弱です。部分的に割愛しても300行位。呼出プロシージャは40行程です。
 必要であれば書き出します。  よろしくお願いします。

 Seiya さんへ
 ご指摘の部分は何故か問題無く通り抜けました。少し前に気付いた部分で、Var(Variant)では変だなと思い
 Rangeオブジェクト変数へ置き変えてみたのですが結果は同じでした。 理由が分かりません。

(欲張り爺) 2017/08/20(日) 13:33


  > >実体は「0」であり[Empty]です    ←★この事は事前に調べて分かっていました。

 その調査結果が、そもそも間違いだと言うことです。

 ・・と偉そうに言ったところで、私も昔はそんな勘違いをしていた時期がありましたけどね。

(半平太) 2017/08/20(日) 13:56


 そういうことではなく

               If IsEmpty(Var) Then
                 xCtl= ""
               Else
                xCtl= Format(Var, "yyyy年mm月dd日")
               End IF

 こうしないと、コンパイルしないはずですが?
(seiya) 2017/08/20(日) 13:58

 半平太さん

 > >実体は「0」であり[Empty]です    ←★この事は事前に調べて分かっていました
   >その調査結果が、そもそも間違いだと言うことです  ←この意味は何でしょうか

 Seiyaさん

   済みません              '********* この部分は投稿時の入力ミスでした。
 >     If IsEmpty(Var) Then xCtl = ""   
 >        xCtl= ""
 >     Else

(欲張り爺) 2017/08/20(日) 15:01


 >>その調査結果が、そもそも間違いだと言うことです  
 >←この意味は何でしょうか

 単変数の値(実体)が同時に、[0]でもあり、[Empty]でもあるなんてことは無いと言うことです。

 実体は一つしかないです。

(半平太) 2017/08/20(日) 16:23


横入り。
 
Format(Var, "yyyy年mm月dd日") が1899年12月30日となったときの Varを
Debug.Print Var でイミディエイトウインドウに出力してみては?
たぶん 0 になるのでは?
 
ワークシート上で0を非表示にするオプションを設定していませんか?

(γ) 2017/08/20(日) 17:52


 半平太さん
 ==========
  >単変数の値(実体)が同時に、[0]でもあり、[Empty]でもあるなんてことは無いと言うことです

 今日は同じ件で何度も説明を受けましたが、説明を理解していなかった事にようやく分かりました。
 理解出来なかった自分に嫌気がさしましたが、最後に勘違いに気付けて感謝です。

 2つの問題点はもう一度モジュール内を検証します。 有難うございました。

 γさん
 ======
 >ワークシート上で0を非表示にするオプションを設定していませんか?
 これは設定しています。そして空白行のセルが[0]というのも理解しつつ。

 BJさんの 2017/08/20(日) 11:06 これを見ていただけで理解していませんでした。  皆さんご迷惑をおかけしました。  

(欲張り爺) 2017/08/20(日) 18:19


じゃあ、Format(0, "yyyy年mm月dd日") が1899年12月30日となって何の不思議もないですね。

(γ) 2017/08/20(日) 18:31


コメント返信:

[ 一覧(最新更新順) ]


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