创建具有子级别的类属性

2024-06-26

我一直在读这个topic https://excelmacromastery.com/vba-class-modules/#A_Quick_Guide_to_the_VBA_Class_Module关于如何使用类模块。

我的目标是提高代码性能和可读性,所以我认为我走在正确的道路上。

但我对这些限制有一些疑问。

在我的脑海里,我想这样做:

这样的结构可以实现吗?

我读过的主题的例子很少,并且没有处理这个问题。我假设这对于集合的集合是可能的,但我不知道如何寻找它。

我的数据来自 2 个表,一个表包含除部门之外的所有项目,另一个表包含部门旁边的 ID。两个表都将当前月份的日期作为标题,并根据表的不同安排/部门。

我一天知道如何实现这一目标,但一整月都不知道。

这就是我为班级编写基础知识的方式:

Option Explicit
Private DirNeg As String
Private Agrup As String
Private DNI As String
Private Centro As String
Private Servicio As String
Private Nombre As String
Property Get Business() As String
    Business = DirNeg
End Property
Property Let Business(ByVal sBusiness As String)
    DirNeg = sBusiness
End Property
Property Get Group() As String
    Group = Agrup
End Property
Property Let Group(ByVal sGroup As String)
    Agrup = sGroup
End Property
Property Get ID() As String
    ID = DNI
End Property
Property Let ID(ByVal sID As String)
    DNI = sID
End Property
Property Get Location() As String
    Location = Centro
End Property
Property Let Location(ByVal sLocation As String)
    Centro = sLocation
End Property
Property Get Service() As String
    Service = Servicio
End Property
Property Let Service(ByVal sService As String)
    Servicio = sService
End Property
Property Get Name() As String
    Name = Nombre
End Property
Property Let Name(ByVal sName As String)
    Nombre = sName
End Property

另一方面,将整个班级填满是否正确?Class_Initialize事件?我的数据将始终相同,因此我不需要在普通模块中循环来填充类,每次创建类时都可以完成此操作。

编辑/更新:

这是我的数据的样子:

时间表以及代理信息

代理 ID 旁边的部门

clAgent 类模块:

Option Explicit
Private DirNeg As String
Private Agrup As String
Private DNI As String
Private Centro As String
Private Servicio As String
Private Nombre As String
Private Fechas As Object
Property Get Business() As String
    Business = DirNeg
End Property
Property Let Business(ByVal sBusiness As String)
    DirNeg = sBusiness
End Property
Property Get Group() As String
    Group = Agrup
End Property
Property Let Group(ByVal sGroup As String)
    Agrup = sGroup
End Property
Property Get ID() As String
    ID = DNI
End Property
Property Let ID(ByVal sID As String)
    DNI = sID
End Property
Property Get Location() As String
    Location = Centro
End Property
Property Let Location(ByVal sLocation As String)
    Centro = sLocation
End Property
Property Get Service() As String
    Service = Servicio
End Property
Property Let Service(ByVal sService As String)
    Servicio = sService
End Property
Property Get Name() As String
    Name = Nombre
End Property
Property Let Name(ByVal sName As String)
    Nombre = sName
End Property
Property Get clFechas(ByVal StringKey As String) As clFechas
    With Fechas
        If Not .Exists(StringKey) Then
            Dim objFechas As New clFechas
            .Add StringKey, objFechas
        End If
    End With

End Property
Private Sub Class_Initialize()

    Set Fechas = CreateObject("Scripting.Dictionary")

End Sub

clFechas 类模块:

Option Explicit
Private Modos As Object
Private Horarios As Object
'Aqiço creamos la propiedad Modo para la clase Fecha
Public Property Get Modo(ByVal StringKey As String) As String
    Modo = Modos(StringKey)
End Property
Public Property Let Modo(ByVal StringKey As String, ByVal StringValue As String)
    Modos(StringKey) = StringValue
End Property
Public Property Get Keys() As Variant
    Keys = Modos.Keys
End Property
'Aquí creamos la propiedad Horario para la clase Fecha
Public Property Get Horario(ByVal StringKey As String) As String
    Modo = Horarios(StringKey)
End Property
Public Property Let Horario(ByVal StringKey As String, ByVal StringValue As String)
    Horarios(StringKey) = StringValue
