ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3148|回复: 16

[分享] 类模块的用法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-17 10:18 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 dogingate 于 2020-3-17 10:21 编辑

之前一直没有看懂,现在恍然大悟,很简单么

在过程中有sub和function,sub无返回值,function有返回值

那么在类模块中也有sub和function,你若要有返回值,就用function,比如
public function functionname(args) as datatype
code...
functionname=你想返回的内容
end function

在模块中调用的时候就是set var=类名.functionname(args)

如果不要返回值,改成
public sub subname(args) as datatype
code...
end sub


在模块中调用的时候就是
类名.subname args
注意:没有返回值就不要用括号

至于你要获得类的属性就用get
public proverty get ProvertyName()
end proverty
设置类的属性值就用let
public proverty let ProvertyName()
end proverty

当这个类的属性是一个object时用set
public proverty set ProvertyName()
end proverty
附件是我整理的一些常用的代码,放到一个类模块中了,方便调用





vba.zip

33.02 KB, 下载次数: 36

TA的精华主题

TA的得分主题

发表于 2020-3-17 10:42 | 显示全部楼层
类远不是这么简单啊,我一直想学习

TA的精华主题

TA的得分主题

发表于 2020-3-17 10:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Public Function FindStuff(criteria As String, criteriaDate As Date, _

  lookupSheet As String, criteriaColumn As Integer, startDateColumn As Integer, _

  endDateColumn As Integer, resultsColumn As Integer)

  
Dim foundStuff As Boolean: foundStuff = False

  Dim wrkSheet As Worksheet

  For Each wrkSheet In Worksheets

    If LCase(wrkSheet.Name) = LCase(lookupSheet) Then

      Dim rowIndex As Long

      For rowIndex = 1 To wrkSheet.UsedRange.Rows.Count

        If wrkSheet.Cells(rowIndex, criteriaColumn) = criteria Then

          If IsDate(wrkSheet.Cells(rowIndex, startDateColumn)) And IsDate(wrkSheet.Cells(rowIndex, endDateColumn)) Then

                 If wrkSheet.Cells(rowIndex, startDateColumn) <= criteriaDate And wrkSheet.Cells(rowIndex, endDateColumn) >= criteriaDate Then

              FindStuff = wrkSheet.Cells(rowIndex, resultsColumn)

              foundStuff = True

              Exit For

            End If

          End If

        End If

      Next

    End If

  Next

  
  If Not foundStuff Then

    FindStuff = "N\A"

  End If

End Function

TA的精华主题

TA的得分主题

发表于 2020-3-17 10:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 FOB_FN_L 于 2020-3-17 10:45 编辑

Option Explicit
OnFunction FindSkus(searchCell)
  Dim RegEx As Object
  RegEx = CreateObject("VBScript.RegExp")
  RegEx.Global = True

  RegEx.Pattern = "(\d){7,8}"


  Dim foundSkus
  If RegEx.Test(searchCell) Then
    Dim matches As Object
    matches = RegEx.Execute(searchCell)
    Dim match As Object
    For Each match In matches
      foundSkus = foundSkus & match & ","
    Next

    foundSkus = Left(foundSkus, Len(foundSkus) - 1)

  End If


  FindSkus = foundSkus
End Function

TA的精华主题

TA的得分主题

发表于 2020-3-17 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
2333333

看来你这绝不可能是人造革,因为——你这是真的牛皮!

2333333.png

TA的精华主题

TA的得分主题

发表于 2020-3-17 11:08 | 显示全部楼层
首先,保存自己认为常见的代码,是个良好的习惯,值得肯定。
另外,从文字描述上看,可能存在一定理解上误区,但作为目前你个人用自己方式理解,也不予以否定。所以,下面把我个人的理解简述一下
类,就是“类似”、“类型”、“种类”的意思,每个类里都会有各种自定义属性(包括变量、Sub过程、Function函数)

在类里开始位置行设定的全局变量
Public 变量,作为类内全局变量,可以作为属性对外进行直接输出以及直接输入
Private 变量,作为类内全局变量,不作为属性,不对外进行直接输出以及直接输入

