虽然楼主已经结帖,但本人感觉很多问题都还没有讲明白。下面俺也来说几句。
1. 对于一个自定义函数(或过程)来说,若想将整个数组传递给函数,必须用传址方式,这是一个基本常识。
如:MyAscan(@a1),是将数组 a1 整体传递给了 MyAscan()。
若改为 MyAscan(a1) 则在默认传递方式(SET UDFPARMS TO VALUE)下,是将数组a1的第一个元素 a1[1] 的值 “b”传递给了 MyAscan()。
2. ASCAN()函数很重要,其中最后一个参数 nFlag 更要搞明白,因为很多函数都带有 nFlag,把它搞明白了,可以举一反三。
3. 若要忽略 nFlag 之前的可选参数(nStartElement, nElementsSearched, nSearchColumn),可将其统一设置为 -1(其他负数也可以),如:nFd=Ascan(aMyAry,"Name2",-1,-1,-1,1)
4. nFlag 是由一个 4 位(第0-3位)二进制数组成的,转换成十进制值就是 0 - 15(帮助文件中的表一)。
每一个二进制位控制一项功能(帮助文件中的表二)。如:第 0 位控制大小写,若其为 1 则表示忽略大小写,也就是说 0001、0011、0101、0111、1001、1011、1101、1111 代表的 1、3、5、7、9、11、13、15 都是忽略大小写的。
既然都是忽略大小写,那么这 8 个数有何区别呢?
上面已经说了,4个二进制位中的第 0 位控制大小写。这里,首先要解释一下第 1 位(从右边数第2位)和 第 2 位(从右边数第3位)的作用。这 2 位是控制字符串精确比较的。若第 2 位是 0,则使用系统 Set Exact ON/OFF 的设置。若第 2 位为 1,则不使用系统设置。若第1位是0,则模糊比较,第1位是1,则精确比较。
所以,1 和 3 是完全相同的。因为 3 的二进制是 0011,虽然第1位是1(精确比较),但是由于 第 2 位是0,不覆盖系统设置,所以不起作用。
若能理解 1 和 3 的区别,则其他的值也不难理解。5 是忽略大小写,且模糊比较;7 是忽略大小写,且精确比较;9 和 11是忽略大小写,返回行数;13 是忽略大小写,模糊比较,返回行数;15 是忽略大小写,精确比较,返回行数。