ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用字典储存复杂的数据区域内容并根据指定区域的变化予以提取转置?

如何用字典储存复杂的数据区域内容并根据指定区域的变化予以提取转置?

作者:绿色风 分类: 时间:2022-08-17 浏览:139
楼主
kevinchengcw
Q: 如何用字典储存复杂的数据区域内容并根据指定区域的变化予以提取转置?
A: 现以本例示范如何用字典完成这一处理的流程,代码如下:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim Dic
  3. Dim Str As String
  4. If Target.Row > 3 And Target.Column = 1 Then  '如果target范围在指定范围内,则执行
  5.     Application.ScreenUpdating = False   '操作涉及了工作表切换等,关闭屏幕刷新提高速度,同时防止闪屏
  6.     Set Dic = CreateObject("scripting.dictionary")   '创建字典项目
  7.     With Worksheets("填空版")   '在填空版中为字典添加内容
  8.         .Activate  '因涉及单元格的select方法,所以先激活工作表
  9.         .[a4].Select    '选中起始单元格(合并单元格)
  10.         Do While .Cells(Selection.Row, Selection.Column) <> ""  '当合并单元格的内容不为空时执行循环(注意:因是合并单元格,注意单元格地址的表达方式)
  11.             Str = CStr(.Cells(Selection.Row, Selection.Column).Value)   '因对应内容是日期值,为防止出错,将其转化为文本后赋值给字符串变量Str
  12.             '下面添加字典项目,注意比较复杂
  13.             '因要添加的区域有两行,并且中间有一列不需要添加,所以每一行分成两段来写,单元格的值用vbtab相间隔,而两行之间用分隔符“|”来分隔
  14.             Dic.Add Str, _
  15.                     Join(Application.Transpose(Application.Transpose(.Cells(Selection.Row + Selection.Rows.Count - 2, 3).Resize(1, 5))), vbTab) _
  16.                     & vbTab & _
  17.                     Join(Application.Transpose(Application.Transpose(.Cells(Selection.Row + Selection.Rows.Count - 2, 9).Resize(1, 2))), vbTab) _
  18.                     & "|" & _
  19.                     Join(Application.Transpose(Application.Transpose(.Cells(Selection.Row + Selection.Rows.Count - 1, 3).Resize(1, 5))), vbTab) _
  20.                     & vbTab & _
  21.                     Join(Application.Transpose(Application.Transpose(.Cells(Selection.Row + Selection.Rows.Count - 1, 9).Resize(1, 2))), vbTab)
  22.             Selection.Offset(1, 0).Select   '选择当前选定单元格下方的单元格
  23.         Loop
  24.     End With
  25.     With Worksheets("报表")   '到报表单元格来写入数据
  26.         .Activate  '先激活
  27.         Str = CStr(.Cells(Target.Row, Target.Column).Value)   '取得target对应单元格的值,并转化为文本赋值给字符串变量Str
  28.         If Dic.exists(Str) Then    '如果存在该字典项,则将item项依分隔符“|”进行分割,前段依vbtab分割后放入对应单元格范围,后一段同样处理后放入另一单元格范围
  29.             Cells(Target.Row, 2).Resize(1, 7) = Application.Transpose(Application.Transpose(Split(Split(Dic(Str), "|")(0), vbTab)))
  30.             Cells(Target.Row + 1, 2).Resize(1, 7) = Application.Transpose(Application.Transpose(Split(Split(Dic(Str), "|")(1), vbTab)))
  31.         End If
  32.     End With
  33.     Set Dic = Nothing   '清空字典项目
  34.     Application.ScreenUpdating = True  '打开屏幕刷新
  35. End If
  36. End Sub

字典就像一个大仓库,只要处理好数据结构,可以储存很多复杂的数据内容。
附示例文件。
生产力-.rar
2楼
蓝桥玄霜
好思路!收藏学习了。
3楼
纵鹤擒龙水中月
收藏学习了。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap