Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何限制用户只能输入;“是”;或;";一栏_Vba_Excel_Excel 2016 - Fatal编程技术网

Vba 如何限制用户只能输入;“是”;或;";一栏

Vba 如何限制用户只能输入;“是”;或;";一栏,vba,excel,excel-2016,Vba,Excel,Excel 2016,我想限制A列和D列中的用户输入 在A列中,用户应以r00yyyyy的形式输入值,其中yyyyyy是介于000000和999999之间的数字 在D列中,他们只能输入y或n 我下面的代码似乎工作不正常。A列部件工作正常,只是D列有问题 有人能建议一种方法来限制D列中的条目吗 Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim rngCell As Range If Intersect(Target, Range("A:A")

我想限制A列和D列中的用户输入

在A列中,用户应以
r00yyyyy
的形式输入值,其中yyyyyy是介于000000和999999之间的数字

在D列中,他们只能输入
y
n

我下面的代码似乎工作不正常。A列部件工作正常,只是D列有问题

有人能建议一种方法来限制D列中的条目吗

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

Dim rngCell As Range

If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub

Application.EnableEvents = False
For Each rngCell In Target.Cells
    rngCell = UCase(rngCell)
    If rngCell.Characters.Count > 9 Then
    MsgBox ("Student number too long")
    rngCell.Clear
    End If
   If Not IsEmpty(rngCell.Value) Then
    Dim s As String
    Dim s1 As String
    Dim y As String
    Dim y1 As String
    s = CStr(rngCell.Value)
    s1 = Left(s, 3)
    y = CStr(rngCell.Value)
    y1 = Right(y, 6)
    If s1 <> "R00" Or Not IsNumeric(y1) Then
    MsgBox ("Must be in the form R00yyyyyy, where yyyyyy is a number between 000000 and 999999")
    rngCell.Clear
    End If
   Else
   End If
Next
Application.EnableEvents = True

Dim rngCell2 As Range

If Intersect(Target, Range("D:D")) Is Nothing Then Exit Sub

Application.EnableEvents = False
For Each rngCell2 In Target.Cells
    rngCell2 = UCase(rngCell2)
    Dim b As String
    b = CStr(rngCell2.Value)
    If b <> "y" Or b <> "n" Then
    MsgBox ("The only allowable entry here is Y or N")
    End If
Next
Application.EnableEvents = True

End Sub
Private子工作表\u更改(ByVal目标为Excel.Range)
Dim rngCell As范围
如果Intersect(目标,范围(“A:A”))为空,则退出Sub
Application.EnableEvents=False
对于Target.Cells中的每个rngCell
rngCell=UCase(rngCell)
如果rngCell.Characters.Count>9,则
MsgBox(“学生编号太长”)
rngCell,完毕
如果结束
如果不是IsEmpty(rngCell.Value),则
像线一样变暗
将s1变暗为字符串
朦胧如弦
作为字符串的Dim y1
s=CStr(rngCell.值)
s1=左(s,3)
y=CStr(rngCell.值)
y1=右(y,6)
如果s1“R00”是否为数字(y1),则
MsgBox(“格式必须为R00YYYYY,其中YYYYY是介于000000和999999之间的数字”)
rngCell,完毕
如果结束
其他的
如果结束
下一个
Application.EnableEvents=True
变暗rngCell2 As范围
如果Intersect(目标,范围(“D:D”))为空,则退出Sub
Application.EnableEvents=False
对于Target.Cells中的每个rngCell2
rngCell2=UCase(rngCell2)
将b变暗为字符串
b=CStr(rngCell2.值)
如果b“y”或b“n”,则
MsgBox(“此处唯一允许的输入为Y或N”)
如果结束
下一个
Application.EnableEvents=True
端接头

假设其余代码正确,则需要将逻辑测试从或更改为和

If b <> "y" And b <> "n" Then
    MsgBox ("The only allowable entry here is Y or N")
End If
如果b“y”和b“n”,则
MsgBox(“此处唯一允许的输入为Y或N”)
如果结束

假设其余代码正确,则需要将逻辑测试从或更改为和

If b <> "y" And b <> "n" Then
    MsgBox ("The only allowable entry here is Y or N")
End If
如果b“y”和b“n”,则
MsgBox(“此处唯一允许的输入为Y或N”)
如果结束
您有这一行

 If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub
因此,当他们更改D列中的任何内容时,它不在A中,代码在到达D的代码之前退出

 If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub

因此,当他们更改D列中的任何内容时,它不在A中,并且代码在到达您的D代码之前退出

您可以尝试下面的代码。它检查更改是否在A列或D列中,如果两列都没有更改,则退出

