读取选择案例时出错-excel vba

读取选择案例时出错-excel vba,excel,vba,Excel,Vba,我正在使用以下代码,无法使以下语句正常工作: If UCase(Left(Dn, 2)) = "LM" Then Dn.Offset(, 1) = Val(Mid(Dn, 2, 3)) + 3.5 代码不会执行上述语句中的任何内容 Case "L" **If UCase(Left(Dn, 2)) = "LM" Then If IsNumeric(Mid(Dn, 2, 1)) And IsNumeric(Mid(Dn, 3, 1)) Then If Mid

我正在使用以下代码,无法使以下语句正常工作:

If UCase(Left(Dn, 2)) = "LM" Then
    Dn.Offset(, 1) = Val(Mid(Dn, 2, 3)) + 3.5
代码不会执行上述语句中的任何内容

Case "L"


 **If UCase(Left(Dn, 2)) = "LM" Then
 If IsNumeric(Mid(Dn, 2, 1)) And IsNumeric(Mid(Dn, 3, 1)) Then
            If Mid(Dn, 3, 1) = "0" Then
            Dn.Offset(, 1) = Mid(Dn, 3, 3) + 3.5
           Else
            Dn.Offset(, 1) = Mid(Dn, 3, 3) + 0.35
           End If
            End If

    ElseIf IsNumeric(Mid(Dn, 4, 1)) And IsNumeric(Mid(Dn, 5, 1)) Then
        If Mid(Dn, 5, 1) = "0" And Mid(Dn, 4, 1) = "0" Then
        If Dn.Offset(, 3) = "CMBS" Then
             Dn.Offset(, 1) = Mid(Dn, 3, 3) + 20
        Else
        Dn.Offset(, 1) = Mid(Dn, 3, 3) + 2
        End If

        ElseIf UCase(Left(Dn, 6)) Like "LM###S" Then

        Dn.Offset(, 1) = Mid(Dn, 3, 3) + 2
        Else
        Dn.Offset(, 1) = Mid(Dn, 3, 3) + 0.2
        End If**



    ElseIf UCase(Left(Dn, 3)) = "L/M" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 4, 2)) + 3.5
    ElseIf UCase(Left(Dn, 3)) = "LM$" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 4, 2)) + 3.5
    ElseIf UCase(Left(Dn, 2)) = "L$" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 3, 2)) + 2
    ElseIf UCase(Left(Dn, 3)) = "LO-" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 4, 2)) + 2
    ElseIf UCase(Left(Dn, 6)) = "LO MID" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 7, 3)) + 3.5
    ElseIf UCase(Left(Dn, 3)) = "LO " Then
        Dn.Offset(, 1) = Val(Mid(Dn, 4, 2)) + 2
    ElseIf UCase(Left(Dn, 5)) Like "L###H" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 2, 3)) + 0.2
    ElseIf UCase(Left(Dn, 4)) Like "L##H" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 2, 2)) + 0.2
    ElseIf UCase(Left(Dn, 4)) Like "L#" Then
        Dn.Offset(, 1) = Val(Mid(Dn, 2, 2)) + 0.2
    ElseIf IsNumeric(Mid(Dn, 3, 1)) And IsNumeric(Mid(Dn, 4, 1)) Then
        If Mid(Dn, 4, 1) = "0" And Mid(Dn, 3, 1) = "0" Then
            If Dn.Offset(, 3) = "CMBS" Then
                Dn.Offset(, 1) = Mid(Dn, 2, 3) + 20
            Else
                Dn.Offset(, 1) = Mid(Dn, 2, 3) + 2
            End If
        ElseIf UCase(Left(Dn, 5)) Like "L###S" Then
            Dn.Offset(, 1) = Mid(Dn, 2, 3) + 2
        Else
            Dn.Offset(, 1) = Mid(Dn, 2, 3) + 0.2
        End If
    ElseIf IsNumeric(Mid(Dn, 3, 1)) And IsNumeric(Mid(Dn, 4, 1)) Then
        If Mid(Dn, 4, 1) = "0" And Mid(Dn, 3, 1) <> "0" Then
            Dn.Offset(, 1) = Mid(Dn, 2, 3) + 0.2
        End If
    ElseIf UCase(Left(Dn, 3)) Like "L##" Then
        If IsNumeric(Mid(Dn, 2, 1)) Then
            If Mid(Dn, 3, 1) = "0" Then
                Dn.Offset(, 1) = Mid(Dn, 2, 2) + 2
            Else
                Dn.Offset(, 1) = Mid(Dn, 2, 2) + 0.2
            End If
        End If
    End If
