如果我理解正确,您会担心 ID,例如,您在 N 行生成的 ID 与您为 2 到 N-1 范围内的行之一生成的 ID 相同。
我不知道一个 VBA 函数会报告一个值是否匹配或不匹配范围内的任何值。当我使用 PC 时,您使用的是 MAC,但我怀疑这会有所不同。
你寻找一个五列的表。你必须记住很多行,比如 Max。您希望第 1 行保留标题行。你说你知道如何为每一列生成随机值。
我知道 MAC 和 PC VBA 之间存在细微差别,但我认为以下是常见的。
我会在数组中生成表格,这比访问工作表单元格要快得多。
Dim Rng as Range
Dim WkshtValue as Variant
With Worksheets("xxxx")
Set Rng = range of interest
WkshtValue = .Rng.Value
End With
以上将 WkshtValue 转换为所需大小的数组,并将感兴趣范围内的所有值复制到其中。因为 WkshtValue 是 Variant,所以数组中的条目将是字符串、整数、日期或它们在工作表中的任何内容。
无论工作表中范围的位置如何,这个数组都将是一个基于的,因此如果范围是基于一个的,它对我的大脑的伤害较小。
WkshtValue 的第一个维度用于行,第二个维度用于列。这不是正常的约定,但它意味着WkshtValue(Row, Col)
匹配.Cells(Row, Col).Value
。
做相反的事情稍微困难一些,但是您可以定义一个数组,用值填充它,然后将其写入工作表:
Dim Rng as Range
Dim WkshtValue() as Variant
ReDim WkshtValue(1 To Max + 1, 1 To 5)
' Fill row 1 - WkshtValue(1, 1) to WkshtValue(1, 5) - with the header row values.
' Fill rows 2 to Max+1 with appropriate randon values.
With Worksheets("xxxx")
Set Rng = .Range(.Cells(1, 1), .Cells(Max + 1, 5))
End With
Rng.Value = WkshtValue
我将编写一个RanVal(ColCrnt) As String
返回适合 column 的随机值的函数ColCrnt
。
然后我会有类似的东西:
For RowCrnt = 2 to Max + 1
For ColCrnt = 1 To 5
Do While True
ValPoss = RanVal(ColCrnt)
MatchFound = False
For RowTemp = 2 to RowCrnt - 1
If WkshtValue(RowTemp, ColCrnt) = ValPoss Then
MatchFound = True
Exit For
End If
Next
If Not MatchFound Then
Exit Do
End If
Loop
WkshtValue(RowCrnt, ColCrnt) = ValPoss
Next
Next
上面的代码直接输入到答案中,未经测试。我看不到任何语法错误,但没有任何承诺。如果我犯了你无法纠正的错误,请回来。
希望这能给你一些想法。