いつもお世話になります。お知恵を貸してください。
ユーザーフォームにコンボボックスがあります。
リストの中身はプロパティウィンドウのRowSourceでSheetにある時間表を指定しています。
そのリストは7:00,7:30,8:00…と時刻をh:mmで表示してあります。
コンボボックスには7:00と表示されているのですが、実際選ぶとシリアル値で表示されてしまいます。
[終了時間]-[開始時間]の計算もしたいので、シリアル値は必要だと思いますが、表示はh:mmで表示する方法を教えてください。
よろしくお願いします。
No.6ベストアンサー
- 回答日時:
ついでに、入力チェックや入力補助機能なども含めたサンプル。
1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト
Option Explicit
' // フォームを閉じる場合のフラグ
Private m_fFormClose As Boolean
' // Userform が初期化される時実行されるイベント
'
Private Sub UserForm_Initialize()
With Me.ComboBox1
.List = Application.Text(Range("Sheet1!A1:A20").Value, "h:mm")
' IME を無効化し全角文字などが入力されないようにする
.IMEMode = fmIMEModeDisable
' 最大5文字までしか入力できなくする
.MaxLength = 5
End With
End Sub
' // Userform を閉じる時実行されるイベント
'
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
m_fFormClose = True
End Sub
' // ComboBox がフォーカスを失うとき実行されるイベント
'
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' フォームを閉じるフラグが立っている場合、即終了
If m_fFormClose Then Exit Sub
Dim s As String
s = Trim$(ComboBox1.Text)
If Len(s) Then
' 時刻以外が入力されたらフォーカス遷移をキャンセルさせる
Cancel = Not IsTime(s)
End If
End Sub
' // ComboBox キーが押されたとき実行されるイベント
' // ANSI コードまたはシフト JIS コードに対応する文字キーで発生
'
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
' 時刻入力のため以外のキー入力以外は無効化する
If Not Chr(KeyAscii) Like "[0-9:]" Then
KeyAscii = 0
End If
End Sub
' // ComboBox キーが押されれ、キーを離したとき実行されるイベント
'
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
' 以下は ComboBox のマッチング機能を利用し、「:」記号の入力を
' スキップさせる入力補助を行う
If KeyCode <> vbKeyBack Then ' BackSpace キーは除外
If Me.ComboBox1.SelText Like ":*" Then
Me.ComboBox1.SelStart = Me.ComboBox1.SelStart + 1
Me.ComboBox1.SelLength = 2
End If
End If
End Sub
' // CommandButton をクリックしたとき実行されるイベント
'
Private Sub CommandButton1_Click()
' C1 セルへ記入
With Cells(1, "C")
.NumberFormat = "h:mm"
.Value = CDate(Me.ComboBox1.Value)
End With
End Sub
' // 内部チェック関数-時刻書式
'
Private Function IsTime(ByVal s As String) As Boolean
If IsDate(s) And (s Like "#:##" Or s Like "##:##") Then
IsTime = True
Else
MsgBox "時刻を入力して下さい", vbCritical
End If
End Function
この回答への補足
KenKen_SP様
遅くなりましたが、実行してみました。
とてもすごいです!!
自分で時間の引き算も足してみました。
' // ComboBox2 がフォーカスを失うとき実行されるイベント
'
Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' フォームを閉じるフラグが立っている場合、即終了
If m_fFormClose Then Exit Sub
Dim s As String
s = Trim$(ComboBox2.Text)
If Len(s) Then
' 時刻以外が入力されたらフォーカス遷移をキャンセルさせる
Cancel = Not IsTime(s)
End If
’自分で足したところ
TextBox1.Text = Format((TimeValue(ComboBox2.Text) - TimeValue(ComboBox1.Text)), "h:mm")
End Sub
私の考えていたような動きになっているようです。
本当に助かりました。またご縁がありましたらよろしくお願いします。
KenKen_SP様
ご丁寧なご回答ありがとうございます。
今晩にでも試してみようと思います。
私は参考書を片手に意味を考えながらやっておりますので
時間がかかります。
本当に助かります。ありがとうございます。
それにしても同じ様な動きでもやり方がいろいろあるのですね。
勉強になります。
No.7
- 回答日時:
私が
Private Sub ComboBox3_Change()
ではなく、
Private Sub ComboBox3_AfterUpdate()
を使用した理由を説明していませんでした。
Changeでは、1字入力するごとにプログラムが起動してしまいます。
そのためにプログラムが思うように動いていないのだと思います。
一通り入力を終えて、確定した時点で始めてプログラムを実行するために「AfterUpdate」を使用しました。
Private Sub ComboBox1_AfterUpdate()
MsgBox "Update"
End Sub
と
Private Sub ComboBox1_Change()
MsgBox "Change"
End Sub
の違いを試してください。
両方いっぺんに設定すると分かりにくいので、片方ずつ設定してみてください。
この回答への補足
rukuku様こんにちは。
AfterUpdateとChangeの違いを感じてみました。なるほでです。
先日の返答が他の方への返答が入ってしまっていました。大変失礼しました。
(1)やはり引き算がうまくできません。
(2)
Private Sub ComboBox3_AfterUpdate()
If IsDate(ComboBox3) Then MsgBox = TimeValue(ComboBox3)
End Sub
これを実行すると「代入式の左辺の関数呼び出しは、バリアント
型またはオブジェクト型の値を返さなければなりません」と
メッセージがでます。
お時間がありましたらよろしくお願いします。
rukuku様
丁寧にご説明頂き本当にありがとうございます。
のちほど試してみようと思います。
こちらも参考書を片手に意味を調べながら実行しておりますが、
なかなか??です。
がんばります。
No.5
- 回答日時:
レス遅くなりました。
#2 はボツの方向で。RowSource を使うとこういう部分が面倒ですね・・ComboBox にアイテムを
セットするには、RowSource の他、
・List プロパティー
・AddItem メソッド
といった方法もあります。次は、List プロパティーを使った例です。
Private Sub UserForm_Initialize()
ComboBox1.List = Application.Text(Range("Sheet1!A1:A20").Value, "h:mm")
End Sub
これなら、わざわざ Change イベントで書式化する必要はありません。
なぜなら最初から書式化した「文字列」をセットしているのですから。
そもそも、TextBox や ComboBox、ListBox などのコントロールの値は
文字列です。それを四則演算したい場合は、数値なりシリアル値として
変換してやらねばなりません。例えば、補足にある
「ComboBox2 - ComboBox1」
という計算を時刻の引き算をしたいなら、
TimeValue(ComboBox2.Text) - TimeValue(ComboBox1.Text)
とします。
私は、RowSource プロパティーは全く使わないので詳しくありませんが、
どうもセル参照のようですね。。データのコピーを ComboBox にセット
するのではなく、セルへリンクが張られてるような感じかと。
数値やシリアル値の場合、面倒そうなので 上記 List プロパティーか、
AddItem の方向で検討してみてください。
No.4
- 回答日時:
>ただ、リストに無い時間(例えば13:15)が手入力できません。
>入力できるようにする方法はありますか?
コンボボックスの、MatchRequired が Trueになっていませんか?
これがTrueになっていると、リストにない値は入力できません。
時刻として認識できる形式で入力されれば、シリアル値として扱うこともできます。以下のコードを試してみてください。
Private Sub ComboBox3_AfterUpdate()
If IsDate(ComboBox3) Then MsgBox = TimeValue(ComboBox3)
End Sub
rukuku様、度々ありがとうございます。
>ただ、リストに無い時間(例えば13:15)が手入力できません。
>入力できるようにする方法はありますか?
は .Style = fmStyleDropDownList を fmStyleDropDownComboに変えたら入力できるようになりました。
ただ、カーソルは入るのですが、数字がうまく入力できません。
1文字目が変になりその後もうまく入力できません。
引き算の方は
Private Sub ComboBox1_Change()
' 値が変更される度に書式を変更する
On Error Resume Next
ComboBox1.Value = Format$(ComboBox1.Value, "h:mm")
End Sub
で文字列になってしまう(?)ので
ComboBox1.Value = Format$(ComboBox1.Value, "h:mm")
のコードを抜くと計算できます。
初心者に毛が生えた程度の私には難しいようです。
作りたいユーザーフォームはイメージできているのですが
VBAを作ることは難しいです。
No.3
- 回答日時:
>ComboBox2もComboBox1と同じように作り
>ListBox1に ComboBox2 - ComboBox1 (引き算)
>を自動表示したい場合のListBox1の
>Private Sub ListBox1_Change()はどのようになりますでしょうか?
リストボックスのイベントからは、コンボボックスのchangeは拾えません。コンボボックスのchangeを使います。
Private Sub ComboBox1_Change()
ListBox1.Value = ComboBox2 - ComboBox1
End Sub
Private Sub ComboBox2_Change()
ListBox1.Value = ComboBox2 - ComboBox1
End Sub
No.2
- 回答日時:
Change イベントで書式化するとか。
以下、新規でのスモールサンプル。1. フォームに ComboBox1、CommandButton1 を配置する
2. Sheet1のA1:A20に RowSource に設定するデータを入力する
3. 以下のソースをフォームにペーストにテスト
Private Sub UserForm_Initialize()
With Me.ComboBox1
.RowSource = "Sheet1!A1:A19"
.Style = fmStyleDropDownList
End With
End Sub
Private Sub ComboBox1_Change()
' 値が変更される度に書式を変更する
On Error Resume Next
Me.ComboBox1.Value = Format$(Me.ComboBox1.Value, "h:mm")
End Sub
Private Sub CommandButton1_Click()
' C1 セルへ記入
With Cells(1, "C")
.NumberFormat = "h:mm"
.Value = Me.ComboBox1.Value
End With
End Sub
この回答への補足
KenKen_SP様 ありがとうございます。
希望通り表示できました。
ただ、リストに無い時間(例えば13:15)が手入力できません。
入力できるようにする方法はありますか?
よろしくお願いします。
No.1
- 回答日時:
こんばんは
Excelのバージョンを教えてください。
手元にある2000で探してみた結果、「表示形式」のようなプロパティはなさそうです。後のバージョンで追加されたかどうかは確認していません。
しかし、バージョン2000でも、「表示」と「実際の計算に使う値」を分けることができます。
以下のことを試してみてください
1. Sheet1に以下のように入力
A B
1 零時 0:00
2 六時 6:00
3 十二時 12:00
4 十八時 18:00
2.コンボボックスのプロパティを以下のように設定
RowSource → Sheet1!A1:B7
BoundColumn → 2
3.コンボボックスのあるフォームのコードに下記を記述
Private Sub ComboBox1_Change()
MsgBox ComboBox1.Value
End Sub
これを使えば、コンボボックスには時刻形式で表示しつつ、計算ではシリアル値を使うことができます。すなわち、左側の列を表示用、右側の列を計算用に使います。(表示用の時刻には「’」をつけておきます。)
この回答への補足
rukuku様 ありがとうございます。
エクセル2000です。無事に表示できました。
さらに質問で恐縮ですが、ComboBox2もComboBox1と同じように作り
ListBox1に ComboBox2 - ComboBox1 (引き算)
を自動表示したい場合のListBox1の
Private Sub ListBox1_Change()はどのようになりますでしょうか?
もしご存知でしたらよろしくご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS VB.net コンボボックス 2 2022/06/30 20:37
- Access(アクセス) エクセルのVBAについて教えてください。 4 2023/01/21 10:21
- Visual Basic(VBA) VBA ComboBoxについて 2 2022/10/21 12:15
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
- Visual Basic(VBA) ExcelVBA ドロップボックスで月を選択するとそれ以降のデータが残るようにしたい。 3 2022/12/16 14:53
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 09:24
- docomo(ドコモ) 通話録音が(最初から)自動的に始まるアプリは? 7 2023/01/16 15:53
- その他(開発・運用・管理) 時間給の計算方法をお教えください 2 2022/06/01 12:21
- Excel(エクセル) 表計算ソフトcalcにおいて、1時間10分を1.1と表記する方法とそれらを集計する方法は? 4 2022/04/06 16:54
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
VBユーザーフォームで時間入力
Visual Basic(VBA)
-
エクセルVBAのフォームで日時を入力しやすくしたい
Excel(エクセル)
-
ユーザーフォームに今の時間を表示
Access(アクセス)
-
-
4
ユーザーフォーム時間表示
Excel(エクセル)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
ユーザーフォーム上に現在日時と時刻を表示させていますがフォームを実行すると時間が更新されません。それ
Visual Basic(VBA)
-
7
コンボボックス内の文字サイズ変更
Excel(エクセル)
-
8
フォームテキストボックスの表示設定
Excel(エクセル)
-
9
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
-
10
ユーザーフォームのラベルに時間を表示させてずっと時間がちゃんと動くような方法はありますか?コード書い
Visual Basic(VBA)
-
11
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
12
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
13
VBA コンボボックスで選んだ値を取得するには
その他(Microsoft Office)
-
14
UserForm1.Showでエラーになります。
工学
-
15
ユーザーフォームのラベルに日付を表示させる方法があればお願いします。出来ればコード書いていただけると
Visual Basic(VBA)
-
16
ユーザーフォームのテキストボックスで時間計算
Visual Basic(VBA)
-
17
VBA コンボボックスの表示(日付)について
Visual Basic(VBA)
-
18
EXCEL VBAのコンボボックスで日だけを表示する方法
Excel(エクセル)
-
19
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
20
エクセルVBAのリストボックスについて
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのセル内に全角数字を...
-
Excelで全角の数字が半角になっ...
-
エクセルで文字入力してEnterキ...
-
エクセルで文字列としての指数...
-
平方センチメートルの入力の仕方
-
エクセルのセルや文字を点滅表...
-
エクセルの「○分○秒」の表示形...
-
WORD2010 差し込み印刷の時間...
-
文字の上にバーをつけるには?
-
Excelで【1-1】【1-2】【1-3】...
-
エクセルで【0.5日と1日】を表...
-
エクセルで時間入力10:30の:...
-
エクセル
-
EXCELで勝手に予測入力される
-
入力規則・シート保護すると再...
-
【Excel】true を入れると大文...
-
エクセルで自動的にイコール(...
-
エクセルでの秒未満の入力
-
EXCELの日付入力で年を省略したい
-
関数CONCATENATEの表示で
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのセル内に全角数字を...
-
Excelで全角の数字が半角になっ...
-
エクセルで文字入力してEnterキ...
-
エクセルで文字列としての指数...
-
エクセルのセルや文字を点滅表...
-
Excelで時間順で並べ替えしたい
-
エクセルで【0.5日と1日】を表...
-
セルに数字を入れると×1000にな...
-
EXCELで勝手に予測入力される
-
文字の上にバーをつけるには?
-
平方センチメートルの入力の仕方
-
入力規則でスペース入力を禁止...
-
エクセルで時間入力10:30の:...
-
エクセルで自動的にイコール(...
-
WORD2010 差し込み印刷の時間...
-
エクセルの「○分○秒」の表示形...
-
関数CONCATENATEの表示で
-
エクセル関数で在庫数の増減を...
-
Excelで【1-1】【1-2】【1-3】...
-
EXCELで特定の文字列を入力→エ...
おすすめ情報