专栏首页VBA 学习类模块——举例

类模块——举例

类模块一个常用的场景是把一类常用的方法包装起来,这样用起来的时候就方便了。

前面使用Open 进行的文件操作,使用起来不是很方便,但是FileSystemObject里的TextStream使用起来就比较方便了,知道了类之后,就可以使用类对Open的文件操作进行包装。

使用Open读取文件需要3个步骤:

  • Open Filename For Binary Access Read As #num_file
  • Get #num_file, , b
  • Close #num_file

在类模块中肯定也得这3步,但是,参数的传递完全可以不那么复杂了:

  • num_file这个参数,完全就可以包装到类模块内部,外部使用不需要出现这个参数。
  • Close #num_file这个方法也可以直接放到类模块的内部,因为类具有2个事件Class_Initialize和Class_Terminate,Class_Terminate在类被销毁也就是Set c = Nothing的时候会自动执行,所以Close #num_file就可以放到这个事件中让它自动执行。

插入一个类模块,修改名称为CFile:

Private lFileLen As Long
Private num_file As Integer

'读取len(b)个byte
Function Read(b() As Byte) As Long
    Dim ilen As Long
    ilen = UBound(b) - LBound(b) + 1
    
    Dim iseek As Long
    iseek = VBA.Seek(num_file)
    If iseek + ilen > lFileLen Then
        ilen = lFileLen - iseek + 1
    End If
    
    iseek = iseek + ilen
    
    Get #num_file, , b
    
    Read = ilen
End Function

'以字节方式读取文本
Function OpenFile(Filename As String) As Long
    num_file = VBA.FreeFile
    
    Open Filename For Binary Access Read Write As #num_file
    
    lFileLen = VBA.FileLen(Filename)
End Function

Function CloseFile()
    Close #num_file
End Function

Private Sub Class_Terminate()
    CloseFile
End Sub

外部使用:

Sub TestCFile()
    Dim cf As CFile
    
    Set cf = New CFile
    cf.OpenFile ThisWorkbook.Path & "\test.txt"
    
    Dim b(10) As Byte
    cf.Read b
    
    Dim str As String
    str = VBA.StrConv(b, vbUnicode)
    Debug.Print str
    
    Set cf = Nothing
End Sub

这种对象形式的使用方法比起直接用Open操作文件就方便的多了。

本文分享自微信公众号 - VBA 学习(xyjvba),作者:熊业军

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VBA拆分表格

    还是接着上一次的例子,分年龄段统计人数工作完成后,你又接到任务需要将总表根据年龄段拆分为多个分表。

    xyj
  • VBA解析VBAProject 04——run length encoding

    在VBAProject中,dir流以及VBA模块代码流都使用了run length encoding的算法进行压缩。

    xyj
  • 类模块——接口排序

    有了这个函数,只要传入1个一维数组,函数执行完后数组就有序了。 但是,如果需要排序的是个二维数组的话,就不得不把排序函数重新写过一次,如果是结构体,又得重新写过...

    xyj
  • vb.net 连接MYSQL数据库,需要MySql.Data.dll连接控件!

    '---------------------------------------------------------------------------...

    巴西_prince
  • .NET中的密钥加密

    本教程将演示如何通过System.Security.Cryptography在.NET Framework 1.1中实现对称加密/密钥加密。

    MelodyS
  • VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。

    鉴于之前在http://blog.csdn.net/laviewpbt/article/details/756547发布的代码很匆忙,也存在不少错误,现发布比较...

    用户1138785
  • VBA实战技巧06: 复制文本到剪贴板

    注意,上述代码运行前需要添加对“Microsoft Forms 2.0 Object Library”库的引用,方法是在VBE中单击菜单“工具——引用”,在“引...

    fanjy
  • SqlServer 获取数据库全部字段

    用户2657851
  • MD5的介绍,算法和C、VB、Delphi实现

    http://download.winzheng.com/infoView/Article_861.htm

    阿敏总司令
  • VB.NET 纯代码生成code39条形码

    ode39是条形码的一种,也被称为3 of 9 code、USD-3或者LOGMARS,由于编制简单、能够对任意长度的数据进行编码、支持设备广泛等特性而被广泛采...

    巴西_prince

扫码关注云+社区

领取腾讯云代金券