Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1606|回复: 10

[已解决]EXCEL VBA 根据条件更新某列单元格内容

[复制链接]
发表于 2022-6-16 17:19 | 显示全部楼层 |阅读模式
sheet1
工号    姓名     日期
2123   张三      2022-01-01
2124   李四      2022-02-23
2245   王五      2022-03-11
2555   徐六      2022-01-14
2455   德胡      2022-02-15
6633   吴吴      2022-02-01

sheet2
工号    姓名     日期
2123   张三      2022-02-20
2124   李四      2022-02-25
6633   吴吴      2022-02-01

2569   夏梅      2022-06-01
如上Sheet1和sheet2两个工作表,
问题1:
如果同一个人,sheet2的日期大于sheet1时,将sheet1后面的日期更新成sheet2的日期,因为数据很多
问题2:
比如Sheet2中
2569   夏梅      2022-06-01    此人不在Sheet1清单中,如果添加至Sheet1表中?

希望VB大师帮忙,感谢!


最佳答案
2022-6-16 18:58
本帖最后由 hasyh2008 于 2022-6-16 19:11 编辑

Sub tt()
  On Error Resume Next
  Dim K%, X%, Str$
  Dim Arr, Ar, Cr()
  Dim D
  Set D = CreateObject("scripting.dictionary")
  For K = 1 To 2
    Arr = Sheets(K).Range("A1").CurrentRegion
    For X = 1 To UBound(Arr)
      Str = Arr(X, 1) & "-" & Arr(X, 2)
      If Arr(X, 3) > D(Str) Then D(Str) = Arr(X, 3)
    Next X
  Next K
  Ar = Application.Transpose(Array(D.keys, D.items))
  ReDim Cr(1 To UBound(Ar), 1 To 3)
  For X = 1 To UBound(Ar)
    Cr(X, 1) = Split(Ar(X, 1), "-")(0)
    Cr(X, 2) = Split(Ar(X, 1), "-")(1)
    Cr(X, 3) = Ar(X, 2)
  Next X
  With Sheet2
    .Cells(1, 1).Resize(UBound(Ar), 3) = Cr
  End With
End Sub
发表于 2022-6-16 18:18 | 显示全部楼层
需求不明确,你自己再组织一下语言,把附件放上去
回复

使用道具 举报

 楼主| 发表于 2022-6-16 18:53 | 显示全部楼层
确实描述的不清楚
sheet1
工号    姓名     日期
2123   张三      2022-01-01
2124   李四      2022-02-23
2245   王五      2022-03-11
2555   徐六      2022-01-14
2455   德胡      2022-02-15
6633   吴吴      2022-02-01
2569   夏梅      2022-06-01

sheet2
2123   张三      2022-01-01
2124   李四      2022-02-23
6633   吴吴      2022-02-01

sheet2 结果展示
工号    姓名     日期
2123   张三      2022-02-20    ‘日期从2022-01-01更新为2022-02-20
2124   李四      2022-02-25    ‘日期从2022-02-23更新为2022-02-25
6633   吴吴      2022-02-01
2569   夏梅      2022-06-01    ‘sheet1有,sheet2没有此人,将此人添加至Sheet2

TEST.zip

8.15 KB, 下载次数: 3

回复

使用道具 举报

发表于 2022-6-16 18:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hasyh2008 于 2022-6-16 19:11 编辑

Sub tt()
  On Error Resume Next
  Dim K%, X%, Str$
  Dim Arr, Ar, Cr()
  Dim D
  Set D = CreateObject("scripting.dictionary")
  For K = 1 To 2
    Arr = Sheets(K).Range("A1").CurrentRegion
    For X = 1 To UBound(Arr)
      Str = Arr(X, 1) & "-" & Arr(X, 2)
      If Arr(X, 3) > D(Str) Then D(Str) = Arr(X, 3)
    Next X
  Next K
  Ar = Application.Transpose(Array(D.keys, D.items))
  ReDim Cr(1 To UBound(Ar), 1 To 3)
  For X = 1 To UBound(Ar)
    Cr(X, 1) = Split(Ar(X, 1), "-")(0)
    Cr(X, 2) = Split(Ar(X, 1), "-")(1)
    Cr(X, 3) = Ar(X, 2)
  Next X
  With Sheet2
    .Cells(1, 1).Resize(UBound(Ar), 3) = Cr
  End With
End Sub

工作簿1.rar

18.59 KB, 下载次数: 7

回复

使用道具 举报

 楼主| 发表于 2022-6-17 07:34 | 显示全部楼层
hasyh2008 发表于 2022-6-16 18:58
Sub tt()
  On Error Resume Next
  Dim K%, X%, Str$

感谢hasyh2008,就是这个效果,非常感谢
回复

使用道具 举报

发表于 2022-6-17 12:02 | 显示全部楼层
gemeng25569 发表于 2022-6-17 07:34
感谢hasyh2008,就是这个效果,非常感谢

认为适合就选为最佳答案,建议数据不要放在原来表格.
回复

使用道具 举报

 楼主| 发表于 2022-7-14 10:00 | 显示全部楼层
本帖最后由 gemeng25569 于 2022-7-14 10:38 编辑
hasyh2008 发表于 2022-6-16 18:58
Sub tt()
  On Error Resume Next
  Dim K%, X%, Str$
好了

回复

使用道具 举报

 楼主| 发表于 2022-7-14 16:01 | 显示全部楼层
hasyh2008 发表于 2022-6-17 12:02
认为适合就选为最佳答案,建议数据不要放在原来表格.

你好!hasyh2008,

引用这段代码出现另一个问题

比如当Sheet2有100条历史数据时,sheet1有20条新数据,代码运行后会把Sheet2中20条数据给覆盖掉

我的目的是,Sheet2里的数据是历史保存数据,当Shee1数据有新数据就添加,如果有相同人员出现时就更新一下日期

还希望你帮忙看看
回复

使用道具 举报

发表于 2022-7-14 21:04 | 显示全部楼层
所以不要在原表格中修改数据,要把数据放到新工作表中。
回复

使用道具 举报

发表于 2022-7-14 21:21 | 显示全部楼层
Sub tt()
   On Error Resume Next
   Dim K%, X%, Str$
   Dim Arr, Ar, Cr()
   Dim D
   Set D = CreateObject("scripting.dictionary")
   For K = 1 To 2
     Arr = Sheets(K).Range("A1").CurrentRegion
     For X = 1 To UBound(Arr)
       Str = Arr(X, 1) & "-" & Arr(X, 2)
       If Arr(X, 3) > D(Str) Then D(Str) = Arr(X, 3)
     Next X
   Next K
   Ar = Application.Transpose(Array(D.keys, D.items))
   ReDim Cr(1 To UBound(Ar), 1 To 3)
   For X = 1 To UBound(Ar)
     Cr(X, 1) = Split(Ar(X, 1), "-")(0)
     Cr(X, 2) = Split(Ar(X, 1), "-")(1)
     Cr(X, 3) = Ar(X, 2)
   Next X
   With Sheet3
     .Cells(1, 1).Resize(UBound(Ar), 3) = Cr
   End With
End Sub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 14:03 , Processed in 0.517630 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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