ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 张雄友

[求助] 香川随机乱序在会计上的广泛应用!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-15 15:04 | 显示全部楼层
显然必须由我亲自出马:
  1. Sub kagawa_Rnd多列乱序() '忽略空白单元格的香川随机乱序[数组洗牌法]
  2.     Dim ar, br, cr&(), i&, j&, k&, m&, n&, r&, t&
  3.    
  4.     ar = [a1:g12] '源数据读入数组ar
  5.     br = ar '复制为要随机乱序的结果数组br
  6.    
  7.     m = UBound(ar): n = UBound(ar, 2) '得到行数m 列数n
  8.     ReDim cr&(m * n, 2) '定义存放随机位置的临时数组cr
  9.     '数组cr有3列 分别为: 非空白序号k 行位置i 列位置j
  10.    
  11.     '下面整理原始数据 得到非空白单元格的 序号k 行位置i 列位置j
  12.     For i = 1 To m
  13.       For j = 1 To n
  14.         If ar(i, j) <> "" Then
  15.           cr(k, 0) = k: cr(k, 1) = i: cr(k, 2) = j: k = k + 1
  16.         End If
  17.       Next
  18.     Next
  19.    
  20.     '接下来开始随机乱序
  21.     Randomize
  22.     For i = 0 To k - 1
  23.       r = Int(Rnd * (k - i)) + i '[数组洗牌法]不重复随机乱序
  24.       t = cr(r, 0): cr(r, 0) = cr(i, 0): cr(i, 0) = t '[数组洗牌法]交换
  25.       br(cr(i, 1), cr(i, 2)) = ar(cr(t, 1), cr(t, 2)) '本次随机乱序结果 赋值到数组br
  26.     Next
  27.    
  28.     '随机乱序完成 输出数组br结果到工作表
  29.     [j1].Resize(m, n) = br
  30. End Sub

复制代码

忽略空值乱序.rar

9.65 KB, 下载次数: 97

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-15 15:12 | 显示全部楼层
香川群子 发表于 2015-3-15 15:04
显然必须由我亲自出马:

第29句,在原地乱,不是更好![a1:g12] = br

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-15 15:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
应用,至少我是这样理解的(Mark):
(1)实际工作中,假设有 N 笔钱,其中有数笔钱是不能动的,只能动用其中几笔钱
(2)有一群坏人,哪些能动,哪些不能动。
(3) 在对抗敌特分子行动中,不要让“敌人”进入防区 ,保护司令。
(4) 此座位是留给市长,和局长之类的子女坐的,其它人不能坐,如果你想换座位,只能跟其它人换


Sub kagawa_Rnd多列乱序() '忽略空白单元格的香川随机乱序[数组洗牌法]
    Dim ar, br, cr&(), i&, j&, k&, m&, n&, r&, t&

    ar = [a1:g12] '源数据读入数组ar
    br = ar '复制为要随机乱序的结果数组br

    m = UBound(ar): n = UBound(ar, 2) '得到行数m 列数n
    ReDim cr&(m * n, 2) '定义存放随机位置的临时数组cr
    '数组cr有3列 分别为: 非空白序号k 行位置i 列位置j

    '下面整理原始数据 得到非空白单元格的 序号k 行位置i 列位置j
    For i = 1 To m
      For j = 1 To n
        If ar(i, j) <> "" Then
          cr(k, 0) = k: cr(k, 1) = i: cr(k, 2) = j: k = k + 1
        End If
      Next
    Next

    '接下来开始随机乱序
    Randomize
    For i = 0 To k - 1
      r = Int(Rnd * (k - i)) + i '[数组洗牌法]不重复随机乱序
      t = cr(r, 0): cr(r, 0) = cr(i, 0): cr(i, 0) = t '[数组洗牌法]交换
      br(cr(i, 1), cr(i, 2)) = ar(cr(t, 1), cr(t, 2)) '本次随机乱序结果 赋值到数组br
    Next

    '随机乱序完成 输出数组br结果到工作表
    [j1].Resize(m, n) = br
End Sub


TA的精华主题

TA的得分主题

发表于 2015-3-15 15:20 | 显示全部楼层
按f9简单地计算,如何:

忽略空值乱序-h.rar

7.95 KB, 下载次数: 9

点评

谢谢,不是此意。  发表于 2015-3-15 15:21

TA的精华主题

TA的得分主题

发表于 2015-3-15 18:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2015-3-15 15:04
显然必须由我亲自出马:

能否单列乱序呢,即各列在各列乱序。

TA的精华主题

TA的得分主题

发表于 2015-3-15 20:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yzyyyyyyy 发表于 2015-3-15 18:50
能否单列乱序呢,即各列在各列乱序。

1. 选择单列范围执行宏,即可得到单列的随机乱序结果。

2. 如果需要同时对多列,或多行内容进行各自分开的随机乱序,那么只要代码加入按列或按行的循环操作即可。

TA的精华主题

TA的得分主题

发表于 2015-3-15 20:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 maditate 于 2015-3-15 20:35 编辑
香川群子 发表于 2015-3-15 20:27
1. 选择单列范围执行宏,即可得到单列的随机乱序结果。

2. 如果需要同时对多列,或多行内容进行各自分 ...


何必如此麻烦呢,转为一列,逢空不动,乱序再转二维。张雄友的思维实在不敢恭维。

点评

呵呵,这一次你误会张雄友了。是另有一个新手的提问。  发表于 2015-3-15 20:42
呵呵,令你费神了。  发表于 2015-3-15 20:36

TA的精华主题

TA的得分主题

发表于 2015-3-15 20:34 来自手机 | 显示全部楼层
香川群子 发表于 2015-3-15 20:27
1. 选择单列范围执行宏,即可得到单列的随机乱序结果。

2. 如果需要同时对多列,或多行内容进行各自分 ...


第2个,对某一区域,按列或行随机乱序,能有个例子吗

TA的精华主题

TA的得分主题

发表于 2015-3-15 20:44 | 显示全部楼层
maditate 发表于 2015-3-15 20:33
何必如此麻烦呢,转为一列,逢空不动,乱序再转二维。张雄友的思维实在不敢恭维。

请仔细看一下我的代码。事实上操作比一般想象的要复杂一些。

但是,我的代码运算效率是最高的。不信,你可以自己另写代码来测试,比较。

TA的精华主题

TA的得分主题

发表于 2015-3-15 20:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
张雄友 发表于 2015-3-15 15:19
应用,至少我是这样理解的(Mark):
(1)实际工作中,假设有 N 笔钱,其中有数笔钱是不能动的,只能动用其 ...

如果是这样考虑的话,
只要把代码中 If ar(i, j) <> "" Then 这一个条件判断句的条件作变更,
就能适应更多种类型。

比如,If ar(i, j) > 30000 Then ……值大于3万
或  If ar(i, j) Like "A*" Then ……以A开头的字符串
甚至于 If Cells(i, j).Interior.ColorIndex = 6 Then ……黄色单元格。
……
呵呵。



点评

http://club.excelhome.net/thread-1191575-6-2.html  发表于 2015-3-17 18:05
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-5 04:51 , Processed in 0.045436 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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