Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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/5/excel/28.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
Vba 我怎样才能找到准确的Instr值_Vba_Excel - Fatal编程技术网

Vba 我怎样才能找到准确的Instr值

Vba 我怎样才能找到准确的Instr值,vba,excel,Vba,Excel,我试图找到精确的数字,而不是找到整数。类似这样的456或678。每次运行代码时,我都会找到整数(4567777),而不仅仅是456。为了说明这一点,我在同一行中几乎没有类似的数字(45645677777767745656666等等)。我试图使我的指令避免使用456777的数字 代码: dim b as string b = "-456-" for i = 1 to lastrow if instr( 1, worksheets("sheet1").range("A"

我试图找到精确的数字,而不是找到整数。类似这样的456678。每次运行代码时,我都会找到整数(4567777),而不仅仅是456。为了说明这一点,我在同一行中几乎没有类似的数字(45645677777767745656666等等)。我试图使我的
指令
避免使用456777的数字

代码

 dim b as string 
   b = "-456-"
    for i = 1 to lastrow
     if instr( 1, worksheets("sheet1").range("A" & i), b > 0 then
      msgbox yes
     end if 
  next i

如果需要精确匹配而不是InStr,则应使用=运算符进行比较

  b = "456"
    For i = 1 To 7
     If (b = Cells(1, i).Value) Then
      Debug.Print ("Yes")
     Else
      Debug.Print ("No")
     End If
  Next i
如果您试图测试的值包含这些连字符,那么在进行任何比较之前,您必须先解析它们

另外,如果您使用范围,我发现将范围导入数组并使用数组而不是实际的单元格及其值更容易、也更快。编辑:要使其更具动态性,这样您就不必硬编码要查找的范围,并且您希望sub执行此操作,直到列中不再有可查看的值为止,您可以使用Find方法

这将适用于您的示例,因此:

Dim arrVals()
lastrow = Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row
strRangeToCapture = "A1:A" & CStr(lastrow)
arrVals = Range(strRangeToCapture)

Dim b As String
b = "456"

For i = 1 To lastrow
    If (b = arrVals(i, 1)) Then
        Debug.Print ("Yes")
    Else
        Debug.Print ("No")
    End If
Next

希望这有帮助!:)

如果希望精确匹配而不是InStr,则应使用=运算符进行比较

  b = "456"
    For i = 1 To 7
     If (b = Cells(1, i).Value) Then
      Debug.Print ("Yes")
     Else
      Debug.Print ("No")
     End If
  Next i
如果您试图测试的值包含这些连字符,那么在进行任何比较之前,您必须先解析它们

另外,如果您使用范围,我发现将范围导入数组并使用数组而不是实际的单元格及其值更容易、也更快。编辑:要使其更具动态性,这样您就不必硬编码要查找的范围,并且您希望sub执行此操作,直到列中不再有可查看的值为止,您可以使用Find方法

这将适用于您的示例,因此:

Dim arrVals()
lastrow = Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row
strRangeToCapture = "A1:A" & CStr(lastrow)
arrVals = Range(strRangeToCapture)

Dim b As String
b = "456"

For i = 1 To lastrow
    If (b = arrVals(i, 1)) Then
        Debug.Print ("Yes")
    Else
        Debug.Print ("No")
    End If
Next

希望这有帮助!:)

您的示例数据没有显示它,但从您的描述来看,您的单元格中似乎有逗号分隔的值

拆分单元格中的值,然后查看每个值是否完全匹配

ColumnA
---------------------
444, 456777, 456, 888
777
444, 456777, 444, 888
456   
这将仅查找第1行和第4行

Private Sub CommandButton5_Click()
    Dim lRow As Long
    Dim ws As Excel.Worksheet
    Dim strValues() As String
    Dim i As Integer
    Dim b As String

    b = "456"

    Set ws = Application.ActiveSheet

    'Loop through all the rows.
    lRow = 1
    Do While lRow <= ws.UsedRange.Rows.Count

        'Get the values
        strValues = Split(ws.Range("A" & lRow).Value, ",")

        For i = 0 To UBound(strValues)
            If strValues(i) = b Then
                MsgBox ("Row " & Str(lRow) & " has a match.")
            End If
        Next i

        lRow = lRow + 1
    Loop
End Sub
Private子命令按钮5_单击()
暗淡的光线和长的一样
将ws设置为Excel.Worksheet
Dim strValues()作为字符串
作为整数的Dim i
将b变暗为字符串
b=“456”
设置ws=Application.ActiveSheet
'循环遍历所有行。
lRow=1

Do While lRow示例数据没有显示它,但从您的描述来看,您的单元格中似乎有逗号分隔的值

拆分单元格中的值,然后查看每个值是否完全匹配

ColumnA
---------------------
444, 456777, 456, 888
777
444, 456777, 444, 888
456   
这将仅查找第1行和第4行

Private Sub CommandButton5_Click()
    Dim lRow As Long
    Dim ws As Excel.Worksheet
    Dim strValues() As String
    Dim i As Integer
    Dim b As String

    b = "456"

    Set ws = Application.ActiveSheet

    'Loop through all the rows.
    lRow = 1
    Do While lRow <= ws.UsedRange.Rows.Count

        'Get the values
        strValues = Split(ws.Range("A" & lRow).Value, ",")

        For i = 0 To UBound(strValues)
            If strValues(i) = b Then
                MsgBox ("Row " & Str(lRow) & " has a match.")
            End If
        Next i

        lRow = lRow + 1
    Loop
End Sub
Private子命令按钮5_单击()
暗淡的光线和长的一样
将ws设置为Excel.Worksheet
Dim strValues()作为字符串
作为整数的Dim i
将b变暗为字符串
b=“456”
设置ws=Application.ActiveSheet
'循环遍历所有行。
lRow=1
在MSDN中的lRow时执行

返回一个整数,指定一个字符串在另一个字符串中第一次出现的起始位置

因此,您观察到的是上述函数的正确行为。
为了得到您想要的,您可以使用Richard发布的内容,或者因为您使用的是Excel,您可以尝试使用范围对象的
Find
方法,这在大数据集的速度方面有一些好处

比如:

Dim r As Range, found As Range
Dim b As String, FAdd As String
Dim lastrow As String

With Worksheets("Sheet1")
    lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    Set r = .Range("A1:A" & lastrow): b = "456"
    Set found = r.Find(b, .Range("A" & lastrow) , , xlWhole)
End With

If Not found Is Nothing Then FAdd = found.Address Else MsgBox "No match found.": Exit Sub

Do
    Debug.Print found.Address
    Set found = r.FindNext(After:=found)
Loop While FAdd <> found.Address
Dim r作为范围,作为范围找到
变暗b为字符串,变暗D为字符串
将最后一行变暗为字符串
带工作表(“表1”)
lastrow=.Range(“A”&.Rows.Count).End(xlUp).Row
设置r=.Range(“A1:A”和lastrow):b=“456”
Set found=r.Find(b、.Range(“A”)和lastrow)、xlother)
以
如果未找到则为Nothing,则FAdd=found.Address Else MsgBox“未找到匹配项”:退出Sub
做
调试。找到打印。地址
Set found=r.FindNext(之后:=found)
找到FAdd时循环。地址
来自MSDN

