Excel VBA Макросы: Добавить рандом

Автор Евгений, 13 ноября 2017, 23:28

Евгений

Здравствуйте!
Есть макрос который создает файлы 1,2,3 xlsx. Данные берет из файла построчно, то есть в созданном первом файле данные из строки 1, во втором из строки 2 и так далее (если запустите то увидите).
Вопрос. Как сделать чтоб все строки брались рандомно например в диапазоне от 1 до 100.

Я сам в макросах не силен, этот нашел на просторах интернета. Подскажите пож-та какую строчку каким кодом заменить.

[вложение удалено администратором]

Администратор

Здесь две процедуры, поместите их в один модуль. Запускайте процедуру "createFiles".

Макрос
Sub createFiles()

    Dim sh_src As Worksheet, sh_res As Worksheet, RandomRows As Collection
    Dim path As String, FN_folder As String
    Dim r As Long, i As Long
   
   
    '1. Отключения монитора, чтобы ускорить макрос и чтобы не мерцало.
    Application.ScreenUpdating = False
   
    '2. Настройка генератора случайных чисел, чтобы при каждом запуске макроса
        ' генерировалась разная последовательность чисел, а не одна и та же.
        ' Хотя я как-то заметил, что и без этой команды генерируются всегда разные.
        ' Пока не понял, что это было.
    Randomize
   
    '3. Запись в переменную пути, где находится файл с этим макросом.
    path = ThisWorkbook.path
   
    '4. Присваиваем листу-источнику имя "sh_src".
    Set sh_src = ThisWorkbook.Sheets(1)
   
    '5. Открытие файла-шаблона и присваиваем первому листу имя "sh_res".
    Set sh_res = Workbooks.Open(path & "\шаблон.xlsx").Worksheets(1)
   
    '6. Установка пароля на лист.
        ' UserInterfaceOnly:=True - юзер не может вносить изменения, макрос может.
    sh_res.Protect "1", UserInterfaceOnly:=True
   
    '7. Запись в коллекцию строк листа-источника, которые надо скопировать,
        ' в случайном порядке.
    GetRandomRows sh_src, RandomRows
   
    '8. Движения по элементам коллекции RandomRows.
    For i = 1 To RandomRows.Count
        '1) Запись номера строки листа-источника, из которой нужно скопировать данные, в переменную "r",
            ' чтобы было удобнее писать и читать код.
        r = RandomRows(i)
        '2) Создание папки для эксель-файла.
        ' Запись в переменную "FN_folder" полного имени создаваемой папки.
        FN_folder = path & "\" & sh_src.Cells(r, "A").Value
        ' Проверка, есть ли папка. Если папки нет.
        If Dir(FN_folder, vbDirectory) = "" Then
            ' Создание папки.
            MkDir FN_folder
        End If
        '3) Копирование данных из листа-источника на лист-результат.
        sh_res.Range("A1").Value = sh_src.Cells(r, "B").Value
        sh_res.Range("A2").Value = sh_src.Cells(r, "C").Value
        sh_res.Range("A3").Value = sh_src.Cells(r, "D").Value
        sh_res.Range("A4").Value = sh_src.Cells(r, "E").Value
        '4) Создание копии файла-результата.
        sh_res.Parent.SaveCopyAs FN_folder & "\N" & sh_src.Cells(r, "F") & ".xlsx"
    Next i
   
    '9. Закрытие файла-результата без сохранения (этот файл был ранее сохранён).
    sh_res.Parent.Close SaveChanges:=False
   
    '10. Вкл. монитора.
    Application.ScreenUpdating = True
   
    '11. Сообщение.
    MsgBox "Готово.", vbInformation
   
End Sub

Private Sub GetRandomRows(sh_src As Worksheet, RandomRows As Collection)

    ' Запись в коллекцию строк листа-источника, которые надо скопировать,
        ' в случайном порядке.
   
    Dim RandomNumber As Long
    Dim lr As Long
   
   
    '1. Поиск последней строки на листе-источнике, в столбце A.
        ' End не ищет в скрытых строках.
    lr = sh_src.Cells(sh_src.Rows.Count, "A").End(xlUp).Row
   
    '2. Заполнение коллекции.
    '1) Включение перехватчика ошибок, чтобы макрос продолжил работу, если будет ошибка.
        ' Ошибка будет, когда макрос будет записывать в коллекцию номер строки, который уже
        ' есть в коллекции.
    On Error Resume Next
    '2) Создание коллекции.
    Set RandomRows = New Collection
    Do
        '3) Запись в переменную случайного номера строки.
            ' Формулу для генерации целых чисел можно посмотреть в справке.
        RandomNumber = Int((lr - 2 + 1) * Rnd + 2)
        '4) Копирование данных из переменной в коллекцию.
            ' Если в коллекции уже будет такой номер строки, то не будет записано.
            ' Key - нужно, чтобы отслеживать, какие номера строк уже записаны в коллекцию.
            ' Item - нужно, чтобы потом использовать номера строк в макросе.
            ' Key работает с типом String.
        RandomRows.Add Item:=RandomNumber, Key:=CStr(RandomNumber)
   
    ' Цикл должен быть до тех пор, пока в коллекции "RandomRows" кол-во
        ' элементов не станет равно кол-ву строк, которые надо скопировать.
    Loop While RandomRows.Count <> (lr - 1)
    '6) Отключение перехватчика ошибок, чтобы увидеть непредвиденные ошибки, если они будут.
    On Error GoTo 0
   
End Sub
[свернуть]

Евгений

Помогите, что то не получилось. Сделал как сказали,  заменил код на ваш, файлы создаются, но рандома нет.

Администратор

Задача не понятна.
Создайте два файла-результата так, как вы хотите. Для этого используйте данные из файлов, которые вы выложили в первом сообщении.

Евгений

Подскажите, что я делаю не так, файлы с новым кодом прилагаю. Запускаю макрос, создаются файлы, но результат такой же как был в изначально. Строки берутся не рандомно. И я не понял, что вы имели ввиду когда сказали "Создайте два файла-результата ". У меня один файл "пример" с макросом который я и запускаю.

[вложение удалено администратором]

Администратор

Сделайте вручную два файла-результата, как они должны выглядеть. Для создания двух файлов используйте данные из файлов, которые в первом сообщении.