Excel VBA質問箱 IV

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

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


3141 / 13644 ツリー ←次へ | 前へ→

【63875】テキストボックスへの入力情報を即座にシートに反映させたい ビギナー 09/12/25(金) 12:10 質問[未読]
【63876】Re:テキストボックスへの入力情報を即座に... seg 09/12/25(金) 12:26 発言[未読]
【63878】Re:テキストボックスへの入力情報を即座に... ビギナー 09/12/25(金) 13:54 回答[未読]
【63882】Re:テキストボックスへの入力情報を即座に... seg 09/12/25(金) 16:48 発言[未読]
【63883】Re:テキストボックスへの入力情報を即座に... seg 09/12/25(金) 17:10 発言[未読]
【63877】Re:テキストボックスへの入力情報を即座に... Jaka 09/12/25(金) 12:38 発言[未読]
【63879】Re:テキストボックスへの入力情報を即座に... ビギナー 09/12/25(金) 14:00 回答[未読]
【63892】Re:テキストボックスへの入力情報を即座に... ビギナー 09/12/27(日) 14:30 発言[未読]
【63946】Re:テキストボックスへの入力情報を即座に... UO3 10/1/2(土) 20:26 回答[未読]
【63947】Re:テキストボックスへの入力情報を即座に... UO3 10/1/2(土) 21:23 発言[未読]
【63963】Re:テキストボックスへの入力情報を即座に... seg 10/1/5(火) 11:24 発言[未読]
【63964】Re:テキストボックスへの入力情報を即座に... Yuki 10/1/5(火) 14:14 発言[未読]
【63973】Re:テキストボックスへの入力情報を即座に... ビギナー 10/1/6(水) 10:52 お礼[未読]

【63875】テキストボックスへの入力情報を即座にシ...
質問  ビギナー E-MAIL  - 09/12/25(金) 12:10 -

引用なし
パスワード
   初めて投稿させて頂きます。

入力フォーム上にあるテキストボックスへ入力された情報を、入力後に即座にシートに反映させる動きをさせたいと思っています。
しかし、実際に動作させた際に、入力情報が反映される場合とされない場合があり、その違いが当方では判別出来ません。

私のプログラムの作り方に問題があるのでしょうか?
それとも、Excelの仕様等で、そのような事が起こるのでしょうか?

以下にコードを記載します。
お気付きの点等ありましたら、ご指摘頂ければと思います。
宜しくお願い致します。


Private Sub TextBoxA_AfterUpdate()
  If 数値入力チェック(TextBoxA.Value, itemName) = False Then
    '入力チェックエラーの場合
    '入力情報をクリアする
    TextBoxA.Value = ""
    'フォーカスを元に戻す
    Cancel = True
  Else
    '入力情報をシートに設定する
    Worksheets(sheetName).Range(inputCell).Value = TextBoxA.Value
  End If
End Sub

Function 数値入力チェック(target As String, itemName As String) As Boolean
  '数値以外が入力されている場合はメッセージを表示する
  
  If IsNull(target) = False And target <> "" And IsNumeric(target) = False Then
    '数値以外が入力されている場合
    'メッセージを表示する
    MsgBox (itemName & "には数値を入力して下さい。")
    '戻り値をFalseに設定する
    数値入力チェック = False
    Exit Function
  End If
  '戻り値をTrueに設定する
  数値入力チェック = True
End Function

【63876】Re:テキストボックスへの入力情報を即座...
発言  seg  - 09/12/25(金) 12:26 -

引用なし
パスワード
   ▼ビギナー さん:
一見、コードミスは無いようですが
エラー再現値を教えていただけませんか?

こちらで同様のエラーを発生させる事ができません。

【63877】Re:テキストボックスへの入力情報を即座...
発言  Jaka  - 09/12/25(金) 12:38 -

引用なし
パスワード
   ろくに内容を見てないけど。

>target As String
>If IsNull(target) = False
誰に教わったのでしょうか?
で、Nullってどういう風にとっていますか?
この辺を頓珍漢に使っているためだと思いますよ。

