【发布时间】:2016-10-26 06:47:15
【问题描述】:
Excel VBA 编码有问题。
我想做一个编码可以在某些条件下将数据从一张表复制到一张表。我的数据格式为二进制。
sheet1 中的数据有将近一千行。我只想从 sheet1 到 sheet 2 中随机取 15 行数据。必须满足的条件是每列只有该列的总和为 3。如果不满足,将取其他数据。
当我点击生成时。它将从数据表 1 复制到表 2。我想要我的数据副本,如红色圆圈之一。不像红柱一。请帮帮我
Option Explicit
Sub Random20()
Randomize
Dim MyRows() As Integer
Dim numRows, percRows, nxtRow, nxtRnd, chkRnd, copyRow As Integer
'Determine Number of Rows in Sheet1 Column A
numRows = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
percRows = 17
ReDim MyRows(percRows)
'Create Random numbers and fill array
For nxtRow = 1 To percRows
getNew:
'Generate Random number
nxtRnd = Int((numRows) * Rnd + 1)
'Loop through array, checking for Duplicates
For chkRnd = 1 To nxtRow
'Get new number if Duplicate is found
If MyRows(chkRnd) = nxtRnd Then GoTo getNew
Next
'Add element if Random number is unique
MyRows(nxtRow) = nxtRnd
Next
'Loop through Array, copying rows to Sheet2
For copyRow = 1 To percRows
Sheets(1).Rows(MyRows(copyRow)).EntireRow.Copy _
Destination:=Sheets(2).Cells(copyRow, 1)
Next
End Sub
【问题讨论】:
-
你自己尝试过什么?向我们展示您迄今为止编写的任何代码,以便我们提供帮助。 SO 不是编码服务。
-
您希望所有列的总和为 3 吗?或任何单列?每行有多少列数据?我能想到的只是一个心理上很长的公式,用一个双重的 for next 循环来检查每一列的总数..
-
如果它是单列数据,那么我会
Dim ClmTtl As Integer并像你一样开始一个'for''next'循环,但在循环之前ClmTtl = 0然后循环每个行号添加值从该列到ClmTtl的每个单元格。在循环之后,您可以执行 if 来查看 value 是否 = 3,如果不是goto代码中的早期阶段,或者再次调用 sub 以重新启动它。 -
@Glitch_Doctor 是的。我想要所有列总计 3。你能告诉我代码吗? ?
-
嗯,这当然是可以实现的,但是对于多个列,代码将非常努力地工作,如果没有答案,它可能会无限循环。为了使代码保持完全随机,大多数结果不会在每列中为 3,因此将失败并重新开始,因此它是否必须是完全随机的,或者您是否可以考虑一些辅助代码,例如现在列的总数为 3,然后过滤剩余结果为 0 并改为搜索特殊单元格?只是因为代码执行得更快......