ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: game178

[求助] 求助:用VBA字典法进行联合查找,引用数据后求取平均分

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-17 21:37 来自手机 | 显示全部楼层
是两个不同的类别,一个是语数英+文化科目,一个是语数英+技术科目

TA的精华主题

TA的得分主题

发表于 2024-1-17 22:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你这手指一动,一伙人跟着你忙活大半天。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-17 22:14 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢之前各位大大的热心帮助,不过因为自己之前没有表述清楚,高三那里没有区分,给大家添麻烦了。目前已经重新编辑,希望能继续得到各位大虾的关注和帮助,个人想来应该是联合变量字典法解决,但是字典法没有学到家,尴尬了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 11:46 | 显示全部楼层
已经全面核查了数据设置,重新上传和编辑了表格,这次清晰的表述了目标意图,并做了预期的数据,期待你的关注和帮助。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 18:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
顶一下,求助,有好心人帮忙吗?顺便学习学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-22 18:55 | 显示全部楼层
Sub 测试()

Application.ScreenUpdating = False '停止屏幕刷新
On Error Resume Next

Dim arr As Variant, i, j As Integer

With Sheets("班级赋分")
arow = .Cells(Rows.Count, 1).End(xlUp).Row '找到A列最后一个有数据单元格的行号
arr = Range("A2:aj" & arow) '把单元格区域装入数组

Set d = CreateObject("scripting.dictionary") '创建

For j = 4 To 14
    For i = 2 To UBound(arr, 1)  '遍历数组arr1的一维
   
        xm = arr(i, j)
        If xm = "" Then  '跳过空格
        Else
        Dim brr(200, 300)
            If Not d.exists(xm) Then
                d.Add xm, 1
                brr(d.Count - 1, 0) = arr(i, 1) & arr(i, 2) '年级班级
                brr(d.Count - 1, 1) = arr(i, j + 11) 'A
                brr(d.Count - 1, 2) = arr(i, j + 22) 'B
            Else
                d(xm) = d(xm) + 1
                cs = d(xm)
                brr(cs, (cs - 1) * 3 + 1) = arr(i, 1) & arr(i, 2) '年级班级
                brr(cs, (cs - 1) * 3 + 2) = arr(i, j + 11)  'A
                brr(cs, (cs - 1) * 3 + 3) = arr(i, j + 22)   'B
            End If
        End If
        
    Next
Next

End With

With Sheets("测试")
.[b2:c2000].ClearContents
.[b2].Resize(d.Count, 1) = WorksheetFunction.Transpose(d.keys)
.[c2].Resize(d.Count, 1) = WorksheetFunction.Transpose(d.items)
.[f2].Resize(d.Count, 3) = brr
End With
Set d = Nothing '释放字典变量所占内存空间

Application.ScreenUpdating = True '恢复屏幕刷新
End Sub

只能写入第一次,想把名字重复的3个数据依次写入brr中,怎么实现,主要是brr的一维卡起了,不能对应到相应的姓名处。

目前的设想是第一次出现在x行的0.1.2三列,第二次出现在x行的3.4.5,依次类推,最后显示出来

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-22 18:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 测试()

Application.ScreenUpdating = False '停止屏幕刷新
On Error Resume Next

Dim arr As Variant, i, j As Integer

With Sheets("班级赋分")
arow = .Cells(Rows.Count, 1).End(xlUp).Row '找到A列最后一个有数据单元格的行号
arr = Range("A2:aj" & arow) '把单元格区域装入数组

Set d = CreateObject("scripting.dictionary") '创建

For j = 4 To 14
    For i = 2 To UBound(arr, 1)  '遍历数组arr1的一维
   
        xm = arr(i, j)
        If xm = "" Then  '跳过空格
        Else
        Dim brr(200, 300)
            If Not d.exists(xm) Then
                d.Add xm, 1
                brr(d.Count - 1, 0) = arr(i, 1) & arr(i, 2) '年级班级
                brr(d.Count - 1, 1) = arr(i, j + 11) 'A
                brr(d.Count - 1, 2) = arr(i, j + 22) 'B
            Else
                d(xm) = d(xm) + 1
                cs = d(xm)
                brr(cs, (cs - 1) * 3 + 1) = arr(i, 1) & arr(i, 2) '年级班级
                brr(cs, (cs - 1) * 3 + 2) = arr(i, j + 11)  'A
                brr(cs, (cs - 1) * 3 + 3) = arr(i, j + 22)   'B
            End If
        End If
        
    Next
Next

End With

With Sheets("测试")
.[b2:c2000].ClearContents
.[b2].Resize(d.Count, 1) = WorksheetFunction.Transpose(d.keys)
.[c2].Resize(d.Count, 1) = WorksheetFunction.Transpose(d.items)
.[f2].Resize(d.Count, 3) = brr
End With
Set d = Nothing '释放字典变量所占内存空间

Application.ScreenUpdating = True '恢复屏幕刷新
End Sub

VBA教师结果尝试.zip

48.28 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2024-1-22 20:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
教师结果。参与一下。

VBA教师结果.rar

59.22 KB, 下载次数: 24

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-22 21:10 | 显示全部楼层
chxw68 发表于 2024-1-22 20:43
教师结果。参与一下。

非常感谢帮助的指导,受益了。   

For i = 2 To UBound(arr)
        For j = 4 To 14
            If Len(arr(i, j)) <> 0 Then '用长度去除空值
                If Not d.exists(arr(i, j)) Then
                    ReDim brr(1 To 59) '59有什么讲究吗?预留装重复数据用?
                    brr(1) = 6 '预留前面5个位置放置数据,从第6个数据开始3个一组,以便定位重复数据应该放置的位置
                    brr(2) = arr(i, j)
                Else
                    brr = d(arr(i, j))
                End If
                brr(3) = brr(3) + 1  '姓名出现次数累加,以便后面求平均值
                brr(4) = brr(4) + arr(i, j + 11) 'A值累加求和
                brr(5) = brr(5) + arr(i, j + 22) 'B值累加求和
               
                n = brr(1)
               
                brr(n) = arr(i, 1) & arr(i, 2) & arr(1, j) '年级班级科目
                brr(n + 1) = arr(i, j + 11) 'A值
                brr(n + 2) = arr(i, j + 22) 'B值
                n = n + 3
                brr(1) = n
                d(arr(i, j)) = brr  '将brr作为条目
            End If
        Next
    Next
   
这样理解应该没有错吧?如果怕出现次数过多,59也可以改成更大的数字,对吧?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 03:50 , Processed in 0.041097 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表