1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

字典填数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-14 22:19 | 显示全部楼层 |阅读模式
想把SAPH表中D列 对应填入到(根据工号和日期) 人事H表中的G列

麻烦问下,程序为啥不能显示结果?

工时核对2.zip

580.71 KB, 下载次数: 17

工时

TA的精华主题

TA的得分主题

发表于 2025-3-14 23:11 | 显示全部楼层
Sub step3_reconcile()
Dim d As Object, arr, brr, r As Integer, i As Integer
Set d = CreateObject("scripting.dictionary")
r = Sheets("SAPH").Cells(Rows.Count, 1).End(3).Row
arr = Sheets("SAPH").Range("a3:d" & r)
For i = 1 To UBound(arr)
    s = arr(i, 1) & arr(i, 3)
    d(s) = arr(i, 4)
Next
r2 = Sheets("人事H").Cells(Rows.Count, 1).End(3).Row
brr = Sheets("人事H").Range("a3:G" & r2)
For i = 1 To UBound(brr)
    If d.exists(brr(i, 1) & brr(i, 4)) Then
        brr(i, 7) = d(brr(i, 1) & brr(i, 4))
    End If
Next
Sheets("人事H").Range("g3:G" & r2).ClearContents
Sheets("人事H").Range("a3:G" & r2) = brr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-15 00:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub step3_reconcile()

Dim d As Object, arr, brr, r As Integer, i As Integer
Set d = CreateObject("scripting.dictionary")
r = Sheets("SAPH").Cells(Rows.Count, 1).End(3).Row
arr = Sheets("SAPH").Range("a3:d" & r)

For i = 1 To UBound(arr)
  s = arr(i, 1) & arr(i, 3)

d(s) = arr(i, 4)

Next

r2 = Sheets("人事H").Cells(Rows.Count, 1).End(3).Row
brr = Sheets("人事H").Range("a3:G" & r2)


For i = 1 To UBound(brr)
   If d.exists(brr(i, 1) & brr(i, 4)) Then
   Sheets("人事H").Cells(i + 2, 7).Value = d(brr(i, 1) & brr(i, 4))
   End If
Next

End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-15 01:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-3-15 08:56 | 显示全部楼层
  1. Sub test()
  2.     Dim r%, i%
  3.     Dim arr, brr
  4.     Dim d As Object
  5.     Set d = CreateObject("scripting.dictionary")
  6.     With Worksheets("SAPH")
  7.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.         arr = .Range("a3:d" & r)
  9.         For i = 1 To UBound(arr)
  10.             xm = arr(i, 1) & "+" & arr(i, 3)
  11.             d(xm) = arr(i, 4)
  12.         Next
  13.     End With
  14.     With Worksheets("人事H")
  15.         .AutoFilterMode = False
  16.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  17.         arr = .Range("a3:g" & r)
  18.         For i = 1 To UBound(arr)
  19.             xm = arr(i, 1) & "+" & arr(i, 4)
  20.             If d.exists(xm) Then
  21.                 arr(i, 7) = d(xm)
  22.             End If
  23.         Next
  24.         .Range("a3:g" & r) = arr
  25.     End With
  26. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-15 08:57 | 显示全部楼层
参与一下。

工时核对2.rar

607.74 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-15 10:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub MatchWorkingHours_Array()
  2.     Dim ws1 As Worksheet, ws2 As Worksheet
  3.     Dim dict As Object
  4.     Dim arr1, arr2, results()
  5.     Dim lastRow1 As Long, lastRow2 As Long
  6.     Dim i As Long, matchKey As String
  7.     Dim t As Double
  8.    
  9.     t = Timer
  10.     Application.ScreenUpdating = False
  11.     Application.Calculation = xlCalculationManual
  12.    
  13.     ' 设置工作表对象
  14.     Set ws1 = ThisWorkbook.Worksheets("人事H")
  15.     Set ws2 = ThisWorkbook.Worksheets("SAPH")
  16.    
  17.     ' 读取表2数据到数组(A:D列)
  18.     lastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
  19.     arr2 = ws2.Range("A3:D" & lastRow2).Value
  20.    
  21.     ' 创建复合键字典
  22.     Set dict = CreateObject("Scripting.Dictionary")
  23.     For i = 1 To UBound(arr2)
  24.         If Not IsEmpty(arr2(i, 1)) And Not IsEmpty(arr2(i, 3)) Then
  25.             matchKey = CStr(arr2(i, 1)) & "|" & _
  26.                       arr2(i, 3)
  27.             dict(matchKey) = dict(matchKey) + arr2(i, 4)
  28.         End If
  29.     Next
  30.    
  31.     ' 读取表1数据到数组(A:A和D:D列)
  32.     lastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
  33.     arr1 = ws1.Range("A3:D" & lastRow1).Value
  34.     ReDim results(1 To UBound(arr1), 1 To 1)
  35.    
  36.     ' 使用数组进行匹配
  37.     For i = 1 To UBound(arr1)
  38.         If Not IsEmpty(arr1(i, 1)) And Not IsEmpty(arr1(i, 4)) Then
  39.             matchKey = CStr(arr1(i, 1)) & "|" & _
  40.                       arr1(i, 4)
  41.             
  42.             If dict.Exists(matchKey) Then
  43.                 results(i, 1) = dict(matchKey)
  44.             Else
  45.                 results(i, 1) = "未找到"
  46.             End If
  47.         Else
  48.             results(i, 1) = "关键字段为空"
  49.         End If
  50.     Next
  51.    
  52.     ' 批量写回结果到G列
  53.     ws1.Range("G3").Resize(UBound(results)).Value = results
  54.    
  55.    
  56.    
  57.     ' 清理资源
  58.     Set dict = Nothing
  59.     Application.Calculation = xlCalculationAutomatic
  60.     Application.ScreenUpdating = True
  61.    
  62.     MsgBox "处理完成!共匹配 " & UBound(arr1) & " 条记录" & vbCrLf & _
  63.            "总耗时:" & Format(Timer - t, "0.00") & " 秒", _
  64.            vbInformation, "性能报告"
  65. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-15 12:24 | 显示全部楼层
写个公式
  1. =SUMIFS(SAPH!D:D,SAPH!A:A,人事H!A3,SAPH!C:C,人事H!D3)
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-13 08:47 , Processed in 0.027534 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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