如何处理Excel VBA输入变量中的破折号?

时间:2013-09-20 20:55:16

标签: string excel variables excel-vba vba

我在使用Excel VBA宏时遇到了一些问题,并希望您能就如何修复它给我一些建议。在下面的代码中,当用户单击命令按钮时,弹出一个InputBox,用户输入XXX-XXXXXX形式的数字(例如111-222222)。然后,宏从与按钮相邻的列中获取值,并使用输入变量替换相邻列的值的某个部分。但是,当我尝试运行宏并输入一个数字,如123-456789时,没有任何反应。我认为它与用户输入的破折号有关,但我不确定如何解决它。请帮忙!

Sub CommandButtonTitleXXXdashXXXXXX_Click()
    Application.ScreenUpdating = False
    On Error Resume Next
    Dim n As Integer
    n = Worksheets("REVISIONS").Range("D3:D17").Cells.SpecialCells(xlCellTypeConstants).Count
    If n = 15 Then
        If MsgBox("Title revision box full. Add manually.", vbOKOnly, "Error") = vbOK Then
            Exit Sub
        End If
    End If
    Dim rs As Integer
    rs = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
    Dim amount As String
    Application.ScreenUpdating = True
    amount = Application.InputBox("Enter case number:", "")
    Application.ScreenUpdating = False
    If amount = False Then
        Exit Sub
    Else
        Dim newCell As String
        newCell = Replace(Worksheets("TITLE").Range("A" & rs).Value, "XXX-XXXXXX", amount)
        Worksheets("REVISIONS").Range("D17").End(xlUp).Offset(1, 0) = newCell
    End If
End Sub

2 个答案:

答案 0 :(得分:2)

我会把你的代码带到一个额外的步骤。

无需将amount声明为String。您可以将其保留为Variant。也像我在上面的评论中提到的那样

  

您的案例编号可以像@ D1-1%#456吗?如果没有,那么你还有一个问题需要处理;)

请参阅此示例。我已对代码进行了评论,以便您在理解代码时不会遇到任何问题。仍然如果你知道lemme :)另一种方法是使用REGEX来验证你的案例ID。如果您也想要这个例子,请告诉我。

<强>代码

Sub Sample()
    Dim amount As Variant

    '    123-$456789 <~~ Invalid
    '    123-4567890 <~~ Valid
    '    ABC-&456789 <~~ Invalid
    '    456-3456789 <~~ Valid

    amount = Application.InputBox("Enter case number:", "")

    '~~> Check if user pressed cancel
    If amount = False Then Exit Sub

    '~~> Check if then Case ID is valid
    If IsValidCaseNo(amount) Then
        MsgBox amount
    Else
        MsgBox "Invalid case ID"
    End If
End Sub

Function IsValidCaseNo(sAmount) As Boolean
    Dim s As String
    Dim i As Long, j As Long

    s = sAmount

    '
    '~~> Initial basic checks
    '
    '~~> Check if the length is 11 characters
    If Len(Trim(s)) <> 11 Then GoTo Whoa
    '~~> Check if the string contains "-"
    If InStr(1, s, "-") = 0 Then GoTo Whoa
    '~~> Check if the 4th character is a "-"
    If Mid(s, 4, 1) <> "-" Then GoTo Whoa

    '~~> Loop through 1st 3 characters and check
    '~~> If they are numbers
    For i = 1 To 3
        Select Case Asc(Mid(s, i, 1))
        Case 48 To 57
        Case Else: GoTo Whoa
        End Select
    Next

    '~~> Loop through last 6 characters and check
    '~~> If they are numbers
    For i = 5 To 11
        Select Case Asc(Mid(s, i, 1))
        Case 48 To 57
        Case Else: GoTo Whoa
        End Select
        IsValidCaseNo = True
    Next
Whoa:
End Function

答案 1 :(得分:0)

如果Dim amount为String,则可以将其作为字符串进行测试:

Sub GetDash()
    Dim amount As String
    amount = Application.InputBox(Prompt:="Enter case number", Type:=2)
    If amount = "False" Then
        MsgBox "You cancelled"
    End If
End Sub