Excel精英培训网

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

[已解决]百感交集--忽略空值

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

百感交集--忽略空值,乱就是乱,但不是随机乱,是按行随机乱。
最佳答案
2015-3-17 20:21
  1. Sub dsmch()
  2. Dim arr, brr, w, ww, i&, s%, n2%
  3. arr = [a1:g12]: n2 = UBound(arr, 2)
  4. ReDim brr(1 To UBound(arr), 1 To n2)
  5. For i = 1 To UBound(arr)
  6.     ReDim w(1 To n2): ReDim ww(1 To n2): s = 0
  7.     For j = 1 To n2
  8.         If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
  9.     Next
  10.     If s = 0 Then Exit For
  11.     For k = 0 To s - 1
  12.         n = s - k
  13.         y = Int(Rnd * n + 1)
  14.         ww(k + 1) = w(y)
  15.         w(y) = w(n)
  16.     Next
  17.     s = 0
  18.     For j = 1 To n2
  19.         If arr(i, j) <> "" Then s = s + 1: brr(i, j) = ww(s)
  20.     Next
  21. Next
  22. [j1].Resize(UBound(brr), n2) = brr
  23. End Sub
复制代码

忽略空值按行.rar

10.62 KB, 下载次数: 14

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-3-17 20:17 | 显示全部楼层
用数组分别记录单元格名,和对应的数字,对数字乱序,单元格不乱。
回复

使用道具 举报

发表于 2015-3-17 20:21 | 显示全部楼层    本楼为最佳答案   
  1. Sub dsmch()
  2. Dim arr, brr, w, ww, i&, s%, n2%
  3. arr = [a1:g12]: n2 = UBound(arr, 2)
  4. ReDim brr(1 To UBound(arr), 1 To n2)
  5. For i = 1 To UBound(arr)
  6.     ReDim w(1 To n2): ReDim ww(1 To n2): s = 0
  7.     For j = 1 To n2
  8.         If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
  9.     Next
  10.     If s = 0 Then Exit For
  11.     For k = 0 To s - 1
  12.         n = s - k
  13.         y = Int(Rnd * n + 1)
  14.         ww(k + 1) = w(y)
  15.         w(y) = w(n)
  16.     Next
  17.     s = 0
  18.     For j = 1 To n2
  19.         If arr(i, j) <> "" Then s = s + 1: brr(i, j) = ww(s)
  20.     Next
  21. Next
  22. [j1].Resize(UBound(brr), n2) = brr
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2015-3-17 20:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2015-3-17 20:38 | 显示全部楼层
dsmch 发表于 2015-3-17 20:21

如果是按列乱时,不是换一下维度吗?行变列,列变行,但是怎么下标越界?

Sub dsmch()
Dim arr, brr, w, ww, i&, s%, n2%
arr = [a1:g12]: n2 = UBound(arr)
ReDim brr(1 To UBound(arr, 2), 1 To n2)
For i = 1 To UBound(arr, 2)
    ReDim w(1 To n2): ReDim ww(1 To n2): s = 0
    For j = 1 To n2
        If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
    Next
    If s = 0 Then Exit For
    For k = 0 To s - 1
        n = s - k
        y = Int(Rnd * n + 1)
        ww(k + 1) = w(y)
        w(y) = w(n)
    Next
    s = 0
    For j = 1 To n2
        If arr(i, j) <> "" Then s = s + 1: brr(i, j) = ww(s)
    Next
Next
[j1].Resize(n2, UBound(brr)) = brr
End Sub


回复

使用道具 举报

 楼主| 发表于 2015-3-17 20:38 | 显示全部楼层
朝露暮草 发表于 2015-3-17 20:34
哦,楼主说的这些平时很有帮助

是工作中用得到。
回复

使用道具 举报

发表于 2015-3-17 20:56 | 显示全部楼层
  1. Sub dsmch() '按列乱序
  2. Dim arr, brr, w, ww, i&, j%, s&, n1&
  3. arr = [a1:g12]: n1 = UBound(arr)
  4. ReDim brr(1 To n1, 1 To UBound(arr, 2))
  5. For j = 1 To UBound(arr, 2)
  6.     ReDim w(1 To n1): ReDim ww(1 To n1): s = 0
  7.     For i = 1 To n1
  8.         If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
  9.     Next
  10.     If s = 0 Then Exit For
  11.     For k = 0 To s - 1
  12.         n = s - k
  13.         y = Int(Rnd * n + 1)
  14.         ww(k + 1) = w(y)
  15.         w(y) = w(n)
  16.     Next
  17.     s = 0
  18.     For i = 1 To n1
  19.         If arr(i, j) <> "" Then s = s + 1: brr(i, j) = ww(s)
  20.     Next
  21. Next
  22. [j1].Resize(n1, UBound(brr, 2)) = brr
  23. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
张雄友 + 6 感谢帮助,身体健康。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-3-17 21:29 | 显示全部楼层
dsmch 发表于 2015-3-17 20:21

选择A:E整列时,怎么没有数据出来?

整列选择时.rar

252.83 KB, 下载次数: 1

回复

使用道具 举报

 楼主| 发表于 2015-3-17 22:07 | 显示全部楼层
dsmch 发表于 2015-3-17 20:21

当A11:G11 全是空时,J12:P12 会没有数据出来。


忽略空值按行2.rar

10.7 KB, 下载次数: 1

回复

使用道具 举报

发表于 2015-3-17 22:20 | 显示全部楼层
纠错处理出现错误,还是老实赋值数组吧
如果全为空,则循环下一步
  1. Sub dsmch按行乱()
  2. Dim arr, brr, w, ww, i&, s&, n2&
  3. arr = [a2:e50]: n2 = UBound(arr, 2)
  4. ReDim brr(1 To UBound(arr), 1 To n2)
  5. For i = 1 To UBound(arr)
  6.     ReDim w(1 To n2): ReDim ww(1 To n2): s = 0
  7.     For j = 1 To n2
  8.         If arr(i, j) <> "" Then s = s + 1: w(s) = arr(i, j)
  9.     Next
  10.     If s = 0 Then GoTo 100
  11.     For k = 0 To s - 1
  12.         n = s - k
  13.         y = Int(Rnd * n + 1)
  14.         ww(k + 1) = w(y)
  15.         w(y) = w(n)
  16.     Next
  17.     s = 0
  18.     For j = 1 To n2
  19.         If arr(i, j) <> "" Then s = s + 1: brr(i, j) = ww(s)
  20.     Next
  21. 100:
  22. Next
  23. [h:l] = ""
  24. [H2].Resize(UBound(brr), n2) = brr
  25. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
张雄友 + 6 这样,9楼问题就OK了。

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 07:31 , Processed in 1.950586 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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