【63878】Re:テキストボックスへの入力情報を即座...
回答  ビギナー  - 09/12/25(金) 13:54 -

引用なし
パスワード
   ▼seg さん:
>▼ビギナー さん:
>一見、コードミスは無いようですが
>エラー再現値を教えていただけませんか?
>
>こちらで同様のエラーを発生させる事ができません。

早速ご返信頂きまして、ありがとうございます。
エラーが起こった際の入力値は

35
50000
2.7

等です。
しかし、これらの値でも、再度入力すると反映されます。
私自身、デバッグしようとした際に再現させることが出来ないため、困惑しています。

【63879】Re:テキストボックスへの入力情報を即座...
回答  ビギナー  - 09/12/25(金) 14:00 -

引用なし
パスワード
   ▼Jaka さん:
>ろくに内容を見てないけど。
>
>>target As String
>>If IsNull(target) = False
>誰に教わったのでしょうか?
>で、Nullってどういう風にとっていますか?
>この辺を頓珍漢に使っているためだと思いますよ。

ご返信ありがとうございます。

IsNullはネットで調べたものを利用させて頂きました。
「""」はString型ですが、Nullは型も指定されていないのだと私は解釈しています。
マクロ起動時等にはコントロールのValue値に何も設定されていないと考え、その条件式を加えています。

この箇所にエラー原因が含まれているのでしょうか?

【63882】Re:テキストボックスへの入力情報を即座...
発言  seg  - 09/12/25(金) 16:48 -

引用なし
パスワード
   ▼ビギナー さん:
セルに数値が適用されない時、テキストボックスには値は入っているのですか?
それによって、値が展開できていないのか
数値チェックで失敗しているのかが解ります。

例えば、数値チェックでエラーが起きているなら
メッセージボックスが出るでしょうし

メッセージボックスが出ていないのに、テキストの値が消されてたら
それもおかしな話ですし・・・

というか、このレベルならもっと簡素化した方が可読性も含め良いのでは?
Private Sub TextBoxA_AfterUpdate()
  If (IsNumeric(TextBoxA.Text) = True) Then
    Cells(1, 1) = TextBoxA.Text
  Else
    MsgBox (itemName & "には数値を入力して下さい。")
    TextBoxA.Text = ""
  End If
End Sub

IsNullについては、VBにはNULL文字はありません。
C等で使われている文字列の最後のコードを&0で表しているにすぎません。
今回のようなプログラムにNULLが含まれる可能性は0です。
VBの場合はプログラム開始時に全てクリアされますが
NULLでクリアされたりせず、""でクリアされます。

ですので、あってもなくてもそれが原因だとは考えにくいですね。

【63883】Re:テキストボックスへの入力情報を即座...
発言  seg  - 09/12/25(金) 17:10 -

引用なし
パスワード
   補足:

絶対にNGではない!
という意味ではありません。
今回の様に、手動でテキストボックスにタイプする際に
またはテキストボックスの初期値にNULLが入ることは無い!
と言う意味です。

APIやらデータベースやら、様々な所からゴミを拾うプログラム
ならNULL参照をした時点でエラーが発生したりします。

【63892】Re:テキストボックスへの入力情報を即座...
発言  ビギナー  - 09/12/27(日) 14:30 -

引用なし
パスワード
   反応が遅くなっていまい申し訳ありません。

あの後も私の方でいろいろ試していたところ、どのような操作をすればセルに反映されないのかがわかりました。
セルに反映されない場合の条件は

1.「入力フォーム.Show」の後、初めて値を入力すること
2.入力モードが「直接入力」以外であること
3.キーボードから入力後、Enterキーで値を確定させないまま別項目をクリックする等し、値が強制的に確定される状況であること

以上の条件を全て満たした場合にセルに反映されないという事がわかりました。
ただ、これらがわかっても、私にはその直し方がわかりません。

上記の事を受け、原因がおわかりの方がいらっしゃいましたら、引き続きアドバイス等頂ければと思っています。
どうかよろしくお願いします。

