明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2120|回复: 2

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

  [复制链接]
发表于 2009-9-30 09:03:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-9-30 12:08:06 编辑

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

Public Sub Sort_StringArray(MyStringArray() As String, Options As String)
    Select Case Options
        Case "SortByLenAndText"
            Sort_StringArray_LenAndText MyStringArray
        Case "SortByOnlyLen"
            Sort_StringArray_OnlyLen MyStringArray
        Case "SortByOnlyText"
           Sort_StringArray_OnlyText MyStringArray
    End Select
End Sub
     其中Options这个参数是三选一的,我该怎样设计这个过程呢?

我首先想到了查看replace这个函数,结果发现在这个函数中compare这个参数定义的类型是vbCompareMethod类型,在VB的对像浏览器中查看
vbCompareMethod,发现这是一个类其中有三个成员均是常数,分别就是所对应的三个选项,值为0~2,改动Sort_StringArray过程,将Options
也定义成vbCompareMethod,果然再使用Sort_StringArray过程时写到Options这一项时也跳出相应的三个选项,不过这似乎没什么意义,因为
反而不容易记这个过程了,有没有办法自定义一个类型类似于vbCompareMethod,我们假定这个类型名为SortStringOption,有三个成员分别是
SortByLenAndText;SortByOnlyLen;SortByOnlyText,并也将这三个成员的值分别固定为0~2呢
发表于 2009-9-30 10:22:00 | 显示全部楼层

Public Enum SortOption
    ByLenAndText
    ByOnlyLen
    ByOnlyText
End Enum

Public Sub Sort_StringArray(MyStringArray() As String, Options As SortOption)

    Select Case Options
   
    Case SortOption.ByLenAndText
   
    Case SortOption.ByOnlyLen
   
    Case SortOption.ByOnlyText
   
    End Select

End Sub

Sub tt()

Sort_StringArray arr, ByLenAndText
End Sub

 楼主| 发表于 2009-9-30 12:07:00 | 显示全部楼层
感谢lzh741206, 问题已解决,难者不会,会者不难呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 02:00 , Processed in 0.161779 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表