2017-09-03 141 views
1

我正在創建一個用戶表單來輸入地址數據。我有一個地址名稱的文本框,用於選擇道路,街道等的組合框,以及用於奇數的4個數字框以及來自和來自的evens。使用If語句清除單元格

我得到的問題是讓VBA清除「to」框的內容,如果數字已經輸入到它們中,但用戶將它們從「框」更改爲「to」框之後的更多值。

這裏是我目前擁有的代碼:

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 
+0

您可以使用'If Not IsNumeric(Chr(KeyAscii))'然後KeyAscii = 0'來檢查數字輸入,從而縮短代碼。 .....也可以使用這種類型的語句來使代碼更清晰:Case Asc(「a」)To Asc(「z」)'......'case 127'行似乎被誤包含 – jsotola

回答

0

要澄清一下,您要添加代碼的「從」框中的更新後事件,如果新的,將清除「收件人」框中「發件人」箱號比「收件人」箱號大。

如果您將以下代碼行添加到您的「From」框AfterUpdate事件中,它應該執行您想要的操作。除了您要清除「發件人」框而不是「收件人」框外,它與您已有的功能相同。

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

這裏有三個問題需要處理。

首先,你不能在字符串上使用數字運算符,這是一個空白字段。這是許多不同的方式來允許這一點。一種方法是(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明確地進行訪問,或含蓄離不開它。堅持使用一種形式或其他形式是一個好主意。