Excel精英培训网

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

[已解决]用数组编的汇总表筛选后更新出错

[复制链接]
发表于 2016-5-29 09:17 | 显示全部楼层 |阅读模式
本帖最后由 bb75308973 于 2016-5-29 16:15 编辑

我这个表里的第一个表是汇总表
每次切换到汇总表的时候 其它分表里的数据会更新到汇总表里来
为了加快速度 我用的数组来编的
但是有个问题就是
如果汇总表里我做一个筛选的话 然后再更新就会乱
所以我又在代码里加了一条 判断是否有筛选 每次更新前把筛选状态取消
但是这样很不方便 要重新筛选太麻烦 现在数据还少 当数据多的时候会想死的
所以请大神帮帮忙
1 如果不取消筛选 能不能更新不乱
2 或者更新前可以取消筛选,但是要在更新后又自动筛选到更新前的筛选项

订单进度表.rar (113.81 KB, 下载次数: 7)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-5-29 11:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 老司机带带我 于 2016-5-29 11:30 编辑

用数组逐个赋值,不要直接将数组赋值到单元格区域:
另外,n = zb.Range("a65536").End(xlUp).Row当存在筛选状态时这个值你可以测试一下也并不是你想的那个值!另外你超链接的那个循环也可以放到赋值的循环中去,这样可以少一个FOR循环,这个你自己看下吧!


  1. Private Sub Worksheet_Activate()
  2. Dim x As Integer
  3. Dim y As Integer
  4. Dim n As Integer
  5. Dim n1 As Integer
  6. Dim zb As Worksheet
  7. Dim fb As Worksheet
  8. Dim i As Integer
  9. Dim rg As Range
  10. Dim arr1(1 To 10000, 1 To 12), arr2()
  11. Application.ScreenUpdating = False
  12. Set zb = Sheets("订单汇总")
  13. n = zb.Range("a65536").End(xlUp).Row
  14. 'MsgBox n
  15. 'If n > 2 Then zb.Range("A3:L" & n).ClearContents
  16. zb.Range("A3:L65536").ClearContents
  17. For i = 2 To Sheets.Count
  18.     Set fb = Sheets(i)
  19.     If fb.Name <> "基础数据" And fb.Name <> "未完成订单汇总" And fb.Name <> "订单模板" And fb.Name <> "信息汇总" Then
  20.         n1 = fb.Range("a65536").End(xlUp).Row '计算分表的行数
  21.         If n1 = 6 Then GoTo 100 '分表没有内容自动跳过去
  22.         arr2 = fb.Range("A2:J" & n1) '将分表生成数组2
  23.         For y = 6 To UBound(arr2) '分表循环
  24.             If arr2(y, 10) <> "取消" Then
  25.             x = x + 1
  26.             arr1(x, 1) = arr2(1, 10)
  27.             arr1(x, 2) = arr2(y, 1)
  28.             arr1(x, 3) = arr2(y, 2)
  29.             arr1(x, 4) = arr2(y, 3)
  30.             arr1(x, 5) = arr2(2, 4)
  31.             arr1(x, 6) = arr2(2, 6)
  32.             arr1(x, 7) = arr2(y, 4)
  33.             If arr2(2, 8) = "" Then
  34.                 arr1(x, 8) = ""
  35.                 arr1(x, 9) = "交期未定"
  36.             Else
  37.                 arr1(x, 8) = arr2(2, 8)
  38.                 arr1(x, 9) = arr2(2, 8) - Date
  39.             End If
  40.             arr1(x, 10) = arr2(y, 4) - arr2(y, 9)
  41.             If arr1(x, 10) < 0 Or arr1(x, 10) = 0 Then
  42.                 arr1(x, 10) = 0
  43.                 arr1(x, 11) = "已完成"
  44.                 arr1(x, 9) = ""
  45.             Else
  46.                 arr1(x, 11) = "未完成"
  47.             End If
  48.             arr1(x, 12) = arr2(3, 10)
  49.             End If
  50.         Next y '分表循环结束
  51.     End If
  52. 100: Next i
  53. If x = 0 Then Exit Sub
  54. For i = 1 To x
  55.     For j = 1 To 12
  56.         zb.Cells(i + 2, j) = arr1(i, j)
  57.     Next
  58. Next
  59. For d = 3 To x + 2
  60.     zb.Range("A" & d).Hyperlinks.Add zb.Range("A" & d), "", "'" & zb.Range("A" & d).Value & "'!A1"
  61. Next d
  62. Application.ScreenUpdating = True
  63. Beep
  64. End Sub

  65. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  66. If Target.Column > 1 Then
  67.     'Cells(1, 1).Select
  68. End If
  69. End Sub
复制代码
回复

使用道具 举报

发表于 2016-5-29 11:52 | 显示全部楼层
您这样设计一订单一工作表的方法是很不可取的,订单多了,你一个工作簿就有很多工作表,此法不可取。
建议,你设计一个订单输入的输入窗体,便于输入订单,建立一个工作表为订单(就是你的汇总表),从窗体中直接输入到总表中,如果需要打印订单,可以设置一个订单的模板,想打哪个订单就打印哪个订单。
这样,表格就直观多了。
个人建议,供参考
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 07:21 , Processed in 0.220909 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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