【问题标题】:Case in-sensitive dictionary不区分大小写的字典
【发布时间】:2018-12-30 20:51:10
【问题描述】:

我已将 Dictionary 设置为一个对象,并向该字典添加了几个项目,但它似乎区分大小写。无论如何我可以设置字典来识别不同的版本吗?

我的代码:

Sub Test()

Dim sheet1 As String
Dim Dict As Object
Dim c As Range

Sheet1= "TEST"
Set Dict = CreateObject("Scripting.Dictionary")

Dict.Add "MIKE", 0
Dict.Add "PHIL", 0
Dict.Add "Joe", 0

For Each c In ActiveWorkbook.Worksheets(Sheet1).UsedRange
If Dict.Exists(ActiveWorkbook.Worksheets(Sheet1).Cells(c.Row, c.Column).Value) Then
        Dict(ActiveWorkbook.Worksheets(Sheet1).Cells(c.Row, c.Column).Value) = Dict(ActiveWorkbook.Worksheets(Sheet1).Cells(c.Row, c.Column).Value) + 1
End If
Next

Sheet1.Cells(25, 3) = Dict("MIKE")
Sheet1.Cells(25, 3) = Dict("PHIL")
Sheet1.Cells(25, 3) = Dict("Joe")

Set Dict = Nothing

End Sub

所以我想识别 MIKE 的“mike”和 PHIL 的“Phil”等。

提前致谢!

【问题讨论】:

标签: vba excel dictionary


【解决方案1】:

我总是喜欢为我的所有编码设置正确的东西。因此,我的工作表或表单中的所有模块和代码都以以下三行开头,然后再编写任何其他代码。

Option Base 0
Option Explicit
Option Compare Text

如果出于某种原因我想在特定的Sub 中以不同的方式处理某些事情,那么我只在这个特定的sub 中这样做,并按照上面评论中的建议进行操作(示例):

dict.CompareMode = BinaryCompare 'if I need a case-sensitive compare in this sub

由于 VBE 知道 dict 是一个字典,它可以提供自动完成的命题。这只有在早期绑定中才有可能。后期绑定 VBE 将不提供任何自动完成命题。

【讨论】:

  • Option Compare TextDictionary 对象没有影响。默认情况下,它们将始终执行二进制/区分大小写的比较。
  • @Bond:我不知道。感谢分享。很高兴知道。
  • 非常有趣。当我使用正确的引用和早期绑定时,它只会接受TextCompare。如果我取消选中该引用并使用后期绑定,则只有 vbTextCompare 会更改 dict.CompareMode 的值
  • Eww 早期绑定...我总是建议不要在 VBA 中使用早期绑定...如果您不这样做,您的代码很可能是版本相关的,并在以后导致令人讨厌的问题行。
  • @Sancarn: stackoverflow.com/questions/49789611/… 所以,我只使用早期绑定,如果发布了新版本,那么现有的开发就会得到调整。这是迄今为止首选的方式和清洁。此外,新版本并不总是支持先前的功能等。因此,即使您使用后期绑定,也不一定是版本独立的。
【解决方案2】:

添加到@Ralph

dict.CompareMode = TextCompare

是我将文件更改为的内容。


关于 cmets 的一些说明:

TextCompare 仅适用于早期绑定,它是 Scripting 的成员。
vbTextCompare 在 VBA 中始终可用。
两者都是 = 1。

? Scripting.CompareMethod.TextCompare
 1 
? VBA.VbCompareMethod.vbTextCompare
 1 

注意:你只能设置dict.CompareMode如果dict为空,即你还没有添加任何成员。否则你会得到一个"Illegal procedure call" 错误。

【讨论】:

  • 我刚查了一下,没有vbTextCompare这样的东西。这是从哪里来的?应该是dict.CompareMode = TextCompare
  • 啊,我刚刚看到用户 @Marcucciboy2 用错误的代码更新了您的答案并将其还原。现在又正确了。
  • @Ralph vbTextCompare 是为此操作定义的常量。这可能是您使用的是哪个版本的 excel 的问题,但如果您不相信我,请自行查看 microsoft 文档msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
  • @Ralph 我的机器不会更新dict 的比较模式,直到我添加了vb 前缀
  • @Marcucciboy2 那是因为您正在使用延迟后期绑定并且没有正确地将 dim 变量作为字典而不是 Objects 然后(稍后在代码中)在您的代码中告诉 VBA(在运行时)这个Object 实际上是一个使用CreateObject("Scripting.Dictionary") 的字典。由于您的变量当时是Object,您只能使用vbTextCompare1(因为您的变量本质上是一个对象)。或者你甚至可以直接设置CompareMode = 1。但是,如果您使用早期绑定,那么 vbTextCompare 将被拒绝,只有 TextCompare 可以工作。
猜你喜欢
  • 2020-02-18
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2012-12-09
  • 2018-01-26
相关资源
最近更新 更多