Excel精英培训网

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

[已解决]忽略空值限制性跑动

[复制链接]
发表于 2015-3-14 05:52 | 显示全部楼层 |阅读模式
本帖最后由 张雄友 于 2015-3-14 20:39 编辑

实际工作中,假设有 N 笔钱,其中有数笔钱是不能动的,只能动用其中几笔钱,就是附件这个意思。
就是对选中区域,对局部单元格实施限制性避免入侵。说得明白一点就是:有一群坏人,哪些能动,哪些不能动。
真正要做的是忽略空值,不要让“敌人”进入防区。请看!在规定范围内,不管你怎么动,有些地方就是不能动!

最佳答案
2015-3-14 10:28
  1. Sub Macro1()
  2. Dim w, ww, rng As Range, i&, s&, n&
  3. Set rng = [a1:e10]
  4. ReDim w(1 To rng.Count)
  5. For i = 1 To rng.Count '赋值一维数组
  6.     If rng(i) <> "" Then
  7.         s = s + 1
  8.         w(s) = rng(i)
  9.     End If
  10. Next
  11. ReDim ww(1 To s)
  12. For i = 0 To s - 1 '一维数组随机抽取
  13.     n = s - i
  14.     y = Int(Rnd * n + 1)
  15.     ww(i + 1) = w(y)
  16.     w(y) = w(n)
  17. Next
  18. s = 0
  19. For i = 1 To rng.Count '打乱后的数组赋值单元格
  20.     If rng(i) <> "" Then
  21.         s = s + 1
  22.         rng(i) = ww(s)
  23.     End If
  24. Next
  25. End Sub
复制代码

忽略空值乱序针对空值论事.rar

8.98 KB, 下载次数: 12

 楼主| 发表于 2015-3-14 06:51 | 显示全部楼层
说得再白一点就是:空值代表座位,是留给市长,和局长之类的子女坐的,其它人不能坐,如果你想换座位,只能跟其它人换,指定(空值)座位就是不能坐。的意思!!!!
回复

使用道具 举报

发表于 2015-3-14 10:28 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim w, ww, rng As Range, i&, s&, n&
  3. Set rng = [a1:e10]
  4. ReDim w(1 To rng.Count)
  5. For i = 1 To rng.Count '赋值一维数组
  6.     If rng(i) <> "" Then
  7.         s = s + 1
  8.         w(s) = rng(i)
  9.     End If
  10. Next
  11. ReDim ww(1 To s)
  12. For i = 0 To s - 1 '一维数组随机抽取
  13.     n = s - i
  14.     y = Int(Rnd * n + 1)
  15.     ww(i + 1) = w(y)
  16.     w(y) = w(n)
  17. Next
  18. s = 0
  19. For i = 1 To rng.Count '打乱后的数组赋值单元格
  20.     If rng(i) <> "" Then
  21.         s = s + 1
  22.         rng(i) = ww(s)
  23.     End If
  24. Next
  25. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
张雄友 + 6 区域太大怎么会很慢?

查看全部评分

回复

使用道具 举报

发表于 2015-3-14 21:24 | 显示全部楼层
dsmch 发表于 2015-3-14 10:28

区域大的话,直接赋值数组,然后把二维数组转化为一维数组

评分

参与人数 1 +6 收起 理由
张雄友 + 6 这个不会。

查看全部评分

回复

使用道具 举报

发表于 2015-3-15 07:06 | 显示全部楼层
  1. Sub Macro1()
  2. Dim w, ww, arr, i&, j%, s&, n&
  3. arr = [a1:e10]
  4. ReDim w(1 To UBound(arr) * UBound(arr, 2))
  5. For i = 1 To UBound(arr)
  6.     For j = 1 To UBound(arr, 2)
  7.         If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
  8.     Next
  9. Next
  10. ReDim ww(1 To s)
  11. For i = 0 To s - 1 '一维数组随机抽取
  12.     n = s - i
  13.     y = Int(Rnd * n + 1)
  14.     ww(i + 1) = w(y)
  15.     w(y) = w(n)
  16. Next
  17. s = 0
  18. For i = 1 To UBound(arr)
  19.     For j = 1 To UBound(arr, 2)
  20.         If arr(i, j) <> "" Then s = s + 1: arr(i, j) = ww(s)
  21.     Next
  22. Next
  23. [a1:e10] = arr
  24. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
张雄友 + 6 太强大了。

查看全部评分

回复

使用道具 举报

发表于 2015-3-15 17:56 | 显示全部楼层
张雄友,经测试,我在EH发的代码,速度更快。呵呵。

评分

参与人数 1 +6 收起 理由
张雄友 + 6 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 10:20 , Processed in 0.294687 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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