Excel精英培训网

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

VBA代码调试

[复制链接]
发表于 2020-1-8 11:42 | 显示全部楼层 |阅读模式
本帖最后由 heftyguy 于 2020-1-8 13:30 编辑

无重复抽样代码报错,欢迎大家指正。
Sub sample()


Dim pl As Integer
Dim yb As Integer
Dim p As Integer
Dim i As Integer
Dim j As Integer
Dim N As Integer
pl = InputBox("批量", "输入")
p = InputBox("比例(%)", "抽样")
yb = pl * p / 100
yb = Round(yb, 0)

'输入产品编号及随机数
N = 2: i = 1
Do

Sheet1.Cells(N, 1) = i
Sheet1.Cells(N, 2) = Rnd
N = N + 1: i = i + 1

Loop Until i > pl   'MsgBox (Range("B" & CStr(N)))

'同名排序及不同名排序
N = N - 1
M = 2: i = 1
Do

Sheet1.Cells(M, 3) = WorksheetFunction.Rank(Sheet1.Cells(M, 2), Range("B2", "B" & CStr(N)), 1) '同名次序
Sheet1.Cells(M, 4) = WorksheetFunction.Rank(Sheet1.Cells(M, 2), Range("B2", "B" & CStr(N)), 1) + WorksheetFunction.CountIf(Range("B2", "B" & CStr(M)), "B" & CStr(M)) - 1 '不同名次序,但似乎countif()不工作


M = M + 1

Loop Until i > pl

'按照不同名次序结果升序,但没有运行
ActiveWorkbook.Worksheets("sample").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("sample").Sort.SortFields.Add2 Key:=Range("D2", "D" & CStr(N)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("sample").Sort
        .SetRange Range("A1", "D" & CStr(N))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With


'输出抽样结果
j = 1: M = 2
Do

Sheet1.Cells(M, 7) = Sheet1.Cells(M, 1)
Sheet1.Cells(M, 8) = Sheet1.Cells(M, 4)
M = M + 1: j = j + 1

Loop Until j > yb


End Sub


界面

界面

抽样.zip

21.2 KB, 下载次数: 3

源文件

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2020-1-8 11:47 | 显示全部楼层
比如:样本量50,抽样比例20%,抽取10个
回复

使用道具 举报

发表于 2020-1-8 11:53 | 显示全部楼层
没有文件调试不了,也看不懂你说的抽样具体是什么意思。
抽样五花八门!
回复

使用道具 举报

 楼主| 发表于 2020-1-8 12:02 | 显示全部楼层
文件界面就是上传的图片,Sheet1,
回复

使用道具 举报

 楼主| 发表于 2020-1-8 13:32 | 显示全部楼层
hfwufanhf2006 发表于 2020-1-8 11:53
没有文件调试不了,也看不懂你说的抽样具体是什么意思。
抽样五花八门!

传EXCEL提示不能上传,压缩包上传可以了。
回复

使用道具 举报

发表于 2020-1-8 14:46 | 显示全部楼层
heftyguy 发表于 2020-1-8 13:32
传EXCEL提示不能上传,压缩包上传可以了。

你这个代码在工作表函数那里就不对了,提示“不能获取rank属性”。我对工作表函数不熟,平时也不怎么用,没办法确定是什问题;我测试了,如果把工作表函数的两行代码注释掉,程序就进入了死机状态,无法确认是死循环还是其他问题,显示“excel未响应”,只能强制中断;
所以我觉得你这个代码不能用。
回复

使用道具 举报

 楼主| 发表于 2020-1-8 14:53 | 显示全部楼层
可以运行的,
111111.png
回复

使用道具 举报

发表于 2020-1-8 15:16 | 显示全部楼层

可能是版本差异,我是2016版。如果是版本差异,我还是认为这个代码不可靠。不管怎么说,不能因为版本就出现死机的状态。既然是使用了工作表函数,可以把使用工作表函数的那部分手工来操作;
其他的地方,因为我电脑上不能运行,无法观察哪里有问题,我试过多次了,都是死机;
回复

使用道具 举报

发表于 2020-1-8 15:29 | 显示全部楼层
尽量保持原貌修改。
  1. Sub sample()

  2. Dim pl As Integer
  3. Dim yb As Integer
  4. Dim p As Integer
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim N As Integer
  8. pl = InputBox("sample", "enter")
  9. p = InputBox("%", "sample")
  10. yb = pl * p / 100
  11. yb = Round(yb, 0)
  12. Randomize

  13. N = 2: i = 1
  14. Do

  15. Sheet1.Cells(N, 1) = i
  16. Sheet1.Cells(N, 2) = Rnd
  17. N = N + 1: i = i + 1

  18. Loop Until i > pl

  19. N = N - 1
  20. m = 2: i = 1
  21. Do

  22. Sheet1.Cells(m, 3) = WorksheetFunction.Rank(Sheet1.Cells(m, 2), Range("B2", "B" & CStr(N)), 1)
  23. Sheet1.Cells(m, 4) = WorksheetFunction.Rank(Sheet1.Cells(m, 2), Range("B2", "B" & CStr(N)), 1) + WorksheetFunction.CountIf(Range("B2", "B" & CStr(m) - 1), Range("B" & CStr(m)))


  24. m = m + 1

  25. Loop Until m > pl + 1

  26. Sheet1.Range("a2:d" & pl + 1).Sort [d2]


  27. j = 1: m = 2
  28. Do

  29. Sheet1.Cells(m, 7) = Sheet1.Cells(m, 1)
  30. Sheet1.Cells(m, 8) = Sheet1.Cells(m, 4)
  31. m = m + 1: j = j + 1

  32. Loop Until j > yb


  33. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2020-1-8 15:45 | 显示全部楼层
大灰狼1976 发表于 2020-1-8 15:29
尽量保持原貌修改。

代码保持了原貌,测试通过,强!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:14 , Processed in 0.379381 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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