Если я правильно понимаю, вы беспокоитесь, что идентификатор, скажем, вы создаете в строке N, совпадает с тем, который вы создали для одной из строк в диапазоне от 2 до N-1.
Я не знаю функции VBA, которая сообщит, соответствует ли значение или не соответствует любому значению в диапазоне. Вы используете MAC, пока я использую ПК, но я сомневаюсь, что это имеет значение.
Вы ищете таблицу из пяти столбцов. У вас должно быть несколько строк, например Max. Вы хотите, чтобы строка 1 удерживала линию заголовка. Вы говорите, что знаете, как создавать случайные значения для каждого столбца.
Я знаю, что существуют небольшие различия между MAC и ПК 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
, которая возвращала случайное значение подходит для столбца 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
Приведенный выше код набирался прямо в ответ и не испытывалась. Я не вижу никаких синтаксических ошибок, но никаких обещаний. Вернись, если я допустил ошибку, которую ты не можешь исправить.
Надеюсь, это даст вам некоторые идеи.
Пожалуйста, покажите нам шаги, которые вы сделали до сих пор. Для начала попробуйте записать макрос и показать и объяснить нам, что именно было сделано с вашей стороны. :) – Manhattan
Я знаю, что это норма здесь, но в этом случае я действительно не имел ничего общего с этим. – Wingdom