【问题标题】:VBA Excel Instr() StrComp() not working properlyVBA Excel Instr() StrComp() 无法正常工作
【发布时间】:2017-07-22 08:16:51
【问题描述】:

我正在尝试比较两个字符串,但是,函数返回错误的匹配项。我厌倦了使用三种不同的方法并将每种方法的结果发布在不同的列中进行测试。我厌倦了使用“string1”=“string2”、instr() 和 strcomp() 进行比较。

当使用相同的两个字符串时,它们甚至不会为每个方法返回相同的结果;有时一种类型的比较是正确的,而另一些则可能不是。

对于误报,Instr() 返回一个位置,但子字符串不在目标字符串中,Strcomp() 返回 0 但单词不一样,"string1" = string2" 为真但字符串不同。

Worksheets("hemo").Cells(f, 1) = Trim(Worksheets(Stabv).Cells(Count, 1))
Worksheets("hemo").Cells(f, 2) = Len(Trim(Worksheets(Stabv).Cells(Count, 1)))
Worksheets("hemo").Cells(f, 3) = Trim(LitBaseArray(y))
Worksheets("hemo").Cells(f, 4) = Len(Trim(LitBaseArray(y)))

scrapeString1 = Trim(Worksheets(Stabv).Cells(Count, 1))
scrapeString2 = Trim(LitBaseArray(y))

If scrapeString1 = scrapeString2 Then
Worksheets("hemo").Cells(f, 5) = "true"
End If

If StrComp(Trim(scrapeString1), Trim(scrapeString2), vbTextCompare) = 0 Then
Worksheets("hemo").Cells(f, 6) = "true    " & StrComp(Trim(scrapeString1), Trim(scrapeString2), vbTextCompare)
End If

If InStr(1, Trim(scrapeString1), Trim(scrapeString2), vbTextCompare) > 0 Then
Worksheets("hemo").Cells(f, 7) = "true    " & InStr(1, Trim(scrapeString1), Trim(scrapeString2), vbTextCompare)
End If

f = f + 1

【问题讨论】:

  • 你试过调试你的代码吗?调试时检查scrapeString1 和scrapeString2 的值。
  • 不是答案,但您不必在StrComp 和InStr 中再次使用TRIM,因为您已经使用Trim 将值分配给scrapeString1 和scrapeString1。
  • 是的,我只是在尝试不同的东西。我什至厌倦了将单元格的内容放在一个字符串中。
  • 您是否调试并检查过scrapeString1 和scrapeString2 的值?
  • 我做到了。我需要整理一下价值观。有超过 10k 的字符串比较。这就是我使用 Excel 工作表而不是调试窗口的原因。排序更容易。

标签: excel vba string-comparison


【解决方案1】:

1.

If str1 = str2 Then
    'str1 is exactly similar with str2
    '"ABC" = "ABC", but "ABC" <> "Abc"
End If

2.

If StrComp(str1, str2, vbTextCompare) = 0 Then
    'str1 is similar with str2, but in case insensitive manner
    'StrComp("ABC", "ABC", vbTextCompare) = 0 and
    'StrComp("ABC", "Abc", vbTextCompare) = 0 as well
    'Use binary comparison if you want similar behavior as for the = operator
End If

Docs.

3.

If InStr(1, str1, str2, vbTextCompare) > 0 Then
    'Will be true if str1 contains str2 in a case insensitive manner
    'To make it case-sensitive, use binary comparison instead of vbTextCompare
    'InStr(1, Nothing, "A", vbTextCompare) will be 0
    'InStr(1, "A", Nothing, vbTextCompare) will be 1 !
    'InStr(1, "", "A", vbTextCompare) will be 1 !
    'InStr(1, "ABC", "CD", vbTextCompare) will be 0
    'InStr(1, "ABC", "BC", vbTextCompare) > 0
    'InStr(1, "ABC", "AB", vbTextCompare) > 0
    'InStr(1, "ABC", "abc", vbTextCompare) > 0
    'InStr(1, "ABC", "c", vbTextCompare) > 0
End If

Docs.

如您所见,在不同的情况下可能会出现不同的行为,尤其是因为您在某些情况下Trim 他们而不是在其他情况下Trim 他们。

【讨论】:

  • 我很欣赏你在这个答案中所做的工作,但我的答案不是问题。我收到误报的字符串,它们没有相同的字符
  • @Padawan 我认为我的回答解决了您在问题和评论中描述的问题。如果您认为我误解了您,那么您可以通过给出一个确切的输入示例、正在执行的确切代码、确切的输出以及为什么该输出不符合您的期望的确切解释来帮助我。如果您这样做,那么我相信我将获得有关您的问题的足够信息来帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2013-08-09
  • 2015-06-28
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多