cjb2187 发表于 2009-9-30 09:03:00

求助 VBA中自定义函数或过程中使用类成员的问题(已解决)

本帖最后由 作者 于 2009-9-30 12:08:06 编辑 <br /><br /> <p>&nbsp;&nbsp;&nbsp;&nbsp;众所周知在VBA中可以自定义函数及过程,但是我在编写自定义函数或过程时总觉得它的功能没有系统自带的来得功能强大,当然这是由于本人的自身水平不足(有点羞愧^_^),其中有个问题我百思不得其解,具体如下:<br/>&nbsp;&nbsp;&nbsp; 系统自带的很多函数都可以将其中的一项参数定义成一个单选的类型,这么说大家可能不是太理解(因为这是我自已乱定的类型^_^),下面举个例子相信众位大虾就可以理解了<br/>&nbsp;&nbsp;&nbsp; 系统自带一个REPLACE函数,其语法是<br/>Replace(expression, find, replace[, start[, count[, compare]]])<br/>&nbsp;&nbsp;&nbsp; 其中最后一项compare是表示判别子字符串时所用的比较方式,这一项不难理解,无非就是说明替换时是按二进制(区分大小写)还是文字比较(不区分大小写),当然还有一项仅用于Microsoft Access这里就不作讨论了。<br/>问题是我们在使用这个函数时只要写到这一项VB编辑器会自动跳出来这几项(具体几项根据使用场合不同有所变化)让你选择,我们实际编程的时候只需要根据相应的情况及要求选择其中一项就可以了,这样就简化了我们的工作。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 由此就有了我的疑惑,我们自已编写函数的时候可不可以也拥有这种便利呢。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我自已写了三个过程,分别是<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)Sort_StringArray_OnlyLen<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)Sort_StringArray_OnlyText<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)Sort_StringArray_LenAndText<br/>由于篇幅所限我无法将这三个过程的全部内容写在这里,这里只写一个Sort_StringArray_LenAndText吧<br/>Public Sub Sort_StringArray_LenAndText(MyStringArray() As String)<br/>&nbsp;&nbsp;&nbsp; Dim num1, num2, intmin As Integer<br/>&nbsp;&nbsp;&nbsp; Dim numLbound, numUbound As Integer<br/>&nbsp;&nbsp;&nbsp; Dim temp As String<br/>&nbsp;&nbsp;&nbsp; numLbound = LBound(MyStringArray)<br/>&nbsp;&nbsp;&nbsp; numUbound = UBound(MyStringArray)<br/>&nbsp;&nbsp;&nbsp; For num1 = numLbound To numUbound - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intmin = num1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For num2 = num1 + 1 To numUbound<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Len(MyStringArray(num2)) &lt; Len(MyStringArray(intmin)) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intmin = num2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (Len(MyStringArray(num2)) = Len(MyStringArray(intmin))) _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; And (MyStringArray(num2) &lt; MyStringArray(intmin)) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intmin = num2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next num2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If intmin &lt;&gt; num1 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = MyStringArray(num1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyStringArray(num1) = MyStringArray(intmin)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyStringArray(intmin) = temp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next num1<br/>End Sub<br/>&nbsp;&nbsp;&nbsp;&nbsp; 由于自动转行的问题,可能格式有一点小小的不对,反正也不是太难(主要是太难的我也写不出来^_^),大家凑合着看看吧,其它两个过程其实也是大同小异的,只是排序的条件不一样而已.<br/>&nbsp;&nbsp;&nbsp;&nbsp; 写这三个过程的目的主要是为了字符串数组的排序,在实际编程中用到这三种排序方式时分别用这三个过程中的一个,问题是我可不可以用一个过程来完成这三种排序方式呢<br/>&nbsp;&nbsp;&nbsp;&nbsp; 假设我可以将这三个过程全部由PUBLIC改为PRIVATE,再新建一个PUBLIC过程,名为Sort_StringArray,其过程代码假定如下:<br/><br/>Public Sub Sort_StringArray(MyStringArray() As String, Options As String)<br/>&nbsp;&nbsp;&nbsp; Select Case Options<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case "SortByLenAndText"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sort_StringArray_LenAndText MyStringArray<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case "SortByOnlyLen"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sort_StringArray_OnlyLen MyStringArray<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case "SortByOnlyText"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sort_StringArray_OnlyText MyStringArray<br/>&nbsp;&nbsp;&nbsp; End Select<br/>End Sub<br/>&nbsp;&nbsp;&nbsp;&nbsp; 其中Options这个参数是三选一的,我该怎样设计这个过程呢? </p><pre>我首先想到了查看replace这个函数,结果发现在这个函数中compare这个参数定义的类型是vbCompareMethod类型,在VB的对像浏览器中查看</pre><pre>vbCompareMethod,发现这是一个类其中有三个成员均是常数,分别就是所对应的三个选项,值为0~2,改动Sort_StringArray过程,将Options</pre><pre>也定义成vbCompareMethod,果然再使用Sort_StringArray过程时写到Options这一项时也跳出相应的三个选项,不过这似乎没什么意义,因为</pre><pre>反而不容易记这个过程了,有没有办法自定义一个类型类似于vbCompareMethod,我们假定这个类型名为SortStringOption,有三个成员分别是</pre><pre>SortByLenAndText;SortByOnlyLen;SortByOnlyText,并也将这三个成员的值分别固定为0~2呢</pre>

雪山飞狐_lzh 发表于 2009-9-30 10:22:00

<p>Public Enum SortOption<br/>&nbsp;&nbsp;&nbsp; ByLenAndText<br/>&nbsp;&nbsp;&nbsp; ByOnlyLen<br/>&nbsp;&nbsp;&nbsp; ByOnlyText<br/>End Enum</p><p>Public Sub Sort_StringArray(MyStringArray() As String, Options As SortOption)</p><p>&nbsp;&nbsp;&nbsp; Select Case Options<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Case SortOption.ByLenAndText<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Case SortOption.ByOnlyLen<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Case SortOption.ByOnlyText<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; End Select</p><p>End Sub</p><p>Sub tt()</p><p>Sort_StringArray arr, ByLenAndText<br/>End Sub</p>

cjb2187 发表于 2009-9-30 12:07:00

感谢<strong><font face="Verdana" color="#da2549">lzh741206, <font color="#000000">问题已解决,难者不会,会者不难呀</font></font></strong>
页: [1]
查看完整版本: 求助 VBA中自定义函数或过程中使用类成员的问题(已解决)