Как написать код VBA мне, который отображает 10 случайных чисел от 1 до 50 без повторения чисел

459
Mr Ashley

Как мне написать код VBA, который отображает 10 случайных чисел от 1 до 50 без повторения чисел?

-1
Добро пожаловать в Супер пользователя. Мы не сервис написания сценариев. Мы ожидаем, что пользователи сообщат нам, что они пробовали до сих пор (включая любые сценарии, которые они используют) и где они застряли, чтобы мы могли помочь с конкретными проблемами. Вопросы, которые задают только сценарии, слишком широки и, вероятно, будут [отложены или закрыты] (http://stackoverflow.com/help/closed-questions). Пожалуйста, прочитайте [Как мне задать хороший вопрос?] (Http://superuser.com/help/how-to-ask). DavidPostill 9 лет назад 1
Это домашнее задание? DavidPostill 9 лет назад 0

2 ответа на вопрос

0
Gary's Student

In B1 through B50 enter:

 =RAND() 

In A1 enter:

=MATCH(LARGE(B:B,ROW()),B:B,0) 

and copy down through A10:

enter image description here

Just write a short macro to insert the formulas. If you don't want to use the worksheet approach then:

Sub WillNotRepeat() Dim ndex(1 To 50) For I = 1 To 50 ndex(I) = I Next I Call Shuffle(ndex) For I = 1 To 10 msg = msg & ndex(I) & vbCrLf Next I MsgBox msg End Sub Public Sub Shuffle(InOut() As Variant) Dim I As Long, J As Long Dim tempF As Double, Temp As Variant Hi = UBound(InOut) Low = LBound(InOut) ReDim Helper(Low To Hi) As Double Randomize For I = Low To Hi Helper(I) = Rnd Next I J = (Hi - Low + 1) \ 2 Do While J > 0 For I = Low To Hi - J If Helper(I) > Helper(I + J) Then tempF = Helper(I) Helper(I) = Helper(I + J) Helper(I + J) = tempF Temp = InOut(I) InOut(I) = InOut(I + J) InOut(I + J) = Temp End If Next I For I = Hi - J To Low Step -1 If Helper(I) > Helper(I + J) Then tempF = Helper(I) Helper(I) = Helper(I + J) Helper(I + J) = tempF Temp = InOut(I) InOut(I) = InOut(I + J) InOut(I + J) = Temp End If Next I J = J \ 2 Loop End Sub 

enter image description here

0
jcbermu

Используя VBA:

Public Sub customRandom() Application.ScreenUpdating = False Dim wks As Worksheet Set wks = ActiveSheet wks.Rows.Clear totalNumbers = 10 minValue = 1 maxValue = 50 firstRow = 1 firstColumn = 1 Randomize Dim results() As Integer ReDim results(totalNumbers) For i = 1 To totalNumbers randoming = True While randoming notfound = True a = Int(Rnd() * maxValue) + minValue For j = 1 To totalNumbers If a = results(j) Then notfound = False j = totalNumbers End If Next j If notfound = True Then results(i) = a randoming = False wks.Cells(firstRow, firstColumn) = a firstRow = firstRow + 1 End If Wend Next i Application.ScreenUpdating = True End Sub 

Он заполнит ячейки от A1 до A10, но его можно легко изменить с помощью переменных firstRowи firstColumn.

Похожие вопросы