热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:带键的VBA多维数组?[关闭]

篇首语:本文由编程笔记#小编为大家整理,主要介绍了带键的VBA多维数组? [关闭]相关的知识,希望对你有一定的参考价值。 如何在VBA中创建如下所示的数组?其他语言相当直接。我无法弄清楚设计代码的最佳

篇首语:本文由编程笔记#小编为大家整理,主要介绍了带键的VBA多维数组? [关闭]相关的知识,希望对你有一定的参考价值。



如何在VBA中创建如下所示的数组?其他语言相当直接。我无法弄清楚设计代码的最佳方法。我已经查看了集合,它可能会工作,除了我需要动态地在另一个集合上创建一个新集合。这是不可能的。

cOntacts=> array(
'company1' => array(
'POMain' => array(
[0] = array(
'Email' => 'demo@demo.com',
'Name' => 'John Doe'
),
[1] = array(
'Email' => 'demo@demo.com',
'Name' => 'John Doe'
)
),
'POCC' => array(
'Email' => 'demo@demo.com',
'Name' => 'John Doe'
)
),
'company2' => array(
etcetera...
)
)

答案

我同意Comintern的观点,有许多不同的方法来创建符合您所述要求的VBA数据结构。没有更多信息,很难或不可能知道哪种方法最适合您。

您似乎认为您不能在集合中拥有集合。这是不正确的。下面我演示一种在集合中保存集合的方法。但是,除了一次性练习外,这不是我会使用的方法。我不想成为维护程序员要求更新此方法,除非它已完整记录。

我需要一些测试数据来演示我的代码。我决定使用Excel,但这种方法适用于任何可以保存此类数据的Office产品。我的数据是:

enter image description here

我发现使用这些数据很容易加载数据结构。我相信宏中的文档是足够的。

从数据结构中提取值要困难得多,因为有太多级别。我使用常量来使代码难以阅读。数据结构的组件是:



  • Contacts:一个集合

  • Contacts.CountContacts中的元素数量

  • Contacts(InxCntctCrnt):来自Contacts的一个元素

  • Contacts(InxCntctCrnt)(InxCntctCompN)Contacts(InxCntctCrnt)的公司名称

  • Contacts(InxCntctCrnt)(InxCntctPrsnMain)Contacts(InxCntctCrnt)的主要人物集合

  • Contacts(InxCntctCrnt)(InxCntctPrsnCC)Contacts(InxCntctCrnt)的CC人员集合

  • Contacts(InxCntctCrnt)(InxCntctPrsnMain).CountContacts(InxCntctCrnt)主要人物集合中的元素数量

  • Contacts(InxCntctCrnt)(InxCntctPrsnCC).CountContacts(InxCntctCrnt)的CC人员集合中的元素数量

  • Contacts(InxCntctCrnt)(InxCntctPrsnMain)(InxPrsnMainCrnt):来自Contacts(InxCntctCrnt)的主要人物集合中的一个元素

  • Contacts(InxCntctCrnt)(InxCntctPrsnCC)(InxPrsnCCCrnt):来自Contacts(InxCntctCrnt)的CC人员集合中的一个元素

  • Contacts(InxCntctCrnt)(InxCntctPrsnMain)(InxPrsnMainCrnt)(InxPrsnN):来自Contacts(InxCntctCrnt)主要人物集合中的一个元素的人名

  • Contacts(InxCntctCrnt)(InxCntctPrsnMain)(InxPrsnMainCrnt)(InxPrsnA):来自Contacts(InxCntctCrnt)主要人物集合中的一个元素的电子邮件地址

  • Contacts(InxCntctCrnt)(InxCntctPrsnCC)(InxPrsnCCCrnt)(InxPrsnN):来自Contacts(InxCntctCrnt)的CC人员集合中的一个元素的人名

  • Contacts(InxCntctCrnt)(InxCntctPrsnCC)(InxPrsnCCCrnt)(InxPrsnA):来自Contacts(InxCntctCrnt)的CC人员集合中的一个元素的电子邮件地址

我的代码是:

