VBA:将多个值传递给 Instr

问题描述 投票:0回答:4

现在我有一长串用户通过表单提交的“行业”值。我编写了一个宏,它将搜索这些值中的特定术语,并粘贴符合我的“可接受”行业值的小得多的列表的值。重点是将用户提交的所有当前行业值重新分类到我现有的分类法中。这是我的 If-Then 语句现在的样子:

If InStr(1, Cells(i, "A").Value, "Energy") > 0 Or InStr(1, Cells(i, "A").Value, "Electricity") > 0 Or InStr(1, Cells(i, "A").Value, "Gas") > 0 Or InStr(1, Cells(i, "A").Value, "Utilit") > 0 Then
Cells(i, "B").Value = "Energy & Utilities"
End If

实在是太丑了。工作得很好,但读起来很费劲。我的宏中充斥着这些难以理解的 If-Then 语句,很难通读全部内容。有没有办法将多个值传递给

Instr
的“String2”参数?

vba excel excel-2013
4个回答
10
投票

[编辑时:我修改了该函数,以便如果最后一个参数是整数,则它充当

compareMode
中的
Instr
参数的角色(0 表示区分大小写搜索,这是默认值,1 表示区分大小写的搜索)不区分大小写)。作为最后的调整,您还可以为可选的最终参数传递布尔值而不是整数,其中
True
对应于不区分大小写,
False
对应于默认的区分大小写]

如果你经常做这种事情,那么编写一个类似于

inStr
但可以处理多种模式的函数是有意义的。
ParamArray
是一个自然使用的工具:

Function Contains(str As String, ParamArray args()) As Boolean
    Dim i As Long, n As Long, mode As Integer

    n = UBound(args)
    If TypeName(args(n)) <> "String" Then
        mode = args(n)
        mode = Abs(mode) 'So True => -1 => 1 for case-insensitive search
        n = n - 1
    End If

    For i = 0 To n
        If InStr(1, str, args(i), mode) > 0 Then
            Contains = True
            Exit Function
        End If
    Next i
    Contains = False
End Function

测试如下:

Sub Test()
    Debug.Print Contains("General Electric", "Gas", "Electric", "Oil")
    Debug.Print Contains("General electric", "Gas", "Electric", "Oil")
    Debug.Print Contains("General electric", "Gas", "Electric", "Oil", False)
    Debug.Print Contains("General electric", "Gas", "Electric", "Oil", True)
    Debug.Print Contains("General electric", "Gas", "Electric", "Oil", 1)
    Debug.Print Contains("General Motors", "Gas", "Electric", "Oil")
End Sub

输出:

True
False
False
True
True
False

1
投票

无法将多个参数传递给 InStr,但您可以创建自己的子函数来处理它。我将创建一个子程序,它接受要查找的字符串和要搜索的字符串数组。然后它可以循环数组并为每个字符串调用 InStr。让它返回是否找到所有这些的最终结果,然后用对子程序的一次调用替换所有丑陋的条件语句。


0
投票

您可以尝试使用 Do While Loop 来循环遍历多个值(值列表),并在 B 列中获取注释代码,如下所示:

子练习01()

将单元格调暗为范围

r = 5 执行 While Cells(r, 7) <> ""

For Each Cell In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
  If InStr(1, Cell.Value, Cells(r, 7), vbTextCompare) > 0 Then
  Cell.Offset(0, 2).Value = Cells(r, 8).Value 'Put find value at column B
  End If
Next Cell
r = r + 1

循环 结束子


-1
投票
If Instr(1, Cells(i, "A").Value, "EnergyElectricityGasUtilit") > 0 Then
    Cells(i, "B").Value = "Energy & Utilities"
© www.soinside.com 2019 - 2024. All rights reserved.