• ベストアンサー

フォームテキストボックスの表示設定

Excelシートとユーザーフォームのテキストボックスを、 ConntrolSourceで連動させ表示させています。 この時、セルの表示は、時刻表示させ、時間単位の計算を行っていますが、フォームの表示が、時刻表とならず、0.5などと表示されてしまいます。フォームからの入力は、時刻入力してもセルへは、正常に時刻単位で入力できます。 フォームの、表示を時刻単位で表示するには、どうしたらよいのか、教えてください。VBA超初心者で、困り果てています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#01です。補足ありがとうございました まず先の回答を理解するために新規のブックにユーザフォームとテキストボックスを1つ配置して、ユーザーフォームのモジュールシート(VBE画面でユーザーフォームをダブルクリックすると開くシート)に#01のVBAを貼り付けて動作を確認してください。 その上で、時刻を入力するテキストボックスが複数あるなら、TextBox_Changeイベントのモジュールも複数になります Private Sub TextBox9_Change()  ActiveCell.Offset(1,0).Value = TextBox9.Value End Sub Private Sub TextBox10_Change()  ActiveCell.Offset(2,0).Value = TextBox10.Value End Sub Private Sub TextBox11_Change()  ActiveCell.Offset(3,0).Value = TextBox11.Value End Sub Private Sub TextBox12_Change()  ActiveCell.Offset(4,0).Value = TextBox12.Value End Sub   Private Sub UserForm_Activate()  TextBox9.Value = Format(ActiveCell.Offset(1,0).Value, "h:mm")  TextBox10.Value = Format(ActiveCell.Offset(2,0).Value, "h:mm")  TextBox11.Value = Format(ActiveCell.Offset(3,0).Value, "h:mm")  TextBox12.Value = Format(ActiveCell.Offset(4,0).Value, "h:mm") End Sub #01ではUserForm_Initializeイベント使いましたが、複数のシートに繰り返してユーザーフォームで入力を行うようなのでUserForm_Activateイベントに変更しました。 ただアクティブセルを基準にしてセルに値を書き込むのは、トラブルの元のように思えて仕方ないですが、その仕様で大丈夫ですか

kamikaze-7
質問者

お礼

zap35様 無事、完成しました。返事が遅くなり申し訳ありませんでした。 #01の回答に、素人が、訳も解らずあれこれ考えた挙句、ただ動いたというだけで、返信してしまいました、#03で、私の拙いコードに丁寧な回答をいただいていたのに、本当に申し訳なくて、コードを理解するため、あれこれ勉強していました今は、#03の回答が、私のこれからの、VBAを勉強するための、バイブルとなっています。 本当に有難うございました。改めまして、気分を害されたのではないかと思い、お許し願います、これからも、解らない所があったら、よろしくお願いします。

kamikaze-7
質問者

補足

丁寧な回答、有難うございます。 早速、ブックを作り試してみます。 zap35様が、ご心配いただいている、トラブルの元になるのではないかとの、ご指摘有難うございます。 なにぶん、VBA超初心者のため、ご指摘を理解出来ずにいます。 申し訳ありません、アクティブセルは、ある値の変化を基準にしてIF~then により、指定しています。

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#01です。#01のお礼を読みましたが、何をされたいのかさっぱりわかりません。 TextBoxのValueは本来、文字型です。これをVBAでセルに書き込んだときエクセルは「時刻」と判断して自動的に日付型に変換しますが、直接TextBoxのValueを扱うときは文字型のデータですから、Format関数で整形しようとしても無意味です。おそらくこの点が理解できていないように感じました。 どうしてもTextBoxのValueを整形したいなら、DateValue(日付を表す文字列)という関数もありますからヘルプで調べてみてください。 またUserForm_InitializeイベントでTextBox_ChangeイベントのモジュールをCallしていますが、これもよく理解できません。 (仮に動いたとしてもInitializeイベントでは最初にLoadしたときの1回しか動作しませんよ。だから#03ではActivateイベントにしたのですがInitializeイベントに戻したのはなぜでしょうか) 私の回答は既にされています。それを工夫して改良していただくのは大変に喜ばしいことですが、「改造した結果が動かない」と言われてもどうしようもありません。例え初心者であってもそれはご自身でDebugするべきです。

