Страницы: 1
RSS
VBA Сумма первых трех цифр числа равна сумме последних трех цифр этого числа
 
Добрый день.
Если подобное уже было, очень прошу направить в соответствующую тему, т.к. не представляю как искать.
Только осваиваю vba. Вот возникла задача составлять список из 100 рандомных значений, находящихся в диапазоне от 000 000 до 999 999, так чтобы сумма первых трех цифр числа = последним трем цифрам числа, а-ля счастливый билетик, типа 192 435
Буду очень благодарна за толчок в нужном направлении)
 
Тут тема "счастливых билетов" раскрыта чуть более чем полностью: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=932580&msg=15179128
 
Ради собственного интереса помудрил тут, наколупал всякой формулятины, но вроде все нюансы учел ))
 
собственно, вариант на VBA

Код

Sub Test()
    Dim r, j, k
    Dim Arr(1 To 999, 1 To 2)
    Dim arrList()
    Dim arrResult(1 To 100)
    
    For r = 1 To 999
        Arr(r, 1) = Right("00" & r, 3)
        Arr(r, 2) = Int(Mid(Arr(r, 1), 1, 1)) + Int(Mid(Arr(r, 1), 2, 1)) + Int(Mid(Arr(r, 1), 3, 1))
    Next
    
    j = 0
    For r = 1 To 999
        For k = 1 To 999
            If Arr(r, 2) = Arr(k, 2) Then
                ReDim Preserve arrList(j)
                arrList(j) = Arr(r, 1) & Arr(k, 1)
                j = j + 1
            End If
        Next k
    Next r
    
    For r = 1 To 100
        arrResult(r) = arrList(WorksheetFunction.RandBetween(LBound(arrList), UBound(arrList)))
    Next r
End Sub

 
Казанский, мерси за ссыль
GeorgeDark, это мощно, никогда бы так формулами не сделала
webley, спасибо большое, прям то, что надо
 
Реализация в виде функции на VBA
Можно задавать размерность счастливого билета числом n (по умолчанию берется значение 3)
Сгенерируется 2n-значный билет, где сумма первых n цифр равна сумме последних n цифр.

Работает быстро, нет необходимости использовать массивы и генерировать все счастливые билеты:
Код
Function LuckyTicket$(Optional n& = 3)
    Dim i&, s&, m&, mMin&, mMax&
    Randomize
    For i = 1 To n
        m = Int(Rnd * 10)
        s = s + m
        LuckyTicket = LuckyTicket & m
    Next i
    For i = 1 To n
        mMin = s - (n - i) * 9
        If mMin < 0 Then mMin = 0
        mMax = IIf(s > 9, 9, s)
        m = Int(Rnd * (mMax - mMin + 1) + mMin)
        s = s - m
        LuckyTicket = LuckyTicket & m
    Next i
End Function


использовать можно следующим образом:
Код
Sub main()
    Dim i&, arr(1 To 100)
    For i = 1 To 100
        arr(i) = LuckyTicket()
    Next i
End Sub
Страницы: 1
Наверх