VB Collection 对象的一些操作

Sunpy 2011-08-19 09:59:17
最近在写程序,在对Collection对象进行操作时遇到个小问题。
问题整理后是这样的:
Dim coll As New Collection
coll.Add 1, "60001"
coll.Item("60001") = 4
MsgBox coll.Item("60001")

这个代码的话,执行到coll.Item("60001") = 4这句的时候一直不行,虽然可以通过Remove之后Add来解决,但是
搞不清楚,为什么这样不行啊?
...全文
303 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunpy 2011-08-19
  • 打赏
  • 举报
回复
谢谢sysdzw了。
无·法 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunpeiyumail 的回复:]

谢谢各位,看来只能使用Remove和Add方法组合了。
VB的集合操作太少了,不知道网上有没有加强版的集合。
[/Quote]都告诉你了用字典,相当于集合的拓展版,给你一个使用范例:
http://download.csdn.net/source/3050603
Sunpy 2011-08-19
  • 打赏
  • 举报
回复
谢谢各位,看来只能使用Remove和Add方法组合了。
VB的集合操作太少了,不知道网上有没有加强版的集合。
  • 打赏
  • 举报
回复
用数组的方式吧:集合相当于链表,查找元素时从集合的头一个开始,顺序向下,访问m_coData(99)要比访问_colData(1)慢得多

此时系统会自动生成Add,Remove,Item属性和Count方法。

  通过定义:Public m_colData As New Collection1 ‘用于保存记录

  调用Collecton1类中的Add方法,即可生成数据结构。

  3、集合与数组的比较

  集合和数组都可用下标来调用,但它们之间存在着区别和联系。

  (1)相同点。它们都是数据元素的有序集,数组可以看作为限制了数据元素个数的集合。

  (2)不同点。①元素的个数不同。数组的大小由创建时决定;集合的大小在创建时并不确定。

  ②访问元素的效率不同:。集合相当于链表,查找元素时从集合的头一个开始,顺序向下,访问m_coData(99)要比访问_colData(1)慢得多;而数组元素在内存中是顺序存放的,访问m_coData(99)和访问m_coData(1)的时间是一样的。

  结束语

  集合是面向对象编程的一个很重要的特点,对于多个具有相同特征的对象可以用集合对象来处理,从而提高编程效率和界面的统一

无·法 2011-08-19
  • 打赏
  • 举报
回复
如果实在想用这样的方式可以用字典。
set dic = createobject("scripting.dictionary")
无·法 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunpeiyumail 的回复:]
最近在写程序,在对Collection对象进行操作时遇到个小问题。
问题整理后是这样的:
Dim coll As New Collection
coll.Add 1, "60001"
coll.Item("60001") = 4
MsgBox coll.Item("60001")

这个代码的话,执行到coll.Item("60001") = 4这句的时候一直不行,虽然可以通过Rem……
[/Quote]Function Item(Index)
VBA.Collection 的缺省成员
返回由位置和关键字指定的 Collection 对象的成员

msdn上没说到可以设置值,也就说它只有get方法,没有let方法的。