Option Explicit
' Columns within worksheet
Const ColNameC As LOng= 1
Const ColTypeP As LOng= 2
Const ColNameP As LOng= 3
Const ColAddrP As LOng= 4
' First data within worksheet
Const RowDataFirst As LOng= 3
Sub Demo()
Dim CompanyNameCrnt As String
Dim Contacts As New Collection
' Each entry in Contacts is a zero-based array containing
' * String company name
' * Collection of main persons. Each entry in this collection
' is a zero-based array containing a person name and a person email
' address.
' * Collection of cc persons. Format same as collection of main persons
Dim PersonsMainCrnt As Collection
Dim PersonsCCCrnt As Collection
Dim RowCrnt As Long
Dim TypeCrnt As String
CompanyNameCrnt = "" ' No pending company
With Worksheets("Contacts")
RowCrnt = RowDataFirst
Do While .Cells(RowCrnt, ColNameP).Value <> ""
If .Cells(RowCrnt, ColNameC).Value <> "" Then
' Start of new company
If CompanyNameCrnt <> "" Then
' Output company just finished
Contacts.Add VBA.Array(CompanyNameCrnt, _
PersonsMainCrnt, _
PersonsCCCrnt)
End If
' Prepare for new company
CompanyNameCrnt = .Cells(RowCrnt, ColNameC).Value
Set PersOnsMainCrnt= New Collection
Set PersOnsCCCrnt= New Collection
End If
If .Cells(RowCrnt, ColTypeP).Value <> "" Then
' New type of person
TypeCrnt = .Cells(RowCrnt, ColTypeP).Value
End If
If TypeCrnt = "Main" Then
PersonsMainCrnt.Add VBA.Array(.Cells(RowCrnt, ColNameP).Value, _
.Cells(RowCrnt, ColAddrP).Value)
ElseIf TypeCrnt = "CC" Then
PersonsCCCrnt.Add VBA.Array(.Cells(RowCrnt, ColNameP).Value, _
.Cells(RowCrnt, ColAddrP).Value)
Else
Debug.Assert False ' Unknown type
End If
RowCrnt = RowCrnt + 1
Loop
If CompanyNameCrnt <> "" Then
' Output final company
Contacts.Add VBA.Array(CompanyNameCrnt, _
PersonsMainCrnt, _
PersonsCCCrnt)
End If
End With
' Indices into element of Contacts
Const InxCntctCompN As LOng= 0
Const InxCntctPrsnMain As LOng= 1
Const InxCntctPrsnCC As LOng= 2
' Indices into element of PersonsMain and PersonsCC
Const InxPrsnN As LOng= 0
Const InxPrsnA As LOng= 1
Dim InxCntctCrnt As Long ' Loop variable for Contacts
Dim InxPrsnMainCrnt As Long ' Loop variable for main persons
Dim InxPrsnCCCrnt As Long ' Loop variable for CC persons
For InxCntctCrnt = 1 To Contacts.Count
For InxPrsnMainCrnt = 1 To Contacts(InxCntctCrnt)(InxCntctPrsnMain).Count
Debug.Print Contacts(InxCntctCrnt)(InxCntctCompN) & "|Main|" & _
Contacts(InxCntctCrnt)(InxCntctPrsnMain)(InxPrsnMainCrnt)(InxPrsnN) & "|" & _
Contacts(InxCntctCrnt)(InxCntctPrsnMain)(InxPrsnMainCrnt)(InxPrsnA)
Next
For InxPrsnCCCrnt = 1 To Contacts(InxCntctCrnt)(InxCntctPrsnCC).Count
Debug.Print Contacts(InxCntctCrnt)(InxCntctCompN) & "| CC |" & _
Contacts(InxCntctCrnt)(InxCntctPrsnCC)(InxPrsnCCCrnt)(InxPrsnN) & "|" & _
Contacts(InxCntctCrnt)(InxCntctPrsnCC)(InxPrsnCCCrnt)(InxPrsnA)
Next
Next
End Sub

此代码的输出:

Company1|Main|John Doe|DoeJohn@One.com
Company1|Main|Jane Doe|DoeJane@One.com
Company1| CC |John Brown|BrownJohn@One.com
Company1| CC |Jane Brown|BrownJane@One.com
Company1| CC |Chris Green|GreenChris@One.com
Company2|Main|Donald Black|DonaldBlack@Two.com
Company2|Main|Esther Clark|EstherClark@Two.com
Company2|Main|Francis Davis|FrancisDavis@Two.com
Company2| CC |George Eton|GeorgeEton@Two.com
Company2| CC |Harry Fox|HarryFox@Two.com
Company3|Main|Iris Grant|GrantIris@Three.com
Company3|Main|John Hammond|HammondJohn@Three.com
Company3|Main|Keith Island|IslandKeith@Three.com

如果不了解您的目标,我无法确定我会推荐的方法。我首选的方法是集合中的用户类型。遗憾的是,集合中不允许使用用户类型。您可以在集合中拥有类,但类具有不同的限制,这限制了它们的用途。我怀疑数组中的用户类型是最自我记录的方法。如果您认为可能有帮助,我可以提供该方法的演示。



推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
author-avatar
羊角roik_789
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有