【63946】Re:テキストボックスへの入力情報を即座...
回答  UO3  - 10/1/2(土) 20:26 -

引用なし
パスワード
   原因はAfterUpdateイベントを使っていることだと思います。
ご自身で発見されたとおり2回目からは、TextBoxAになにがしかの値(エラー時に""とされた値も含めて)が入っていますのでコントロールを抜ける際にこのイベントが発生しますが、最初は【からっぽ】で、そこに何もいれないで、かつ確定もさせないでフォーカスを移動(タブキーや他のボタンのクリック等)すると、そもそもフィールドが【UpDate】されないので、このイベントは発生しないわけです。

これをExitイベントに変えて実行してみてください。これならフォーカスを移動すれば必ず発生しますので。ついでにエラー時、Cancel=trueとすることでフォーカスの移動要請もリセットされますのでフォーカスを元に戻す必要もありません。

ところで、現在のAfterUpdateルーティンでCancel=trueと書いておられますがCancel変数はここで使えません。おそらくoptionでExplicitとしておられないので
エラーには、なっていないんでしょうが。できるだけExplicitとされるよう、推奨します。

それと、多くの方々が言っておられるように、VBAのアプリレベルではNULLは、まず登場しません。IsNullは不要ですね。IsNmericと""で【ない】ことを確認されれば充分でしょうね。

【63947】Re:テキストボックスへの入力情報を即座...
発言  UO3  - 10/1/2(土) 21:23 -

引用なし
パスワード
   補足と一部表現が不正確だったので訂正。

(訂正)
まず、AfterUpdatイベントはテキストボックスになにがしかの値が入力された場合に(もとの値と同じであっても)発生します。逆に、なにも入力しないでタブキーを押しても発生しません。数値以外を入力してエラーとし、""で補正した後、もう一度タブキーを押した場合、【何も入力されていない】のでイベントが発生せず、【見た目】正常と受け付けられたように見えるわけです。

(補足)

IsNullは先に申し上げたとおり、まず不要ですが、要は【からっぽ】ならエラーにしたいという意図だと推察しました。より適切なものとしてはIsEmptyがありますが、このケース、IsEmptyもFalseになります。(もちろんIsNullも、Nullという特殊な物が入っているかどうかのチェックですからFalseになり、意図された結果は得られません)
IsEmptyはTrueになってもよさそうな気もしますが、少なくともValueというプロパティを通じて我々に提供される時点では""(0桁の文字列。Emptyではない)になるようで、従ってIsEmptyもFalseになるわけです。

●いずれにしても先に申し上げたように、Exitイベントを使い、IsNumericと""でないことのチェックでOKになるはずです。

【63963】Re:テキストボックスへの入力情報を即座...
発言  seg  - 10/1/5(火) 11:24 -

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

動作確認してないけど、
う〜ん、すばらしい説明ですね。
勉強になります^^

【63964】Re:テキストボックスへの入力情報を即座...
発言  Yuki  - 10/1/5(火) 14:14 -

引用なし
パスワード
   ▼seg さん:
こんにちは。

参考にして下さい。

' データ転送
Private Sub TextBoxA_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  ' 変数の定義はしてあるものとします
  Worksheets(sheetName).Range(inputCell).Value = TextBoxA.Value
End Sub
' 入力チェック
Private Sub TextBoxA_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If Not Chr(KeyAscii) Like "[0-9.]" Then
    KeyAscii = 0
  End If
End Sub

【63973】Re:テキストボックスへの入力情報を即座...
お礼  ビギナー  - 10/1/6(水) 10:52 -

引用なし
パスワード
   ご連絡が遅くなってしまい申し訳ありません。

ご指摘頂いた通りに修正したところ、当初の問題は解決致しました。
ありがとうございました。

ですが、また新たな問題が発生してしまいました。
こちらについては別トピックを作成致しますので、引き続きアドバイス等頂けると幸いです。
宜しくお願い致します。

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