返回一个整数,指定一个字符串在另一个字符串中第一次出现的起始位置

因此,您观察到的是上述函数的正确行为。
为了得到您想要的,您可以使用Richard发布的内容,或者因为您使用的是Excel,您可以尝试使用范围对象的
Find
方法,这在大数据集的速度方面有一些好处

比如:

Dim r As Range, found As Range
Dim b As String, FAdd As String
Dim lastrow As String

With Worksheets("Sheet1")
    lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    Set r = .Range("A1:A" & lastrow): b = "456"
    Set found = r.Find(b, .Range("A" & lastrow) , , xlWhole)
End With

If Not found Is Nothing Then FAdd = found.Address Else MsgBox "No match found.": Exit Sub

Do
    Debug.Print found.Address
    Set found = r.FindNext(After:=found)
Loop While FAdd <> found.Address
Dim r作为范围,作为范围找到
变暗b为字符串,变暗D为字符串
将最后一行变暗为字符串
带工作表(“表1”)
lastrow=.Range(“A”&.Rows.Count).End(xlUp).Row
设置r=.Range(“A1:A”和lastrow):b=“456”
Set found=r.Find(b、.Range(“A”)和lastrow)、xlother)
以
如果未找到则为Nothing,则FAdd=found.Address Else MsgBox“未找到匹配项”:退出Sub
做
调试。找到打印。地址
Set found=r.FindNext(之后:=found)
找到FAdd时循环。地址
尝试以下方法:

数据样本:

守则:

尝试以下方法:

数据样本:

守则:


理查德就在下面。您希望拆分行中的值,然后在它们之间循环查找精确的字符串。Instr()不是你想要的。Richard就在下面。您希望拆分行中的值,然后在它们之间循环查找精确的字符串。Instr()不是您想要的。我使用的是lastrow,所以我认为range(A1:A6)不起作用,我可以将其更改为range(lastrow)并定义lastrow,而且我不能将b=arrvals放在456之间,因为我有一个介于8999-456-33333或9000-3333456777之间的dasher-0@user3713336如果是这样的话,在处理数据之前,您必须解析字符串并去掉不必要的字符。此外,如果您正在寻找一个更动态的解决方案,而不是像“A1:A6”这样的硬编码,那么您应该考虑使用Find方法来实现这一点。我已经更新了答案,包括我所说的。我就是我们