另外MsgBox coll.Item("60001")和MsgBox coll(1)是一样的效果
原来一直从事企业管理软件的开发,经常苦恼于信息系统的开发困难。后来,公司产品要往面向对象方面转,希望能够通过新技术的应用,提高开发效率。不经意地发现了微软站点的一篇文章: 《Engine-Collection-Class,一种用来建立可重用企业组件的设计模式》。刚好,公司主要采用VB语言。经过仔细研读,不禁喜出望外。 经过短时间的验证、修改和使用,最终确定了公司采用这种模式作为对象层的开发模式。确定了所有和数据库交互的业务对象全部采用这种模式封装,并且统一调用。由此,也走上了长达六年的摸索之路。 实际编写中发现,大量的类的创建过程都是在根据一个模板拷贝粘贴。于是开发一个类生成工具的想法自然而然的就出现了。开始的方法是通过Rose的VB代码生成模板创建,建立VB代码模板,然后通过Rose建立模型,通过Sterotype关联到我们的模板类,然后自动产生代码。效果不错,不过Rose仅仅生成代码框架,仍然需要大量手工操作。于是决定写一个独立的代码工具,来自动产生所有的代码。经过不断的模式和改进,一个简单实用的工具问世了。命名为:OrFlying ! 随着时间的进步,VB逐步淡出主力开发语言的阵营。我也转向了.net/j2ee的方向,使用vb.net ado.net重新定义ECC模式和编写ECC代码生成器的想法,一直在我心头。终于在2003年第一次写下了第一行代码,到目前为止,该方法已经经过我长时间的使用,基本稳定。 不敢说能够解决所有OR中的问题,但是能解决大量代码工作量我已经很知足了 期间,研究过hibernate JDO 等,仍然继续了OrFlying的工作,我想它的存在总是有其价值所在。我主要看重两点: 1 全部代码是生成的,和数据库的访问全部由具体的代码,而没有后台通用的组件和层次,当然也注定了其应用面的狭窄; 2 这样产生的对象层,通过 . 可以一级一级的不断出现提示,这个特点是我非常喜欢的,也就是所谓的对象形式化吧。不知道理解对不对 OrFlying 有vbvb.net两个版本
4.13.0.130¶ 修改过滤器的默认配置,去掉了 encoding="gb2312" 4.13.0.129¶ 补充翻译了一条漏掉的快捷菜单项"显示搜索对话框(D)" 4.13.0.128¶ 增加了对英文的支持 4.12.0.127¶ 更新了热键控件,重新编译插件 4.11.0.126¶ 为了避免安装路径的差异问题,修改了make.bat,从注册表中提取VB6的路径 将热键设定及响应的功能提取到一个单独的HotkeyControl?项目中 引用新HotkeyControl?控件,并在本地添加一个代理类HotkeyProxy? 补充了类注释和模块注释 调整了检查版本的方式,增加对以何种方式检查的判断,在手动检查更新时忽略灵敏度设置 4.10.0.125¶ 增加自动升级灵敏度的设定 修改了没有激活工程时进行范围是当前工程的搜索提示错误的问题 4.9.0.124¶ 增加ICondInfo接口,此接口定义了需要使用的搜索条件,全局设定GlobalSetting?和条件快照ConditionSnap?都实现了该接口,此接口在TaskMgr?中用到,代替原先的大量Property Get语句 在搜索范围是当前工程的时候显示工程名称 修改了搜索范围是选定区域,且区域中包含汉字时会搜索不全的问题 修改了搜索范围是当前过程,过程为最后一行且无后续换行时,搜索不全的问题 4.8.0.123¶ 选中正则表达式时,将整词匹配选项替换为单行模式选项 增加对正则表达式单行模式搜索/替换的支持 尝试不关闭窗口的代码高亮方式 选中多行时自动将搜索范围切换至选中内容 在卸载插件时删除全局对象的引用 完美解决了定位时焦点显示的问题. 修改了VBA插件启动时提示下标越界的问题 更改了工程文件名和DLL文件名,去掉了开头的VB字母 修改了安装文件的文件名为VBEnhancedSearch_Setup.exe 代码预览的相关行数默认值修改为12 增加定位时将代码窗体最大化的选项 在搜索结果列表的右键菜单中,增加关闭全部页面的选项 修改了代码预览窗体的背景及关键字的颜色 4.7.0.120¶ 修改了点击关闭按钮关闭页面时出错的问题 修改了快速点击搜索按钮提示错误的问题 修改无页面时点击ESC提示错误的问题 修改无页面时未禁用关闭按钮的问题 修改vbalTabControl,在用BarEnabled?设置Enabled属性的时候同时设定CanClose?,防止用户在禁用时点击关闭按钮. 在弹出对话框之前进行菜单的状态更新操作,防止菜单项选中状态更新不及时. 为了提高效率,使用ByRef?传递使用频率较高函数的字符串参数 对齐升级提示对话框中的版本号 补充了一些注释 去掉了默认标签页 增加关闭其它页面的功能 将TabData?更名为Page 将LogClassInitialize?和LogClassTerminate?函数放入标准模块 增加ILib接口,此接口用于进行全局对象的构建和销毁,并修改所有本地全局对象的初始化机制. 为了提高执行效率,修改了vbalDTab6FES.ocx的源代码,增加可以快速批量设置所有Tab标签的可用属性BarEnabled? 从PageManager?分离出PageCollection?类,此类用于专门管理页面集合 修改了工具栏窗口创建的方式,将此操作合并到CreateObjects?函数中 点确定关闭选项窗口时如果过滤器字符串无变化,则不更新列表 修改滚动条重绘的方式为PostMessage? 修改了Tab控件的事件处理,结果窗口仅处理菜单相关事件,页面增减相关事件由PageManager?类处理 修改了分离PageCollection?类后需要调整的相关调用代码 对于Task对象的事件源更新操作都放在TabManager?类的TabChange?事件中
VB增强搜索插件 主要功能: 普通/模式搜索字符串 正则搜索、替换字符串 搜索结果列表 搜索结果相关代码预览 替换结果相关代码预览 可取消当前搜索操作 双击定位结果代码 更新记录: v2.3.0.74 调整过滤器应用时的算法 在快捷菜单中增加"显示搜索对话框"项 调整了显示代码预览的算法 修改过滤器帮助的网页地址到Google的Wiki v2.3.0.73 修改了预览窗体无法显示的问题 修改了切换结果元素时的处理方式 v2.3.0.72 在失去连接后删除内存中的对象 使用自绘列表控件代替CheckBox?式的自绘列表,解决了列表显示的问题 去除残留的ADO控件引用 取消了结果列表的缓冲模式 调整代码存储结构 修改/调整输出脚本 修改了没有搜索的时候显示结果列表导致VB崩溃的问题 v2.2.0.71 增加HelpID 默认过滤器增加ProcType?(过程类型) 修改了列表重绘时查询结果元素的算法,提高了重绘的速度 调整了列表的颜色属性 调整结果列表中高亮元素的显示方式 为搜索结果增加缓冲区,在到达一定数量后刷新列表 修改了列表元素个数超限的问题 v2.2.0.70 增加xml的TrimLine?相关属性,默认显示的时候不再带前边的空白字符 v2.2.0.69 ListBox?从Filter的xml中获取信息,进行重绘,加快了重绘速度并且不受用户修改代码的影响 修改了重绘焦点/选中元素的算法 修改热键的菜单名称 在回调函数返回之前清除Err对象 在ListPainter?关键函数中增加错误处理/显示代码 忽略RelativeText?函数的错误(此错误可能会导致IDE不稳定) v2.2.0.68 补充修改了ListBox?超限的问题 修改了ObjectCollection?,StringCollection?的实现方式 修改了横向滚动条的计算方式 修改了ListBox?重绘后失去焦点时不显示选中项目的问题 v2.2.0.67 调整文件名和类名 增加列表重绘代码,准备将匹配子串用粗体显示 修改了在显示时提取选中字符串的功能 调整了热键设定对话框的焦点处理方式 增加了列表重绘功能,可以在列表框中用粗体显示匹配项 用另一种颜色显示@Line之前的信息 调整了横向滚动条的算法 修改了过滤器无法立即应用的问题 修改了ListBox?元素可能会超限的问题 v2.1.0.66 (Beta 2) 修改了默认过滤器会输出转义字符的问题 修改了自定义热键第一次确定后无法保存的问题 修改了搜索完毕后会自动选中忽略大小写的问题 修改了无法定位第一个搜索结果的问题 v2.0.0.64 (Beta) 调整了内部结构 增加了自定义功能热键的功能 修改过滤器内核,将ADO改为XML+XSL,提高了过滤速度.

2,461

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