- ベストアンサー
VBAユーザーフォームを使った入力で日付や金額を入力する箇所があります
- VBAユーザーフォームを使った入力で日付や金額を入力する箇所があります。例えば日付で2019/12/2と入力したところ、Excelシートには日付ではなく文字列で入力されます。
- 日付で入力した場合、セルの書式設定を日付にしていても文字列になってしまいます。
- 入力したデータをセルに反映させるためのVBAコードを提供します。ご活用ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>日付や金額を入力 「Table」という文字列定数でTextBox(T)とComboBox(T以外)を切り分けているように見えます。 解答として、「Table="TTTTTTCC"」として、2つ目のTからシートへ出力します。2、3番目が日付、4、5番目が数値、6番目は文字列出力とします。 >日付の出力 TextBoxのテキストをセルに出力するために、CDate(テキスト)の変換が必要ですが、十分ではありません。例えば、VBEが日付として認識できる場合は問題ありませんが、月や日を3桁で入力すると認識できません。また、年を4桁以外で入力すると、CDateで先頭に「20」が付加されます。結果、この後でエラーが発生したりします。ユーザーフォームで日付を入力する場合、少なくとも、このようなことに注意する必要があります。解答例は最小のチェックをしてみました。年は4桁か→入力は日付として正しいか→セルに代入の手順です。 >金額の出力 CDblで数値にしています。数値と判断できない場合は何もしません。 >文字の入力 そのまま出力 質問で提示のコードでは、入力エラーはない前提で書かれており、「Registration」が終われば、TextBoxやComboBoxの値は消去されてしまいます。ひとつでもエラーがあれば、セルへの書き込みは行わないで、全て正しく入力された時点でセルに書きこむべきと思います。解答のコードもそのあたりは考慮していません。 「Registration」は データチェック→エラーがあれば中断 →エラーがなければセルに書き出し の手順でしょうか。 Const Table = "TTTTTTCC" Sub Registration(Row As Long) Dim Col As Integer Dim TCount As Integer Dim CCount As Integer TCount = 1 Dim val As Variant For Col = 2 To Len(Table) If Mid(Table, Col, 1) = "T" Then TCount = TCount + 1 val = Controls("TextBox" & TCount).Text Select Case TCount Case 2, 3 '// TxtBox2,3 は日付とする If InStr(val, "/") = 5 Then '// 年は4桁 If IsDate(val) = True Then '// 日付 Cells(Row, Col) = CDate(val) Cells(Row, Col).NumberFormatLocal = "yyyy/mm/dd" End If End If Case 4, 5 '// TxtBox4,5 は数値とする If IsNumeric(val) = True Then Cells(Row, Col) = CDbl(val) Cells(Row, Col).NumberFormatLocal = Format("#,##0") End If Case Else '// その他は文字列 Cells(Row, Col) = val End Select Controls("TextBox" & TCount).Text = "" Else CCount = CCount + 1 Cells(Row, Col) = Controls("ComboBox" & CCount).Text Controls("ComboBox" & CCount).Text = "" End If Next End Sub
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
コードの修正を他人に頼む前に下記認識すべきだ。 >ユーザーフォームを使った入力で日・・ ユーザーフォームではなく、その上に張り付けて利用する、コントロール(テキストぼクス、コンボボックスなど)に対する話題だと認識すること。 こんなの常識。 >文字列で入力されたことになります。 テキストボックスなどで、入力を受け付けたら、文字列データになるのは常識。 数字が欲しい場合でもこれを使えば、文字列数字を数値にする関数をかまさなければならないのは常識。 コンボボックスでもアイテムが数字でも、数字文字列でしか定義できないから 演算などで使うには数値化のステップが必要。 ただし、エクセルのシートにデータを入力する場合は、エクセルの数値化の 引力が強いので、数値でセットされることは、大きな特徴として記憶のこと。 ーー 「日付」はエクセルでは、所定の入力方法をすると、日付シリアル値という実質整数(序数)にしてセットされる。この点を明確に意識してないVBAユーザーが居るようだ。 文字列を日付シリアル値にするVBAの関数があるので、それを必ず使うことだ。 「VBAで文字列から日付(Date型)に変換する」でGoogle照会 http://officetanaka.net/excel/vba/function/DateValue.htm 「日付シリアル値」でGoogle照会。 https://www.jpita.or.jp/simin/index.php?excelziten423 シリアル値とは?
お礼
お返事遅くなり申し訳ございません。 ご指摘いただいた通り認識が薄く、常識も持ち合わせておりません。 文字列になるということなど勉強させていただきました。 ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
CDate(Controls("TextBox" & TCount)) にしてみてはいかがでしょう。
お礼
お返事遅くなり申し訳ございません。 そうやって日付だと指定するのですね・・・ ありがとうございます!
お礼
お返事遅くなり申し訳ございません。 初心者の私でもとても分かりやすく丁寧にご対応いただきましてありがとうございます! 無事完成いたしました! 全て説明いただいておりましたので若干の仕様変更をしつつ使用できました。 感謝です!ありがとうございました。