|
▼kanabun さん:
>▼きしやん さん:
>
>>>Private Sub CommandButton2_Click()
>>> if ListBox1.ListIndex < 0 Then
>>> Msgbox "Listから 時刻を選択してください"
>>> Exit Sub
>>> end if
>>> stjikoku = ListBox1.VALUE
>>>
>>>のように直してみては どうですか?
>
>ListBoxにNullがはいってしまう原因と対処法については
>お分かりになりましたでしょうか?
>
>
>>Call CommandButton2_Clickの項は説明不足でしたが、
>>まだ作成途中ですが条件分岐を考えておりまして、select caseも
>>考えていますが、構文が複雑になるかと思い、subルーチン的な
>>ものが出来ればと考えております。
>>このような場合kanabun さんの方法で可能でしょうか
>
>え〜っと、UserFormの各論のまえに 概論をひとつ。
>
>ユーザーフォームというのは、いわば高機能な「複合InputBox」
>なので、UserForm のなかで個々のデータ入力を 一回一回
>InputBoxで個別に実行するのは、入力したデータの表示がすぐ消えて
>しまうので、ユーザーにとって決して入力しやすいインターフェース
>ではないと思います。
>
>UserFormを 複合InputBoxとして利用するなら、複数入力項目別に
>TextBoxやComboBoxを置いておいて、ユーザーに自由に(相互の値を
>確認させながら)入力させ、全部入力が終わった時点で、
>[OK]ボタンを押すようにするのがいいでしょう。
>
>そのような「複合InputBoxとしての UserForm」のイメージを
>参考までに、以下に紹介します。
>
>新しいUserFormに LabelとTextBoxとComboBox をそれぞれ4つづつ、
>以下のLayoutの感じで配置します
>
>┏━━━━━━━━━━━━━━━━━━━━━━━┓
>┃ [Label1] 【TextBox1 】 【ComboBox1】 ┃
>┃ [Label2] 【TextBox2 】 【ComboBox2】 ┃
>┃ [Label3] 【TextBox3 】 【ComboBox3】 ┃
>┃ [Label4] 【TextBox4 】 【ComboBox4】 ┃
>┃ ┃
>┃ 【CommandButton1】【CommandButton2】 ┃
>┃ ┃
>┗━━━━━━━━━━━━━━━━━━━━━━━┛
>
>Option Explicit
>
>'★モジュールレベル変数は必要最小限にとどめる!
>Private Grade As String
>Private Hizuke As Date, Hizuke1 As Date
>
>'▼UserForm 初期化時
>' LabelのCation設定、ComboBoxリスト設定など
>Private Sub UserForm_Initialize()
> Dim c As Range
> Dim i As Long
> Dim SrcList
> With Worksheets("sheet4")
> Hizuke = .Range("c4").Value '★Valueプロパティを省略しない!
> Hizuke1 = .Range("c5").Value
> 'ComboBox用 時刻リスト _
> ◆「Sheet4」の[B2]以降にあると仮定 ◆要 変更
> ' 時刻データを "h:mm"フォーマットした文字列の配列に入れる
> SrcList = Application.Text( _
> .Range("B2", .Range("B1").End(xlDown)), "h:mm")
> End With
> Me.Caption = Hizuke & "〜" & Hizuke1 & "のキャンペーンは " _
> & Grade & "です"
> Label1.Caption = "生産量"
> Label2.Caption = "No.1サイロの在庫量"
> Label3.Caption = "No.2サイロの在庫量"
> Label4.Caption = "No.17サイロの在庫量"
> For i = 1 To 4
> With Controls("ComboBox" & i)
> .RowSource = ""
> .List = SrcList
> End With
> Next
> CommandButton1.Caption = "転記1"
> CommandButton2.Caption = "転記2(時刻)"
>
>End Sub
>
>'Initialize後の画面はこんなふうになるはずです
>┏━━━━━━━━━━━━━━━━━━━━━━━━┓
>┃ 生産量 【 】 【 】 ┃
>┃ No.1サイロの在庫量 【 】 【 】 ┃
>┃ No.2サイロの在庫量 【 】 【 】 ┃
>┃ No.17サイロの在庫量【 】 【 】 ┃
>┃ ┃
>┃ [ 転記1 ] [転記2(時刻)] ┃
>┃ ┃
>┗━━━━━━━━━━━━━━━━━━━━━━━━┛
>
>'▼4つのTextBoxの値を入力後 量をセルに転記する
>Private Sub CommandButton1_Click()
> Dim i As Long
> Dim msg As String
> Dim grade1 As String
> Dim grade2 As String
>
> 'TextBox 入力チェック
> For i = 1 To 4
> msg = Controls("TextBox" & i).Text
> If Len(msg) = 0 Then
> MsgBox Controls("Label" & i).Caption & " が未入力です"
> Exit Sub
> End If
> Next
> 'シートに代入
> Worksheets("sheet6").Range("c5").Value = CLng(TextBox1.Text)
> With Worksheets("Sheet3")
> .Select
> .Range("d4").Value = CLng(TextBox2.Text)
> .Range("d13").Value = CLng(TextBox3.Text)
> .Range("d22").Value = CLng(TextBox4.Text)
> End With
>
> grade1 = "TH-700BJ"
> grade2 = Worksheets("sheet1").Range("t18").Value
> If StrComp(grade1, grade2, vbTextCompare) = 0 Then
> msg = "つぎに投入時刻を各ComboBox より選択してから" _
> & "入力2ボタン を押してください"
> MsgBox msg, vbInformation, "入力1 完了しました"
> End If
>End Sub
>
>'▼4つのComboBoxの「投入時刻」をシートに転記する
>Private Sub CommandButton2_Click()
> Dim i As Long
> Dim c As Range
> Set c = Worksheets("sheet3").Range("d9")
> For i = 1 To 4
> With Controls("ComboBox" & i)
> If .ListIndex < 0 Then
> MsgBox Controls("Label" & i).Caption _
> & "の投入時刻が未選択です", vbCritical
> Else
> c.Item(i).Value = .Value
> End If
> End With
> Next
>End Sub
>
>補足
>通常のInputBoxのように [OK]ボタンはひとつで済むかも知れませんが。
kanabun さん:
丁寧な説明ありがとうございました。
kanabunさんの説明の通り、ユーザーフォームは高機能な「複合InputBox」
という考えで、再考し作成しなおしてみたいと思います。
ありがとうございました。
|
|