Excel精英培训网

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

[已解决]两张工作合并

[复制链接]
发表于 2017-8-21 18:21 | 显示全部楼层 |阅读模式
本帖最后由 清风竹影203 于 2017-8-24 18:22 编辑

求助高手,将SHEET2中的数据,按池号和对应的表头在SHEET1中更改,谢谢了!
最佳答案
2017-8-23 17:33
清风竹影203 发表于 2017-8-23 16:59
老师您好!经过昨天的测试,基本上能解决问题了,只是还有一个小毛病想请老师帮帮我,就是如何让sheet2中 ...
  1. Public Sub update()
  2.     Dim arr(), brr(), crr(), d, i, k, n
  3.     Set d = CreateObject("scripting.dictionary")
  4.    
  5.     arr = Sheet1.Range("a2:ar" & Sheet1.Range("a65536").End(3).Row) '有多少列就修改这行的ar所对应的那个最后列名,最后一列比如是as就ar修改成as,
  6.     brr = Sheet2.Range("a2:ar" & Sheet2.Range("a65536").End(3).Row) '同上
  7.    
  8.     ReDim crr(1 To UBound(brr, 2) - 1)
  9.    
  10.     For i = 1 To UBound(brr, 1) 'sheet2写入字典
  11.         
  12.         For n = 1 To (UBound(brr, 2) - 1) '装入字典的item数组
  13.             crr(n) = brr(i, n + 1)
  14.         Next n
  15.         
  16.         d(brr(i, 1)) = crr '写入字典
  17.         ReDim crr(1 To UBound(brr, 2) - 1) '清空数组
  18.     Next i
  19.    
  20.     For k = 1 To UBound(arr, 1) '更新数组
  21.         If d.exists(arr(k, 1)) Then
  22.             For n = 1 To (UBound(brr, 2) - 1)
  23.                 If Not VBA.IsEmpty(d(arr(k, 1))(n)) Then ' 添加判断,空值不写入数组
  24.                     arr(k, n + 1) = d(arr(k, 1))(n)
  25.                 End If
  26.             Next n
  27.         End If
  28.     Next k

  29.     Sheet1.[a2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr '写入



  30. End Sub
复制代码
应该可以了

求助.zip

7.73 KB, 下载次数: 13

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-8-21 18:57 | 显示全部楼层
不知道池号是不是唯一的,按池号做了个
  1. Public Sub update()
  2.     Dim arr(), brr(), d, i, k
  3.     Set d = CreateObject("scripting.dictionary")
  4.    
  5.     arr = Sheet1.Range("a2:d" & Sheet1.Range("d65536").End(3).Row)
  6.     brr = Sheet2.Range("a2:d" & Sheet2.Range("d65536").End(3).Row)
  7.    
  8.     For i = 1 To UBound(brr, 1) 'sheet2写入字典
  9.         d(brr(i, 1)) = Array(brr(i, 2), brr(i, 3), brr(i, 4))
  10.     Next
  11.    
  12.     For k = 1 To UBound(arr, 1) '更新数组
  13.         If d.exists(arr(k, 1)) Then
  14.             arr(k, 2) = d(arr(k, 1))(0)
  15.             arr(k, 3) = d(arr(k, 1))(1)
  16.             arr(k, 4) = d(arr(k, 1))(2)
  17.         End If
  18.     Next
  19.    
  20.     Sheet1.[a2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr '写入
  21.    
  22.             
  23.         
  24.    
  25. End Sub
复制代码
回复

使用道具 举报

发表于 2017-8-21 18:59 | 显示全部楼层
附件如下

求助.rar

15.64 KB, 下载次数: 6

回复

使用道具 举报

 楼主| 发表于 2017-8-21 21:16 | 显示全部楼层

谢谢老师的帮助,问题已经部分解决,池号是唯一的,还有就是SHEET1中的数据其实非常庞大,吨位后面还有四十几项的有关数据,池号更是有五千多个,都是唯一的,不会有重复编号的情况。sheet2中每天只有部分池号后面的数据更新,逐一填写非常麻烦,并且容易出错,还请老师能够彻底解决我的困扰。详见附件
再次表示感谢!

求助.zip

16.82 KB, 下载次数: 2

回复

使用道具 举报

发表于 2017-8-21 23:00 | 显示全部楼层
清风竹影203 发表于 2017-8-21 21:16
谢谢老师的帮助,问题已经部分解决,池号是唯一的,还有就是SHEET1中的数据其实非常庞大,吨位后面还有四 ...

改好了,可以支持很多列了

sheet1,sheet2结构要完全一样。比如列的顺序,第一行都是标题什么的

给你写好注释了,修改很容易

求助.rar

21.83 KB, 下载次数: 9

回复

使用道具 举报

 楼主| 发表于 2017-8-23 16:59 | 显示全部楼层
frankzhang21 发表于 2017-8-21 23:00
改好了,可以支持很多列了

sheet1,sheet2结构要完全一样。比如列的顺序,第一行都是标题什么的

老师您好!经过昨天的测试,基本上能解决问题了,只是还有一个小毛病想请老师帮帮我,就是如何让sheet2中的空格不影响sheet1中不需要更新的那些数据,因为sheet2中,没有变动的数据都是空格。(详见附件)
对您的帮助,再次表示感谢!

求助3.zip

31.6 KB, 下载次数: 3

回复

使用道具 举报

发表于 2017-8-23 17:33 | 显示全部楼层    本楼为最佳答案   
清风竹影203 发表于 2017-8-23 16:59
老师您好!经过昨天的测试,基本上能解决问题了,只是还有一个小毛病想请老师帮帮我,就是如何让sheet2中 ...
  1. Public Sub update()
  2.     Dim arr(), brr(), crr(), d, i, k, n
  3.     Set d = CreateObject("scripting.dictionary")
  4.    
  5.     arr = Sheet1.Range("a2:ar" & Sheet1.Range("a65536").End(3).Row) '有多少列就修改这行的ar所对应的那个最后列名,最后一列比如是as就ar修改成as,
  6.     brr = Sheet2.Range("a2:ar" & Sheet2.Range("a65536").End(3).Row) '同上
  7.    
  8.     ReDim crr(1 To UBound(brr, 2) - 1)
  9.    
  10.     For i = 1 To UBound(brr, 1) 'sheet2写入字典
  11.         
  12.         For n = 1 To (UBound(brr, 2) - 1) '装入字典的item数组
  13.             crr(n) = brr(i, n + 1)
  14.         Next n
  15.         
  16.         d(brr(i, 1)) = crr '写入字典
  17.         ReDim crr(1 To UBound(brr, 2) - 1) '清空数组
  18.     Next i
  19.    
  20.     For k = 1 To UBound(arr, 1) '更新数组
  21.         If d.exists(arr(k, 1)) Then
  22.             For n = 1 To (UBound(brr, 2) - 1)
  23.                 If Not VBA.IsEmpty(d(arr(k, 1))(n)) Then ' 添加判断,空值不写入数组
  24.                     arr(k, n + 1) = d(arr(k, 1))(n)
  25.                 End If
  26.             Next n
  27.         End If
  28.     Next k

  29.     Sheet1.[a2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr '写入



  30. End Sub
复制代码
应该可以了

求助3.rar

31.82 KB, 下载次数: 30

回复

使用道具 举报

 楼主| 发表于 2017-8-24 18:21 | 显示全部楼层
今天测试过后,没有问题,谢谢老师,以后再遇到难题还望您不吝赐教哦!
回复

使用道具 举报

 楼主| 发表于 2017-12-17 14:13 | 显示全部楼层

老师您好,非常感谢上次您对我的帮助,今天还要麻烦您一下,还是这张表,就是如何才能让sheet1中更改过的数据显示红色,目的是为了让发生变动后的数据更加醒目。
回复

使用道具 举报

发表于 2018-7-7 10:11 | 显示全部楼层
清风竹影203 发表于 2017-12-17 14:13
老师您好,非常感谢上次您对我的帮助,今天还要麻烦您一下,还是这张表,就是如何才能让sheet1中更改过的 ...

哈哈半年多了,不知道你的问题解决了没有。

好久没写VBA了,现在都用R了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 09:06 , Processed in 0.370482 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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