然后您就知道更改在A列或D列中,并准确地检查哪一列。然后进行相应的检查,并根据输入显示相应的消息框

要检查像
R00yyyyyy
这样的简单模式,其中
y
是一个数字,您可以使用运算符并使用
#
作为“任意数字”的占位符

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngCell As Range

    ' exit if change was not in column A and not in column D
    If Intersect(Target, Range("A:A,D:D")) Is Nothing Then Exit Sub

    ' get first cell of change
    Set rngCell = Target.Cells(1, 1)

    ' disable events
    Application.EnableEvents = False

    ' now check if change in column A
    If rngCell.Column = 1 Then
        If Not rngCell.Value Like "R00######" Then
            MsgBox "Must be in the form R00yyyyyy, where yyyyyy is a number between 000000 and 999999"
            rngCell.Clear
        End If
    Else 'must have been in column D
        If rngCell.Value <> "y" And rngCell.Value <> "n" Then
            MsgBox "The only allowable entry here is Y or N"
            rngCell.Clear
        End If
    End If

    ' re-enable events
    Application.EnableEvents = True

End Sub
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim rngCell As范围
'如果更改不在A列和D列中,则退出
如果Intersect(目标,范围(“A:A,D:D”))为空,则退出Sub
“获得第一个变化单元
设置rngCell=Target.Cells(1,1)
'禁用事件
Application.EnableEvents=False
'现在检查A列中是否有更改
如果rngCell.Column=1,则
如果不是rngCell.Value,比如“R00”
MsgBox“必须采用R00YYYYY格式,其中YYYYY是介于000000和999999之间的数字”
rngCell,完毕
如果结束
“Else”必须在D列中
如果rngCell.Value“y”和rngCell.Value“n”,则
MsgBox“此处唯一允许的条目是Y或N”
rngCell,完毕
如果结束
如果结束
'重新启用事件
Application.EnableEvents=True
端接头

您可以尝试下面的代码。它检查更改是否在A列或D列中,如果两列都没有更改,则退出

然后您就知道更改在A列或D列中,并准确地检查哪一列。然后进行相应的检查,并根据输入显示相应的消息框

要检查像
R00yyyyyy
这样的简单模式,其中
y
是一个数字,您可以使用运算符并使用
#
作为“任意数字”的占位符

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngCell As Range

    ' exit if change was not in column A and not in column D
    If Intersect(Target, Range("A:A,D:D")) Is Nothing Then Exit Sub

    ' get first cell of change
    Set rngCell = Target.Cells(1, 1)

    ' disable events
    Application.EnableEvents = False

    ' now check if change in column A
    If rngCell.Column = 1 Then
        If Not rngCell.Value Like "R00######" Then
            MsgBox "Must be in the form R00yyyyyy, where yyyyyy is a number between 000000 and 999999"
            rngCell.Clear
        End If
    Else 'must have been in column D
        If rngCell.Value <> "y" And rngCell.Value <> "n" Then
            MsgBox "The only allowable entry here is Y or N"
            rngCell.Clear
        End If
    End If

    ' re-enable events
    Application.EnableEvents = True

End Sub
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim rngCell As范围
'如果更改不在A列和D列中,则退出
如果Intersect(目标,范围(“A:A,D:D”))为空,则退出Sub
“获得第一个变化单元
设置rngCell=Target.Cells(1,1)
'禁用事件
Application.EnableEvents=False
'现在检查A列中是否有更改
如果rngCell.Column=1,则
如果不是rngCell.Value,比如“R00”
MsgBox“必须采用R00YYYYY格式,其中YYYYY是介于000000和999999之间的数字”
rngCell,完毕
如果结束
“Else”必须在D列中
如果rngCell.Value“y”和rngCell.Value“n”,则
MsgBox“此处唯一允许的条目是Y或N”
rngCell,完毕
如果结束
如果结束
'重新启用事件
Application.EnableEvents=True
端接头

这就是发生的情况吗?我该如何解决这个问题?我在所有网站上查找了数小时。如果Intersect(目标,范围(“A:A,D:D”))为空,则可以使用
检查A列或D列中的更改,然后退出Sub
基本上,我希望用户在A列中输入值,作为“R00YYYY”yyyyyy,它是介于000000和99999之间的数字。当他们进入D列时,他们被限制只使用“y”或“n”,这是怎么回事?我该如何解决这个问题?我在所有网站上查找了数小时。如果Intersect(目标,范围(“A:A,D:D”))为空,则可以使用
检查A列或D列中的更改,然后退出Sub
基本上,我希望用户将A列中的值输入为“R00yyyyyy”yyyyy,即n