【问题标题】:How to modify this script to account for different case?如何修改此脚本以适应不同的情况?
【发布时间】:2015-02-03 15:31:15
【问题描述】:

我编写了一个 VBA 脚本,它在一个列中搜索字符串并在另一列中返回匹配项。重点是按 SKU 将商品编号与其产品图片相匹配。问题是,如果项目编号和图像的大小写不同,则会失败。脚本如下:

Sub Test()
    Dim NA As Long, NC As Long, v As String, I As Long, J As Long
    Dim v2 As String
    NA = Cells(Rows.Count, "A").End(xlUp).Row
    NC = Cells(Rows.Count, "C").End(xlUp).Row
    For I = 2 To NA
        v = Cells(I, "A").Value
        v2 = ""
        For J = 2 To NC
            If InStr(Cells(J, "C").Value, v) > 0 Then
                v2 = v2 & ";" & Cells(J, "C").Value
            End If
        Next J
        Cells(I, "A").Offset(0, 1).Value = Mid(v2,2)
    Next I
End Sub

我如何解释不同的情况?有这个方法吗?

【问题讨论】:

    标签: vba excel string-comparison


    【解决方案1】:

    很简单,只需将其转换为小写即可:

    Sub Test()
        Dim NA As Long, NC As Long, v As String, I As Long, J As Long
        Dim v2 As String
        NA = Cells(Rows.Count, "A").End(xlUp).Row
        NC = Cells(Rows.Count, "C").End(xlUp).Row
        For I = 2 To NA
            v = LCase(Cells(I, "A").Value)
            v2 = ""
            For J = 2 To NC
                If InStr(LCase(Cells(J, "C").Value), v) > 0 Then
                    v2 = v2 & ";" & Cells(J, "C").Value
                End If
            Next J
            Cells(I, "A").Offset(0, 1).Value = Mid(v2,2)
        Next I
    End Sub
    

    我刚刚获取了您的代码示例,并将 vCells(J, "C").Value 的强制转换为小写。

    我没有对此进行测试,所以我不能保证完美的功能。


    你也可以改变你的模块(在顶部)

    Option Compare Text

    这将完全关闭区分大小写(因此您不需要LCase(..)

    【讨论】:

    • 我在答案末尾添加了另一种可能性
    • 使用Option Compare Text有点危险和混乱,因为它会影响整个模块。这可能是不可取的。不过,您的两种解决方案都应该有效。 +1
    • @RubberDuck 正确。我假设该模块中没有其他 Subs 或 Functions。不过,突出显示它的好点。
    • 我还建议尽可能使用 $ 版本的函数。它们的运行速度比相同功能的非 $ 版本快一点。例如If InStr(LCase$(Cells(J, "C").value, v) > 0 那么
    • 我不得不接受这个答案,因为它是第一位的,对不起@RubberDuck!
    【解决方案2】:

    只需使用Instr functionvbTextCompare 选项即可。

    If InStr(1, Cells(J, "C").Value, v, vbTextCompare) > 0 Then
        v2 = v2 & ";" & Cells(J, "C").Value
    End If
    

    [vbTextCompare] 根据应用程序当前文化信息确定的不区分大小写的文本排序顺序执行文本比较。

    【讨论】:

    • 不客气!我知道您还没有代表投票,但请务必投票有用的答案。这就是我们在这里表达感激之情的方式。
    • 我忘记了 InStr 中的可选参数,所以这应该是可能的解决方案列表的总结:)
    • @RubberDuck: 嗯..我在 if 条件下遇到类型不匹配错误。有什么想法吗?
    猜你喜欢
    • 2021-08-15
    • 2012-09-25
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多