VBA嵌套字典的递归输出(序列化)
6VBA嵌套字典的递归输出(序列化)
作者:AntoniotheFuture
关键词:VBA,字典,Dictionary,嵌套,递归,序列化
开发平台:VBE
平台版本上限:未知
平台版本下限:未知
开发语言:VBA
简介: 用递归的方法将一个VBA的嵌套字典对象全部输出到文本框内。
最近笔者的工作中使用到了VBA的Dictionary(字典)对象,这种对象是一种键值对对象,表现形式为:key:item ,其中Key是不可重复的,item也可以为另外一个字典,多个字典嵌套所形成的对象可以让我很方便地操作一个类,我在这一个对象内完成大部分的动作,极大地简化了我的代码。
要创建这样的对象,只需要像下面这样做就行了:
Dim AllDic as objectDim PeopleDic as objectDim HousesDic as objectDim HouseDic as objectDim RommDic as objectset AllDic = CreateObject('Scripting.Dictionary')set PeopleDic = CreateObject('Scripting.Dictionary')set HousesDic = CreateObject('Scripting.Dictionary')set HouseDic = CreateObject('Scripting.Dictionary')set RommDic = CreateObject('Scripting.Dictionary')RommDic.add 1,'客厅'RommDic.add 2,'主卧'RommDic.add 3,'厨房'HouseDic.add 'Addr','中山路3号'HouseDic.add 'Price','120万'HouseDic.add 'Rooms',RommDicHousesDic.add 1,HouseDicRommDic.removeallHouseDic.removeallRommDic.add 1,'客厅'RommDic.add 2,'主卧'RommDic.add 3,'阳台'HouseDic.add 'Addr','西安路58号'HouseDic.add 'Price','90万'HouseDic.add 'Rooms',RommDicHousesDic.add 2,HouseDicPeopleDic.add 'Name','王明'PeopleDic.add 'BirthDate','1990-01-01'PeopleDic.add 'Horses',HousesDicAllDic.add 1,PeopleDicRommDic.removeallHouseDic.removeallHousesDic.removeallPeopleDic.removeallRommDic.add 1,'客厅'RommDic.add 2,'主卧'RommDic.add 3,'次卧1'HouseDic.add 'Addr','北京路159号'HouseDic.add 'Price','145万'HouseDic.add 'Rooms',RommDicHousesDic.add 1,HouseDicPeopleDic.add 'Name','李红'PeopleDic.add 'BirthDate','1980-10-01'PeopleDic.add 'Horses',HousesDicAllDic.add 2,PeopleDic
这样我们创建了AllDic这样一个嵌套的字典,他的实际内容是这样的:
AllDic:1:Name:'王明'BirthDate:'1990-01-01'Horses:1:Addr:'中山路3号'Price:'120万'Rooms:1:'客厅'2:'主卧'3,'厨房'2:Addr:'西安路58号'Price:'90万'Rooms:1:'客厅'2:'主卧'3,'阳台'2:Name:'李红'BirthDate:'1980-10-01'Horses:1:Addr:'北京路159号'Price:'145万'Rooms:1:'客厅'2:'主卧'3,'次卧1'
这是一个四层的字典,第二层是人,第三层是房子,第四层是房间,需要引用里面的信息时,只需要像这样就行了:
第一个人第二套房子的地址:AllDic(1)('Horses')(2)('Addr')
第二个人的生日:AllDic(2)('BirthDate')
这种结构是不是似曾相识呢?对的,他就像Json。
现在进入正题,这个结构是保存在内存中的,如何打包为字符串进行查看和保存?而且这个结构在VBE中的本地窗口中是无法展开的,调试起来很麻烦。
这时我们就需要下面的代码来将其打包成结构式的文本,采用了递归方法,无论有多少层都能处理哦。(完)
Sub NestingDictoString()Dim DicT as StringDim ParentDic as ObjectDim TreeDic as objectDim i,iiDim StrDim OldKeyTextBox1.text = ''Dic = '字典结构' & chr(10)Set ParentDic = CreateObject('Scripting.Dictionary')Set TreeDic = CreateObject('Scripting.Dictionary')'先把要打包的字典放到过程变量中:For each DC in TabDicParentDic.add DC,TabDic(DC)Nexti = 0Do while i < ParentDic.CountKey = ParentDic.Keys'判断是否嵌套了字典,如果是,把子字典加到主遍历中(递归)If TypeName(ParentDic(Key(i))) = 'Dictionary' thenTreeDic.add TreeDic.Count,Key(i) & 'i'For Each DC in ParentDic(Key(i))ParentDic.add Key(i) & ';' & DC,ParentDic(Key(i))(DC)NextFor ii = i 1 to ParentDic.Count - ParentDic(Key(i)).Count - 1'把父字典放到最后,调整顺序OldKey = Key(ii)ParentDic.Add '-LAST-',ParentDic(OldKey)ParentDic.Remove(OldKey)ParentDic.Key('-LAST-') = OldKeyNextElseTreeDic.add TreeDic.Count,Key(i) & ':' & ParentDic(Key(i))End ifLoop'下面拼接为字符串[Chr(9)为Tab键]:For ii = 0 to TreeDic.Count - 1i = UBound(Split(TreeDic(ii),';'))DicT = DicT & String(i,Chr(9)) & Split(TreeDic(ii),';')(i) & chr(10)NextTextBox1.Text = DicTEnd Sub
赞 (0)
