暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA 字典 如果遇到这样的数据是退还是不退?

Excel VBA练习 2021-07-15
490

hello,小伙伴们,大家好

今天小编的领导的领导要求把这些数据合并起来

就以小编这暴脾气本想甩锅不干的,退回去的

开玩笑...工作还是要做,工资还是要拿~


如下图所示



运行效果



代码如下


    Sub GetData(control As IRibbonControl)
    Dim Dic As Object
    Dim intX&, intY&, iRow&, iCol&, y&, x&
    Dim aData, aRes, strName$
    aData = Range("A1").CurrentRegion '获取数据来源
    Range(Range("k1"), Cells(1, Columns.Count)).EntireColumn.Clear '清除K列以后的数据
    iCol = 1: iRow = 1: x = 1 '初始化数据
    ReDim aRes(1 To UBound(aData), 1 To iCol) '定义结果数组大小
    Set Dic = CreateObject("Scripting.Dictionary") '后期绑定字典
    For intX = LBound(aData) To UBound(aData) '遍历循环数据源,从最小下标开始
    strName = aData(intX, 1) '赋值
    If strName <> "" Then
    If strName = "姓名" Then '判断是否为姓名
    x = intX '获取所在数据源行位置
    For intY = 2 To UBound(aData, 2)
    If aData(intX, intY) <> "" Then
    If Not Dic.exists(aData(intX, intY)) Then '判断标题关键字是否存在于字典中
    iCol = iCol + 1 '累加数据列位置
    Dic(aData(intX, intY)) = iCol '标题关键字对应的条目为结果数组列位置
    If iCol > UBound(aRes, 2) Then ReDim Preserve aRes(1 To UBound(aRes), 1 To iCol) '调整结果数组大小
    aRes(1, iCol) = aData(intX, intY) '结果数组写入标题
    End If
    End If
    Next
    Else
    iRow = iRow + 1 '结果数组行位置累加
    aRes(iRow, 1) = aData(intX, 1) '写入名字
    For intY = 2 To UBound(aData, 2)
    If aData(x, intY) <> "" Then
    y = Dic(aData(x, intY)) '获取标题关键字的条目
    aRes(iRow, y) = aData(intX, intY) '写入结果数组
    End If
    Next
    End If
    End If
    Next
    aRes(1, 1) = "姓名"
    With Range("K1").Resize(iRow, iCol)
    .Value = aRes '输出内容
    .Font.Name = "微软雅黑" '修改字体
    .Borders.ColorIndex = 23 '添加边框
    End With
    Set Dic = Nothing '释放字典内存
    End Sub


    如果小伙伴有看过之前关于字典的文章,这个做起来应该不是很难

    VBA 字典 多表不同标题顺序 使用字典定位来合并工作表真的很简单

    VBA 字典 不规则表查询


    代码解析:


    第10至36行循环数据源

    第11行判断数据源中的第1个列位置是否为空,源数据带有合并单元格

    第12行判断数据源中的第1个列位置是否为姓名,如果是证明这一行为标题行,循环判断,记录各个标题在结果数组中的列位置

    第14行x先记录标题在数据源的那个行位置,这个很重要

    第16行判断是否为空值,由于数据源不规则,为空代表到头了,该处可以加多个条件为空Exit For跳出循环,代码少跑点...

    第28至33行,证明数据源第1列不是空值也不是标题,则是数据内容,先存入名字,利用存入x记录的标题所在数据源中的行位置,使用字典的特性取出每一列对应的标题所在结果数组中的列位置

    第31行写入内容

    第38至42行输出内容,格式设置...


    示例文件下载

    链接:https://pan.baidu.com/s/1cXWULw4BZSet-6Fu6zrKUg

    提取码:abcd


    收工!

    如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下

    文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

    关注公众号 ↓


    文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论