Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
String 如何处理Excel VBA输入变量中的破折号?_String_Variables_Excel_Vba - Fatal编程技术网

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

String 如何处理Excel VBA输入变量中的破折号?,string,variables,excel,vba,String,Variables,Excel,Vba,我在使用Excel VBA宏时遇到一些问题,希望您能给我一些关于如何修复它的建议。在下面的代码中,当用户单击命令按钮时,会弹出一个输入框,用户以XXX-XXXXXX的形式输入一个数字(例如111-22222)。然后,宏从按钮旁边的列中获取值,并使用输入变量替换相邻列值的某一部分。但是,当我试图运行宏并输入123-456789这样的数字时,什么也没有发生。我相信这与用户输入的破折号有关,但我不确定如何修复它。请帮忙 Sub CommandButtonTitleXXXdashXXXXXX_Click

我在使用Excel VBA宏时遇到一些问题,希望您能给我一些关于如何修复它的建议。在下面的代码中,当用户单击命令按钮时,会弹出一个输入框,用户以XXX-XXXXXX的形式输入一个数字(例如111-22222)。然后,宏从按钮旁边的列中获取值,并使用输入变量替换相邻列值的某一部分。但是,当我试图运行宏并输入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

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

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

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

无需将
金额
声明为
字符串
。您可以将其保留为
变体
。也像我在上面的评论中提到的

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

看看这个例子。我已经对代码进行了注释,这样您在理解代码时就不会有问题。但是如果你不知道:)另一种方法是使用正则表达式来验证你的案例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
子样本()
变暗量
'123-$456789检查字符串是否包含“-”
如果InStr(1,s,“-”)=0,则转到Whoa
“~~>检查第四个字符是否为“-”
如果中间(s,4,1)“-”则转到哇
“~~>循环前3个字符并检查
“~~>如果它们是数字
对于i=1到3
选择案例Asc(Mid(s、i、1))
案件48至57
案例:GoTo哇
结束选择
下一个
“~~>循环最后6个字符并检查
“~~>如果它们是数字
对于i=5到11
选择案例Asc(Mid(s、i、1))
案件48至57
案例:GoTo哇
结束选择
IsValidCaseNo=True
下一个
哇
端函数

下一步尝试删除错误恢复,看看是否有错误,到目前为止,您可能在代码中遇到错误,但永远不会知道,因为该行忽略了错误。另外,将行
newCell=Replace(工作表(“标题”).Range(“A”和rs).值,“XXX-XXXXXX”,amount)
更改为
工作表(“标题”).Range(“A”和rs).替换内容:=“XXX-XXXXXX”,替换:=amount,SearchOrder:=xlByColumns,MatchCase:=True
或添加
工作表函数。
应用程序。
在替换之前,VBA替换函数和Excel替换函数是不同的调用!很明显,它在“如果金额=False Then”上出现了中断。我想知道破折号是否会让输入框认为它是空的?破折号不应该导致它是空的。您是否从输入框中取消了?这将返回False。如果amount=“”,请尝试
,然后改为
。您遇到的任何问题都不应该与任何破折号有关。
如果amount=”“,则
起作用,除非他们按“取消”,因为它返回“False”,并将其用作替换值。