1

我在使用 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
4

2 回答 2

2

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

无需声明amountString. 您可以将其保留为Variant. 也像我在上面的评论中提到的

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

请参阅此示例。我已经对代码进行了注释,以便您理解它不会有问题。不过,如果您确实知道 :) 另一种方法是使用 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
于 2013-09-21T04:53:07.117 回答
0

如果您将金额设置为字符串,则可以将其作为字符串进行测试:

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
于 2013-09-20T21:26:30.327 回答