アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

#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イベントに変更しました。

ただアクティブセルを基準にしてセルに値を書き込むのは、トラブルの元のように思えて仕方ないですが、その仕様で大丈夫ですか

この回答への補足

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

補足日時:2007/10/31 19:29
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/05 22:31

#01です。

#01のお礼を読みましたが、何をされたいのかさっぱりわかりません。

TextBoxのValueは本来、文字型です。これをVBAでセルに書き込んだときエクセルは「時刻」と判断して自動的に日付型に変換しますが、直接TextBoxのValueを扱うときは文字型のデータですから、Format関数で整形しようとしても無意味です。おそらくこの点が理解できていないように感じました。
どうしてもTextBoxのValueを整形したいなら、DateValue(日付を表す文字列)という関数もありますからヘルプで調べてみてください。

またUserForm_InitializeイベントでTextBox_ChangeイベントのモジュールをCallしていますが、これもよく理解できません。
(仮に動いたとしてもInitializeイベントでは最初にLoadしたときの1回しか動作しませんよ。だから#03ではActivateイベントにしたのですがInitializeイベントに戻したのはなぜでしょうか)

私の回答は既にされています。それを工夫して改良していただくのは大変に喜ばしいことですが、「改造した結果が動かない」と言われてもどうしようもありません。例え初心者であってもそれはご自身でDebugするべきです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/31 21:12

この問題は私には難しいな。

下記で正しいか自信ないが。
(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)-->テキストボックスに反映。
すると思うが。何か問題がありそう。

この回答への補足

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

補足日時:2007/10/31 13:38
    • good
    • 0

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

この回答への補足

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様の、
回答の利用方法が、どう利用してよいのかわかりません
教えてください。
読みにくいコードを、記載したことをお許しください。
よろしくお願いします。

補足日時:2007/10/31 13:05
    • good
    • 0
この回答へのお礼

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等に表示されるのか、教えてくださいお願いします。

お礼日時:2007/10/31 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A