End Property
Public Property Get Keys() As Variant
    Keys = Horarios.Keys
End Property
'Iniciamos la clase
Private Sub Class_Initialize()
    Set Modos = CreateObject("Scripting.Dictionary")
    Set Horarios = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
    Set Modos = Nothing
    Set Horarios = Nothing
End Sub

您似乎对常规属性没有任何问题,所以让我们关注复杂的属性;时间表和部门。两者是相同的,因此相同的规则适用于两者。

属性基本上是列表,日期是索引,项目是对象。我个人更喜欢使用字典,因为我可以查看密钥是否存在等。

因此,您的 Agent 类可能如下所示:


Option Explicit
Private m_schedules As Object

Public Property Get Schedule(ByVal Key As Date) As Schedules
    With m_schedules
        If Not .Exists(Key) Then .Add Key, New Schedules
    End With
    Set Schedule = m_schedules(Key)
End Property

'For testing purposes - can be ommited.
Public Property Get Keys() As Variant
    Keys = m_schedules.Keys
End Property

'For testing purposes - can be ommited.
Public Property Get Count() As Long
    Count = m_schedules.Count
End Property

Private Sub Class_Initialize()
    Set m_schedules = CreateObject("Scripting.Dictionary")
End Sub

Private Sub Class_Terminate()
    Set m_schedules = Nothing
End Sub

时间表类:


Option Explicit
Private m_schedule As String

Public Property Get Schedule() As String
    Schedule = m_schedule
End Property
Public Property Let Schedule(ByVal param As String)
    m_schedule = param
End Property

现在,我们来测试一下:


