2017-03-29 20 views
0

私は、ユーザーフォームに動的にTextBoxesを追加し、正しい日付入力を保証するために日付フォームにしたいと考えています。私は例を見つけることができません。ここでフォーマットExcelで動的にテキストボックスを追加

は、ユーザーフォームの活性化のために私のコードです:

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) 

fltDays = TextBox3.Value If TextBox3.Value = 0 Then Exit Sub 

For i = 1 To fltDays 

n = i - 1 

Dim TextBox As Control 

Set theLbl = FloatDayFrm.Controls.add("Forms.Label.1", "lbl_" & i, True) 
    With theLbl 
     .Caption = "Day " & i 
     .Left = 20 
     .Width = 60 
     .Top = n * 24 + 100 
     .Font.Size = 10 
    End With 


Set TextBox = FloatDayFrm.Controls.add("Forms.TextBox.1", "TextBox_" & n, True) 
    With TextBox 
     .Top = 100 + (n * 24) 
     .Left = 90 
     .Height = 18 
     .Width = 50 
     .Name = "txtBox" & i 
     .Font.Size = 10 
     .TabIndex = n + 4 
     .TabStop = True 
    End With Next i 

FloatDayFrm.Height = 150 + fltDays * 24 With btnOK .Top = 102 + fltDays * 24 .TabStop = True .TabIndex = n + 5 End With 

With btnCancel .Top = 102 + fltDays * 24 '.TabStop = True .TabIndex = n + 6 End With 

End Sub 

これは、コマンドボタンのために私のコードです:

Private Sub btnOK_Click() 

n = TextBox3.Value 

For j = 1 To n 

Set varFloatDay = FloatDayFrm.Controls("txtBox" & j) 

Select Case varFloatDay 
    Case "" 
     MsgBox "Day " & j & " can't be blank", vbOKOnly, "Incorrect Value" 
     Exit Sub 
    Case Is > TextBox2.Value 
     MsgBox "Date is after end date", vbOKOnly, "Incorrect Value" 
     Exit Sub 
    Case Is < TextBox1.Value 
     MsgBox "Date is BEFORE end date", vbOKOnly, "Incorrect Value" 
     Exit Sub 
End Select 

Next j 

End Sub 

任意の助けをいただければ幸いです。

答えて

1

テキストを日付形式に変換する必要があります。あなたは複数のアプローチを使用することができます。

  1. ユーザーが日付を指定する形式を表示するには、テキストボックスの横にラベルを追加します。書式ごとにユーザーが指定したテキストを解析します。以下のコードに示すように、検証と変換を行います。
  2. ユーザー入力としてテキストボックスの代わりにカレンダーコントロールを使用します。
  3. 年、月、日のテキストボックスまたはセルを分けてください。以下のコードに示すように、検証と変換を行います。
  4. 地域の設定に従って日付が指定された形式であることが確実な場合は、以下のコードに示すように、検証と変換を行います。

私は地域の設定にかなりの自信を持って、そのアプローチを取っ

Private Sub TestDate() 
    Dim yr As Integer 
    Dim mnth As Integer 
    Dim day As Integer 
    Dim dt As Date 
    Dim strDate As String 

    '''''3rd approach'''''' 
    yr = ActiveSheet.Range("A1") 
    mnth = ActiveSheet.Range("B1") 
    day = ActiveSheet.Range("C1") 
    If IsNumeric(yr) And IsNumeric(mnth) And IsNumeric(day) Then 
     If yr < 0 Or mnth < 0 Or day < 0 Then 
      MsgBox "Year, Month and Day must be greater than 0." 
      Exit Sub 
     End If 
    Else 
     MsgBox "Year, Month and Day must be an integer." 
     Exit Sub 
    End If 
    'convert to Date 
    dt = DateSerial(yr, mnth, day) 

    '''''4th approach'''''' 
    'Display a date according to your system's short date format 
    'i.e. regional settings in control panel 
    strDate = Format(ActiveSheet.Range("D1"), "Short Date") 
    If Not IsDate(strDate) Then 
     MsgBox "Incorrect Date Format" 
     Exit Sub 
    End If 
    dt = CDate(strDate) 
End Sub 
+0

の下に試してみてください。私のスキルは中級で、カレンダーコントロールは一度も使用していませんが、私はそれを試してみることができます。 @MukulVarshney –

+0

@Variatus私は私の地域の設定に自信を持ってあなたのisDateの方法を使用しました。それはうまく動作します。 –

+0

@Variatusツールボックスでカレンダーコントロールを見つけることができません。参照する必要があるライブラリがありますか? –

1

テキストボックス内の入力はすべてテキスト文字列です。日付にしたい場合は、IsDate(TextBox1.Value)を使用して、VBAが文字列を日付(ダブルタイプの番号)に変換できるかどうかを判断できます。しかし、VBAはこのテストを100%正しく実行しません。たとえば、地域設定で日付区切り文字をピリオドとして使用している場合は、3/2/17が日付として認識されないことがあります。地域設定がmm.dd.yyの場合、3.2.17を3月2日に変換することがあります。あなた自身のPCで作業している間、あなたは地域の設定を制御することができるかもしれません。しかし、あなたのプロジェクトが野生に放出される場合は、カレンダーコントロールを使用して正しい日付を取得する方がよいでしょう。

関連する問題