kamikaze-7
質問者

お礼

zap35様 丁寧な、ご指導有難うございます。 ご指摘の通り、textboxの、取り扱いが全然理解していなく安易に、 動くかどうかで、喜んで基本が出来ていませんでした。 私の、質問に丁寧に回答していただいたのに、申し訳ありませんでした。 #03の回答を、基本から勉強しなおします。 本当に有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

この問題は私には難しいな。下記で正しいか自信ないが。 (1)Userform1を作成。 (2)テキストボックスをユーザーフォーム上に作成 (3)その他コントロールをユーザーフォーム上に1つ作成。 (4)(2)のテキストボックスには ConntrolSourceにA1(例)と設定。 (5)標準モジュールに Sub test01() UserForm1.Show vbModeless End Sub と入れる。 (6)シートSheet1のイベントに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then UserForm1.TextBox1.Value = Format(Range("a1"), "hh:mm") End If End Sub をコピペ。 (6)シートSheet1をアクチブにしておいて (7)標準モジュールの(5)を実行 ーー テキストボックスを変える(例11:20)ーー>A1に反映 セルA1を変える(例 18:56)-->テキストボックスに反映。 すると思うが。何か問題がありそう。

kamikaze-7
質問者

補足

imogasi様 回答有難うございます。 参考にして、設定してみます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

ConntrolSourceでセルの値と連動させる場合、時刻を表すシリアル値が表示されてしまうみたいなので、ConntrolSourceプロパティは使わず、ユーザフォームイベントで連動させたらいかがでしょう。もしそのテキストボックスには時刻しか入力されないなら以下でも可能です。 Private Sub TextBox1_Change()  Sheets("Sheet1").Range("A1").Value = TextBox1.Value End Sub Private Sub UserForm_Initialize()  TextBox1.Value = Format(Sheets("Sheet1").Range("A1").Value, "h:mm") End Sub

kamikaze-7
質問者

お礼

zap35様 回答の利用方法を、自分なりに考え Private Sub TextBox8_AfterUpdate() TextBox8.Value = Format(TextBox8.Value, "h:mm") End Sub で、テキストボックスの表示方法を設定し 次に Private Sub UserForm_Initialize() Call TextBox8_AfterUpdate ........... と、フォームの初期化時に、 テキストボックスを書き換えさせ表示できないものか試したところ 時間単位で表示することが出来ました。 ただ、12:00の表示が、なぜか0:05又24:00が0:00と表示されてしまいます。 この考え方でよいものか、又なぜ12:00が0:05等に表示されるのか、教えてくださいお願いします。

kamikaze-7
質問者

補足

zap35様、早速の回答ありがとうございます。 私が、書いたコードは、以下のコードですが、 計算させるための、表がいくつかあって、フォームから それぞれの表に、アクティブセルを切り替え入力しています。 それらの、コードは、省略しています。 Sub 表示データ設定() 'シートと、ユーザーフォームの各作業時間とを、連動させます。 Dim lngrow As Long lngrow = ActiveCell.row TextBox8.Value = "b" & lngrow  TextBox9.ControlSource = ActiveCell.Offset(1, 1).Value   TextBox10.ControlSource = ActiveCell.Offset(2, 1).Value  TextBox11.ControlSource = ActiveCell.Offset(3, 1).Value TextBox12.ControlSource = ActiveCell.Offset(4, 1).Value End Sub を、Callで使用しています。 質問ばかりで、申し訳ありませんが、zap35様の、 回答の利用方法が、どう利用してよいのかわかりません 教えてください。 読みにくいコードを、記載したことをお許しください。 よろしくお願いします。

関連するQ&A