[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
(γ) 2017/08/20(日) 17:52
半平太さん ========== >単変数の値(実体)が同時に、[0]でもあり、[Empty]でもあるなんてことは無いと言うことです
今日は同じ件で何度も説明を受けましたが、説明を理解していなかった事にようやく分かりました。 理解出来なかった自分に嫌気がさしましたが、最後に勘違いに気付けて感謝です。
2つの問題点はもう一度モジュール内を検証します。 有難うございました。
γさん ====== >ワークシート上で0を非表示にするオプションを設定していませんか? これは設定しています。そして空白行のセルが[0]というのも理解しつつ。
BJさんの 2017/08/20(日) 11:06 これを見ていただけで理解していませんでした。 皆さんご迷惑をおかけしました。
(欲張り爺) 2017/08/20(日) 18:19
(γ) 2017/08/20(日) 18:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.