Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: zaq123

菜鸟自动分配问题,请大家帮忙,谢谢

[复制链接]
 楼主| 发表于 2011-7-26 11:43 | 显示全部楼层
本帖最后由 zaq123 于 2011-7-26 11:47 编辑

测试了一下,满足大部分需要,兰版一出手就是不一样。思维真敏捷。

如果可能,有没有函数版本的方法,{:812:}有点贪心。见谅。


还有几个小问题
当C65=1252602.64        D65=112546.88        E65=1634850.48
运算此代码(添加= Round(Rnd() * 0.03),4)时,会生成0.000的比率,且J62会出现负数。
还请兰版帮忙修改一下代码,谢谢
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2011-7-26 12:55 | 显示全部楼层
Sub 分配()
Range("l2:n62") = ""
Dim d As New Dictionary
Dim rg As Range
Dim x, K1, K2, K3
For x = 2 To 61
100:
  K1 = Round(Rnd() * 0.03, 4)
   If d.Exists(K1) Or K1 = 0 Then GoTo 100
   Cells(x, "l") = K1
   
200:
     K2 = Round(Rnd() * 0.03, 4)
   If d.Exists(K2) Or K2 = 0 Then GoTo 200
     Cells(x, "m") = K2
     
300:
    K3 = Round(Rnd() * 0.03, 4)
   If d.Exists(K3) Or K3 = 0 Then GoTo 300
   Cells(x, "n") = K3
   
  If Cells(x, "k") < 0 Or Cells(x, "k") > 1000000 Then GoTo 100
Next x
Range("l62") = -[l64]
Range("M62") = -[M64]
Range("N62") = -[N64]


End Sub
回复

使用道具 举报

发表于 2011-7-26 12:55 | 显示全部楼层
Sub 分配()
Range("l2:n62") = ""
Dim d As New Dictionary
Dim rg As Range
Dim x, K1, K2, K3
For x = 2 To 61
100:
  K1 = Round(Rnd() * 0.03, 4)
   If d.Exists(K1) Or K1 = 0 Then GoTo 100
   Cells(x, "l") = K1
   
200:
     K2 = Round(Rnd() * 0.03, 4)
   If d.Exists(K2) Or K2 = 0 Then GoTo 200
     Cells(x, "m") = K2
     
300:
    K3 = Round(Rnd() * 0.03, 4)
   If d.Exists(K3) Or K3 = 0 Then GoTo 300
   Cells(x, "n") = K3
   
  If Cells(x, "k") < 0 Or Cells(x, "k") > 1000000 Then GoTo 100
Next x
Range("l62") = -[l64]
Range("M62") = -[M64]
Range("N62") = -[N64]


End Sub
回复

使用道具 举报

 楼主| 发表于 2011-7-26 14:25 | 显示全部楼层
当C65=1252602.64        D65=112546.88        E65=1634850.48

J62还是会出现负数。
回复

使用道具 举报

发表于 2011-7-26 15:36 | 显示全部楼层
Sub 分配()
Range("l2:n62") = ""
Dim d As New Dictionary
Dim rg As Range
Dim x, K1, K2, K3, z1, z2, z3, k
For x = 2 To 61
z1 = (-[l64] / (62 - x)) * 2
z2 = (-[m64] / (62 - x)) * 2
z3 = (-[m64] / (62 - x)) * 2
k = 0
100:
  k = k + 1
  If k > 500 Then
   K1 = Round(Rnd() * ((Cells(x, "B") + Cells(x, "J")) - Cells(x, "H")) / Range("C65") * 3, 4)
  Else
   K1 = Round(Rnd() * z1, 4)
  End If
   If d.Exists(K1) Or K1 = 0 Then GoTo 100
   Cells(x, "l") = K1
   
200:
If k > 500 Then
   K2 = Round(Rnd() * ((Cells(x, "B") + Cells(x, "J")) - Cells(x, "H")) / Range("C65") * 3, 4)
  Else
   K2 = Round(Rnd() * z2, 4)
  End If
   If d.Exists(K2) Or K2 = 0 Then GoTo 200
     Cells(x, "m") = K2
     
300:
If k > 500 Then
   K3 = Round(Rnd() * ((Cells(x, "B") + Cells(x, "J")) - Cells(x, "H")) / Range("C65") * 3, 4)
  Else
   K3 = Round(Rnd() * z3, 4)
  End If
   If d.Exists(K3) Or K3 = 0 Then GoTo 300
   Cells(x, "n") = K3
   
  If Cells(x, "k") < 0 Or Cells(x, "k") > 1000000 Then GoTo 100
Next x
Range("l62") = -[l64]
Range("M62") = -[m64]
Range("N62") = -[N64]


End Sub
回复

使用道具 举报

 楼主| 发表于 2011-7-26 16:22 | 显示全部楼层
本帖最后由 zaq123 于 2011-7-26 16:23 编辑

当C65\D65\E65继续往大调整、J62还是会出现负数。
当C65\D65\E65继续往小调整、L、M、N列会出现负数。
应该改哪段代码?

也就是说C65\D65\E65,是可能进行变动的数。
回复

使用道具 举报

发表于 2011-7-26 17:43 | 显示全部楼层
你这个有点矛盾啊,如果数足够的大,前面的比率必然要非常的小才可能不出现负数,这样最后一个比率必然大,最后一个容易出现负数
回复

使用道具 举报

 楼主| 发表于 2011-7-26 19:16 | 显示全部楼层
如果说J列数值大的分配比率大些呢?

目前看来只要无底色单元格数据变动就可能产生负比率或者J列出现负数,如何避免呢?辛苦。
回复

使用道具 举报

 楼主| 发表于 2011-7-26 19:52 | 显示全部楼层
回复 兰色幻想 的帖子

如果说J列数值大的分配比率大些呢?

目前看来只要无底色单元格数据变动就可能产生负比率或者J列出现负数,如何避免呢?辛苦。


我太笨,刚会用这个回复功能。
回复

使用道具 举报

发表于 2011-7-26 20:05 | 显示全部楼层
你这个要求本来就矛盾,如果数足够大,比率就得足够小。都小了怎么还能凑够1呢?如果分配率大肯定出现负数了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:11 , Processed in 0.257015 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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