Sub Test()

    Dim obj As Agent
    Set obj = New Agent

    obj.Schedule(#1/9/2019#).Schedule = "Schedule 1"
    obj.Schedule(#2/9/2019#).Schedule = "Schedule 2"
    obj.Schedule(#3/9/2019#).Schedule = "Schedule 3"

    PrintToDebug obj

    'Lets make a change
    obj.Schedule(#2/9/2019#).Schedule = "Schedule 2222"

    PrintToDebug obj

End Sub


Private Sub PrintToDebug(ByVal obj As Agent)

    Debug.Print ""

    Dim m As Variant
    With obj
        For Each m In .Keys
            Debug.Print "Key: " & m & String(3, " ") & "Value: " & .Schedule(m).Schedule
        Next m
    End With

    Debug.Print "Total Items: " & obj.Count
End Sub

Output:

'Key: 09/01/2019   Value: Schedule 1
'Key: 09/02/2019   Value: Schedule 2
'Key: 09/03/2019   Value: Schedule 3
'Total Items: 3

'Key: 09/01/2019   Value: Schedule 1
'Key: 09/02/2019   Value: Schedule 2222
'Key: 09/03/2019   Value: Schedule 3
'Total Items: 3

有关的附加信息Dictionary对象可以在这里找到:字典对象 https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object

也要记住这一点。这非常重要:

如果在更改项目时未找到密钥,则会创建一个新密钥 指定的新项目。如果尝试返回时未找到密钥 一个现有的项目,一个新的键被创建,它对应的项目是 留空。

如果字典项不是简单的字符串,请告诉我更新答案。抱歉,我无法读取屏幕截图中的数据。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建具有子级别的类属性 的相关文章

  • 在 VBA 中声明字典

    我收到错误Run time error 424 Object required当我尝试在 VBA 中创建字典时 我的代码如下所示 Private Sub data Dim dicti As Object Set dicti CreateOb
  • 使用字符串数组作为子字符串参数的 VBA InStr 函数 (Excel)

    找了很久了 第一次提问 目标 循环遍历包含地址的列 根据单元格包含的邮政编码为单元格偏移 0 6 分配一个值 城市名称 这是我到目前为止所得到的 缩短的数组长度 Sub LabelCell Dim SrchRng As Range cel
  • 如何使用 Office.js 获取单元格的格式

    我正在开发一个 Excel 加载项 它提取单元格 A1 的文本 包括其格式 并在其自己的区域中显示文本 所以添加包含这个 见下面的截图 显示格式化文本的区域 开始提取的按钮请点击查看图片 https i stack imgur com oy
  • C++ 中的“助手”函数

    在重构一些旧代码时 我删除了许多实际上应该是静态的公共方法 因为它们a 不操作任何成员数据或调用任何其他成员函数 b 因为它们可能在其他地方有用 这让我思考将 辅助 功能组合在一起的最佳方法 Java C 方法是使用带有私有构造函数的静态函
  • 如何使用 xlrd 将新列和行添加到 .xls 文件

    如何向 xlrd 中的工作表添加新列和 或行 我有一个使用 open workbook 读取的 xls 文件 我需要在第一张表中添加一个新列 bouncebacks 然后在该表中添加新行 但我在 xlrd 文档中找不到任何显示如何添加新行和
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 父子进程隔离和子进程列表

    请阅读以下模板 PID Status LPID 10 Closed 25 11 Open 25 31 Open 31 25 Closed 25 54 Open 31 17 Open 17 20 Closed 31 88 closed 77
  • 获取数据后关闭EXCEL应用程序进程

    我正在尝试通过以下方式从列表中的 Excel 文件获取列数据 private void Form1 Load object sender EventArgs e Excel Application xlApp new Excel Appli
  • 如何在 Javascript 中创建类?

    这是我到目前为止所得到的 它根本不起作用 我的玩家类中的所有变量都是空的 并且更新永远不会被调用 我的意思是编程类 而不是 CSS 类 IE 不是 movi ngdiv 颜色 ff0000
  • Excel VBA 日期格式

    我有一个包含多个日期的电子表格 这些通常出现在mm dd yyyy or mm dd yyyy hh mm 问题是日期并不总是正确输入 我想进行检查以确保它们是代码中的日期 我最初的想法是使用IsDate检查或CDate但这似乎不起作用 它
  • 使用VBA在网页中填写用户名和密码

    这是我第一次尝试通过 VBA 浏览 IE 浏览器 我在尝试着 转到此网页https hb2 bankleumi co il e Login html https hb2 bankleumi co il e Login html 填写用户名
  • 继承的构造函数的 C++ 可见性[重复]

    这个问题在这里已经有答案了 当我使用using这样为什么构造函数要公开继承呢 class Base int x public Base int x class Derived public Base using Base Base 我现在可
  • EXCEL 索引通过多个条件和多个匹配类型进行匹配?

    所以我确信我只是语法错误 但情况是这样的 我的 Sheet2 有 3 列 point name x y 我有 Sheet3 其中包含 5 列的区域列表 area name x start x end y start y end 我试图将每个
  • Java 类范围和库

    我正在创建一个 Java 库 作为最终产品 打算将此 jar 分发给开发人员 我正在从 Objective C 翻译 我的库 在其中我控制开发人员可以使用哪些类头文件 换句话说 我只向开发人员公开他们可以处理的几个类 在我的 Java 库中
  • Java如何重写抽象类中的可选方法?

    假设我们有一个基类 public abstract class BaseFragment extends Fragment protected abstract boolean postExec 然后从它派生出其他类 例如 Fragment
  • 在 VBScript 中的 SQL 字符串中使用 Excel 命名范围

    我已经在这里和谷歌上搜索过 但仍然无法解决我的问题 我正在尝试在我的中等效地使用 Excel 的命名范围 vbs文件 下面的代码可以在 excel 中的 VBA 中运行 但我无法让它在 vbs file ThisWorkbook Sheet
  • VBA 6:正则表达式无法识别复杂的字符串

    我有这个字符串 1X214X942 0SX 其中每个 X 代表一个 不间断空格 准确地说是空白 ASCII 代码为 160 S 代表一个空格字符 我试图用这个正则表达式来识别它 d 1 3 s d 3 s d 3 d 1 3 d 1 3 d
  • VBA在选择范围内选择随机行

    我只是想在用户选择的范围内选择随机行 然而 有时程序会选择特定范围之外的随机行 请参阅下面的代码摘录 Dim PopulationSelect As Range Set PopulationSelect Application InputB
  • 为什么即使代码运行良好,VBA 也会显示“(未响应)”?

    我在许多不同的 VBA 程序中都遇到过这个问题 所以我想我可能在 Excel 或 VBA 编辑器中设置了一些不正确的设置 老实说 在网上搜索了很多之后我还是一无所知 基本上 我将运行一段正常的代码 并且应用程序 Excel 和 VBA 编辑

随机推荐