在类里设定的Sub过程、Function函数
Public Sub,可以作为属性对外进行直接执行的过程
Private Sub,不作为属性,不对外进行直接执行的过程Public Function,可以作为属性对外进行直接执行的函数并相应返回值
Private Function,不作为属性,不对外进行直接执行的函数

在类里设定对外的自定义属性,必须Public Property开始,使用Let、Get进行设定、获取
Public Property Let 自定义属性(参数传入),实际就是一个Sub过程,利用参数传入对指定的类内全局变量进行设定
Public Property Get 自定义属性() As 变量类型,实际就是一个无输入参数Function函数,对外输出指定的类内全局变量或者计算后数值



更高阶的Property应用,一般人用得少,就不予阐述了

TA的精华主题

TA的得分主题

发表于 2020-3-17 11:12 | 显示全部楼层
ggmmlol 发表于 2020-3-17 11:07
2333333

看来你这绝不可能是人造革,因为——你这是真的牛皮!

晕,GGM大神你太有才了,这几天在整理VBA代码,且无意对你那神秘的正则又能看懂一些了,

TA的精华主题

TA的得分主题

发表于 2020-3-17 11:35 | 显示全部楼层
ggmmlol 发表于 2020-3-17 11:07
2333333

看来你这绝不可能是人造革,因为——你这是真的牛皮!

    Sub windowsDataWP()
    Dim obj As Object
    Dim RegExp As Object
    Set RegExp = CreateObject("VBScript.RegExp")
    Dim strPattern As String

    RegExp.Pattern = "Effective\s+[0-9/]+\s+Distance.\s+([0-9.]+)\s+Effective"
    RegExp.Global = True
    RegExp.IgnoreCase = True

    Dim dataobj As New MSForms.DataObject
    Dim str As String
   Set obj = CreateObject("wscript.shell")

Application.Wait (Now + TimeValue("00:00:01"))
rowCounter = 4
windowName = Sheets("Sheet1").Range("B1").value
obj.AppActivate Trim(windowName)

Application.Wait (Now + TimeValue("00:00:02"))
zip1 = 1
Do While zip1 <> ""
    obj.AppActivate windowName
    zip1 = Sheets("Sheet1").Range("B" & rowCounter).value
    zip1 = CStr(zip1)
    If Len(zip1) < 5 Then
        zip1 = "0" + zip1
    End If
   
    zip2 = Sheets("Sheet1").Range("C" & rowCounter).value
    zip2 = CStr(zip2)
    If Len(zip2) < 5 Then
    End If
   
    obj.SendKeys "{TAB 4}"
    obj.SendKeys zip1
    obj.SendKeys "{TAB 2}"
    obj.SendKeys zip2
    obj.SendKeys "{ENTER}"
   
    Application.Wait (Now + TimeValue("00:00:02"))
    obj.SendKeys "%es"
    Application.Wait (Now + TimeValue("00:00:01"))
    obj.SendKeys "^c"
    Application.Wait (Now + TimeValue("00:00:01"))
   
    dataobj.GetFromClipboard
   
    str = dataobj.GetText
   
    Set allMatches = RegExp.Execute(str)
    result = ""
   
    If allMatches.Count <> 0 Then
   
        result = allMatches.Item(0).SubMatches.Item(0)
   
    End If

    ExtractSDI = result
   
    Worksheets("Sheet1").Range("D" & rowCounter).value = ExtractSDI
   
    rowCounter = rowCounter + 1
   
    zip1 = Sheets("Sheet1").Range("B" & rowCounter).value
   
    Loop

End Sub


看这个怎么样,正则的

TA的精华主题

TA的得分主题

发表于 2020-3-17 12:01 | 显示全部楼层
类 是 一种封装. 封装 就要牺牲性能.

当 要独立保留变量时,也就是说 多个实例 相互不影响时,使用它.

否则,函数\过程 就够了.

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-17 14:53 | 显示全部楼层
boy8199 发表于 2020-3-17 12:01
类 是 一种封装. 封装 就要牺牲性能.

当 要独立保留变量时,也就是说 多个实例 相互不影响时,使用它.

我不想记那么多function和sub的名字,我直接从类里面,那个.提示多好
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 19:43 , Processed in 0.044596 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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