主题:【求助】有access的高手帮忙看看。 -- flycloud
我有一个表的字段是文本类型,数据是固定位数13位的格式,我现在想通过输入一个数据查找出和其包含内容最少有10位相同的记录,应该如何查询呢?
比如0123456789abc对123456789cdef是否满足?
比如0123456789abc对a038569d6e721
建立一个字符串比较函数,其中用到字典对象,就容易比较出两个字符串有多少个相同的字符了。
例如,你可以定义一个字符串数组dim mystr(5) as string就会得到下标从0到5的字符串数组:mystr(0)、mystr(1)、mystr(2)、mystr(3)、mystr(4)和mystr(5)。下标只能是数字的。
而使用字典,你可以把下标变成字符的,例如mystr("a")、mystr("x")、mystr("3")......
不过,对于你的问题,我想还要问一下,是否在你的字符串中有重复的字符?如果有的话,两个字符串比较的时候,重复的字符如何对待?
如果没有重复字符,问题就会简单很多,只要看两边的字典中,有几个相同的字符,用字功能典就很容易了,比字符下标要方便容易很多。
我问题简单化了一点,重复的字符也算在内。
首先要让你的VBA具有字典功能,要在VBA中的菜单工具-引用中选择Microsoft scrpting runtime:
然后写一个小函数,分别为两个字符串建立字典,最后比较两个字典中有几个相同的字符,在下面那个立即窗口中可以测试结果:
当测试完成之后,可以把函数中的最后一句debug.print compString注释掉,然后就可以到你的access中调用这个函数来比较字符串了。
看您下面的例子,您说的这个似乎是"Pattern Matching",且让我复述一下,看看有没有误解:
输入一个字符串,含若干(>10)个单位(Unit) ,这个单位的组成,可能是单个字符,也可能是个词组。
对比一个表里的某个文本域,(A table's text field),如果这个域含有十个或以上的输入的单位,返回这个纪录。
如果是这样的话,恐怕光靠Single SQL statement不能胜任,要写脚本(Access VBA script)逐个数据来处理,关键之处在于自己要写一个字符对比的Function。
既然用Access,估计数据量不会很大,对这个Function的效率要求或许不高,应该不会那么难的。
上帖贴图中函数定义缺少了如下的红字部分,虽然也可以用,但是不够规范:
Public Function compString(str1 As String, str2 As String) As Long
我本来是写了的,因为在测试中曾经修改成sub,后来又改成function,结果后面的红字部分就忘了补回来。
我的思路是最好事先把表里的字符串进行排序后另存一个字段。 然后把待比较的字符串也排序后,在表内进行对比。算法上做一些优化,比如判断哪些条件下不可能存在10个相同字符后直接终止比较。
这样我想速度会提高很多。