Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ユーザーフォームのテキストボックス(日付)に入力規制をかけたい
投稿日時: 19/03/08 10:42:28
投稿者: 王様

ユーザーフォームのテキストボックス(日付)に入力規制をかけたい。
 
TextBox1に日付を入力します。
この入力できる日付については、範囲を規制したいのです。
 
シート"決算書"の、[G2](日付)の値から、[G4](日付)の値の範囲までの日付しか入力できないようにしたいと考えています。
[G2]は2019/4/1、[G4]は2020/3/31となっています。
つまり、2019/4/1以前、2020/3/31以降の日付は入力出来ないようにしたいのですが・・・
 
年度が変わるとブックを新しくして、2020/4/1〜2021/3/31になります。
 
Private Sub CommandButton1_Click()
Dim wRow As Long
・・・途中省略・・・
With Worksheets("支出記録")
        wRow = .Range("B2").CurrentRegion.Rows.Count + 1
        .Cells(wRow, 2) = Me.ListBox1
        .Cells(wRow, 3) = Me.TextBox1
        .Cells(wRow, 4) = CCur(Me.TextBox2)
        .Cells(wRow, 5) = Me.TextBox3
        .Cells(wRow, 6) = Me.TextBox4
    End With
・・・途中省略・・・
 End Sub
  
  
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim myDate As Date
     
    If IsDate(TextBox1.Value) Then
        myDate = TextBox1.Value
        TextBox1.Text = Format$(myDate, "yyyy/m/d")
    Else
      TextBox1.Value = ""
      Cancel = True
      MsgBox ("日付が間違っています。")
    End If
 
End Sub
 

回答
投稿日時: 19/03/08 10:59:41
投稿者: Suzu

引用:
シート"決算書"の、[G2](日付)の値から、[G4](日付)の値の範囲までの日付しか入力できないようにしたいと考えています。
[G2]は2019/4/1、[G4]は2020/3/31となっています。
つまり、2019/4/1以前、2020/3/31以降の日付は入力出来ないようにしたいのですが・・・

 
それを
    If IsDate(TextBox1.Value) Then
If 入力できる範囲条件〜〜
myDate = TextBox1.Value
        TextBox1.Text = Format$(myDate, "yyyy/m/d")
Else
        MsgBox "入力範囲外だぉ〜"
      End If

    Else
      TextBox1.Value = ""
      Cancel = True
      MsgBox ("日付が間違っています。")
    End If
 
の様にすれば良いのでは?

回答
投稿日時: 19/03/08 11:29:11
投稿者: WinArrow
投稿者のウェブサイトに移動

2つの方法があります。
  
テキストボックスで運用する場合
  
開始日 = Range("G2").Value
終了日 = Range("G4").Value
 If IsDate(Me.Textbox1.Text) Then
     If Me.TeextBox1.TEXT < 開始日 Or Me.TextBox1.Text > 終了日 Then
        エラー
    End If
 End If
   
コンボボックスで運用する場合
  For Mydate = Range("G2").Value To Range("G4").Value
       me.ComboBox.Additem myDate
   Next
 このようにするとその範囲内の日付しか選択不可にすることも可能です。
  日付データであるかのチェックも必要なくなります。
  しかし、365日文をドロップダウンリストに設定するのは、
  使いにくいかもしれませんが、工夫次第で、こちらの方が便利かもしれません。
  例えば、特定の曜日を省くとかのバリエーションにも対応できます。
 
 コンボボックスを2つ用意(1つ目:年月、2つ目:日)にすると
 操作しやすいかも?
 
 

回答
投稿日時: 19/03/08 11:49:43
投稿者: WinArrow
投稿者のウェブサイトに移動

コンボボックスを2つにした場合の
ドロップダウンリスト設定サンプルコード
 
Option Explicit
Dim SDATE As Date, EDATE As Date
Dim myDATE As Date
 
Private Sub ComboBox1_Change()
Dim MEDATE As Date
    MEDATE = WorksheetFunction.EoMonth(CDate(Me.ComboBox1.Text & "/01"), 0)
    Me.ComboBox2.Clear
    For myDATE = CDate(Me.ComboBox1.Text & "/01") To MEDATE
        Me.ComboBox2.AddItem Day(myDATE)
    Next
End Sub
 
 
Private Sub UserForm_Initialize()
Dim cnt As Long
    SDATE = Range("G2").Value
    For cnt = 0 To 11
        Me.ComboBox1.AddItem Format(DateAdd("m", cnt, SDATE), "yyyy/mm")
    Next
End Sub

投稿日時: 19/03/08 13:36:19
投稿者: 王様

WinArrowさま、ありがとうございました、お礼。
テキストボックスでやりました。以下・・・
 
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim 開始日 As Date
    Dim 終了日 As Date
'決算書シートにある4月1日〜3月31日までの日付しか入力出来ません
    開始日 = Sheets("決算書").Range("G2").Value
    終了日 = Sheets("決算書").Range("G4").Value
    If IsDate(Me.TextBox1.Text) Then
        If Me.TextBox1.Text < 開始日 Or Me.TextBox1.Text > 終了日 Then
            MsgBox "日付が会計年度内になっていません。", vbOKOnly + vbCritical, "確認"
            TextBox1.Value = ""
            Cancel = True
        End If
    End If
 
    Dim myDate As Date
'日付が正しければ実行。
    If IsDate(TextBox1.Value) Then
        myDate = TextBox1.Value
        TextBox1.Text = Format$(myDate, "yyyy/m/d")
    End If
 
End Sub