使用If语句清除单元格

我正在创build一个用户表单来input地址数据。 我有一个地址名称的文本框,combobox来select道路,街道等,以及4个数字框从奇数到和从,从和到。

我得到的问题是让VBA清除“到”框的内容,如果数字已经被input到它们中,但是用户将它们从“框”改变为“到”框之后的更多值。

这是我目前的代码:

Private Sub txtstreet_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 65 To 90 Case 97 To 122 Case 32 Case 127 Case Else KeyAscii = 0 End Select End Sub Private Sub UserForm_Initialize() roaddesciptor.List = Array("ROAD", "STREET", "WAY", "AVENUE", "DRIVE", "GROVE", "LANE", "GARDENS", "PLACE", "CRESENT", "CLOSE", "SQUARE", "HILL", "CIRCUS", "MEWS", "VALE", "RISE", "ROW", "MEAD", "WHARF") roaddesciptor.ListIndex = 0 End Sub Private Sub txtaddoddfrom_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case Else KeyAscii = 0 End Select End Sub Private Sub txtaddoddfrom_AfterUpdate() If txtaddoddfrom.Value < txtaddoddto.Value Or txtaddoddto = "" And txtaddoddfrom.Value Mod 2 = 1 Then Exit Sub If txtaddoddfrom.Value Mod 2 <> 1 Or txtaddoddfrom.Value > txtaddoddto.Value Then txtaddoddfrom = "" 'Else: txtaddoddfrom = "" End Sub Private Sub txtaddoddto_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case Else KeyAscii = 0 End Select End Sub Private Sub txtaddoddto_AfterUpdate() If txtaddoddto.Value Mod 2 = 1 And txtaddoddto.Value >= txtaddoddfrom.Value Then Exit Sub If txtaddoddto.Value Mod 2 <> 1 Or txtaddoddto.Value < txtaddoddfrom.Value Then txtaddoddto = "" End Sub Private Sub txtaddevenfrom_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case Else KeyAscii = 0 End Select End Sub Private Sub txtaddevenfrom_AfterUpdate() If txtaddevenfrom.Value < txtaddevento.Value Or txtaddevento = 0 And txtaddevenfrom.Value Mod 2 <> 1 Then Exit Sub If txtaddevenfrom.Value Mod 2 = 1 Or txtaddevenfrom.Value > txtaddevento.Value Then txtaddevenfrom = "" End Sub Private Sub txtaddevento_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case Else KeyAscii = 0 End Select End Sub Private Sub txtaddevento_AfterUpdate() If txtaddevento.Value Mod 2 <> 1 And txtaddevento.Value >= txtaddevenfrom.Value Then Exit Sub If txtaddevento.Value Mod 2 = 1 Or txtaddevento.Value < txtaddevenfrom.Value Then txtaddevento = "" End Sub 

为了说明问题,您需要将代码添加到“发件人”框的“更新后”事件中,如果新的“发件人”框号码比“收件人”框号码大,将删除“收件人”框。

如果您将下面的代码行添加到您的“发件人”框AfterUpdate事件,它应该做你想要的。 除了要清除“发件人”框而不是“收件人”框之外,它与您已有的一样。

 txtaddoddfrom.Value > txtaddoddto.Value Then txtaddoddto = "" 

这里有三个问题要处理。

首先,你不能在string上使用数字运算符,这是一个空白字段。 这是许多不同的方式来允许这一点。 一种方法是(0 & "") 。 另一个是明确检查他们。 我在调整你的代码时使用了两者。

其次,尝试更改您即将要选中的字段的值失败。 你必须包装Application.EnableEvents语句,试图成功。

最后,您在“from”处理程序中切换“from”字段而不是“to”字段。

这里有一对你的处理程序修复:

 Private Sub txtaddoddfrom_AfterUpdate() If (0 & txtaddoddfrom) Mod 2 <> 1 Then txtaddoddfrom = "" ' If even (or ""), zap it If txtaddoddfrom = "" Or txtaddoddto = "" Then Exit Sub 'If was even or blank, done -> exit Application.EnableEvents = False If txtaddoddto < txtaddoddfrom Then txtaddoddto.Value = "" ' Otherwise compare and zap txtaddoddto if smaller Application.EnableEvents = True End Sub Private Sub txtaddoddto_AfterUpdate() If (0 & txtaddoddto) Mod 2 <> 1 Then txtaddoddto = "" ' If even (or ""), zap it If txtaddoddto = "" Or txtaddoddfrom = "" Then Exit Sub 'If was even or blank, done -> exit Application.EnableEvents = False If txtaddoddfrom > txtaddoddto Then txtaddoddfrom = "" ' Otherwise compare and zap txtaddoddfrom if greater Application.EnableEvents = True End Sub 

注意:字段值可以通过明确地使用.Value来访问,或者隐式地没有它。 坚持使用一种forms或其他forms是一个好主意。