输入值-> lm10,LM120S, LM120 所需输出-> 13.5 123.5 120.35


在此问题上的任何帮助都将不胜感激

在IF行周围打印一些调试语句,看看发生了什么,如下所示:

Debug,Print Dn
If UCase(Left(Dn, 2)) = "LM" Then
    Debug,Print "hi"
    Dn.Offset(, 1) = Val(Mid(Dn, 2, 3)) + 3.5
第一行的案例是什么?代码是否被阻止到达IF语句?

ValMidDn,2,3的计算结果为零:M10以字母开头,因此结束val过程。那应该是ValMidDn,3,2


我假设您的select语句是select Case UCaseLeftdn,1。如果您没有搜索文本,则不会执行case语句中的任何代码

将此代码粘贴到模块中

Public Function GetNumb(strString As String) As Double
    Dim strLen As Long, i As Long
    Dim Temp As String

    strLen = Len(strString): Temp = ""

    For i = 1 To strLen
        If (Mid(strString, i, 1) = "-") Then
            Temp = Temp & Mid(strString, i, 1)
        End If
        If (Mid(strString, i, 1) = ".") Then
            Temp = Temp & Mid(strString, i, 1)
        End If
        If (IsNumeric(Mid(strString, i, 1))) = True Then
            Temp = Temp & Mid(strString, i, 1)
        End If
    Next i

    If Len(Temp) = 0 Then
        GetNumb = 0
    Else
        GetNumb = CDbl(Trim(Temp))
    End If
End Function
然后更改代码

Dn.Offset(, 1) = Val(Mid(Dn, 2, 3)) + 3.5

说明:函数GetNumb从字符串中提取数字

lm10~~~>10 LM120S~~~>120 LM120~~~>120
将ValMidDn,2,3更改为ValMidDn,3,2,然后重试编辑:解释:您想选择第3位的10,它有2个字符感谢您的回复和帮助。我编辑代码并向LM select案例中添加新的if语句,它不显示任何输出。我不明白它为什么这样做。谢谢你的帮助和时间。在完成编辑后发布了答案。谢谢@Sean的帮助和建议。我正在努力让selectcaselm正常工作,如果您能为我如何执行这段代码提供帮助,我将非常感谢您的帮助。谢谢。删除Select Case:由于if/then/elseif语句太多,Select Case变得多余。为了更具可读性,我还建议将UCaseDn放入另一个变量中,这会删除很多UCaseLeft…,并使用类似if MyValue(如LM*的内容),然后我非常感谢您的帮助和时间,您的代码工作得非常好,但是如果我在问题描述中没有明确说明这一点,我非常抱歉,我需要能够更改不同lm值的代码,例如lm100=100.35,而lm100s=103.5。我将在模块中更改您的代码。非常感谢您的帮助和时间。亲爱的@Siddharth Rout,我成功地实现了select case L,您可以在上面的代码中进一步看到,我正在尝试为LM select case实现相同的逻辑,但我遇到的唯一问题是,没有为LM select case执行任何操作。我希望这能澄清问题。我仍然在摆弄你的代码,使它符合我的要求。感谢您的时间和帮助。首先,有两件事需要更改:如果UCaseLeftDn,2=LM,则更改为如果UCaseLeftTrimDn.Value,则更改为2=LM;其次,您不需要在任何地方使用MID语句来提取数字。使用我给出的函数。。。
Dn.Offset(, 1) = GetNumb(Dn.Value) + 3.5