Te anexo las macros:
Sub principal()
'Por.Dante Amor
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ruta = ThisWorkbook.Path
'
OrdenarDatos
ConveniosNombres
'
Set h1 = Sheets("Hoja1")
Set h2 = Sheets("Hoja2")
Set h3 = Sheets("Hoja3")
Set h4 = Sheets("Hoja4")
h3.Cells.Clear
h4.Cells.Clear
cant = h2.[D2]
If cant = "" Then
MsgBox "Falta el número de líneas a copiar"
h2.Select
[D2].Select
End If
'
'títulos para filtrar
h2.[J1] = h2.[A1]
h2.[K1] = h2.[B1]
h2.[L1] = h1.[F1]
h2.[M1] = h1.[F1]
'
h2.Select
h2.[l2] = ">=" & Evaluate("=CONCATENATE(F2)")
h2.[M2] = ">=" & Evaluate("=CONCATENATE(G2)")
'
For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
h2.[J2] = h2.Cells(i, "A")
h2.[K2] = h2.Cells(i, "B")
h1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, h2.[J1:M2], h3.[a1:K1]
'
fila = h3.Range("B" & Rows.Count).End(xlUp).Row
If fila > cant + 1 Then
h3.Rows(1).Copy h4.Rows(1)
cont = 0
j = 2
Do While True
y = Evaluate("=RANDBETWEEN(2," & fila & ")")
If h3.Cells(y, "Z") = "" Then
h3.Rows(y).Copy h4.Rows(j)
h3.Cells(y, "Z") = "X"
j = j + 1
If j = cant + 1 Then Exit Do
End If
Loop
Else
h3.Cells.Copy h4.[A1]
End If
'
libro = h4.[B2]
archi = ruta & "\" & libro & ".xlsx"
If Dir(archi) <> "" Then
Set l2 = Workbooks.Open(archi)
h4.Copy After:=l2.Sheets(l2.Sheets.Count)
ActiveSheet.Name = h4.[E2]
ActiveWorkbook.Save
ActiveWorkbook.Close False
Else
h4.Copy
ActiveSheet.Name = h4.[E2]
ActiveWorkbook.SaveAs archi
ActiveWorkbook.Close False
End If
'
Next
MsgBox "Proceso de crear libros, hojas y enviar registros aleatorios", vbInformation, "TERMINADO"
End Sub
'
Sub OrdenarDatos()
'Por.Dante Amor
Set h1 = Sheets("Hoja1")
u = h1.Range("B" & Rows.Count).End(xlUp).Row
With h1.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("B2:B" & u) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("E2:E" & u) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("F2:F" & u) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1:K" & u)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
'
Sub ConveniosNombres()
'Por.Dante Amor
Set h1 = Sheets("Hoja1")
Set h2 = Sheets("Hoja2")
h2.Range("A:B").Clear
u = h1.Range("B" & Rows.Count).End(xlUp).Row
'
h1.Range("B:B,E:E").Copy h2.Range("A1")
h2.Range("A1:B" & u).RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
'
End Sub
Te anexo el archivo que tiene la macro. Funciona de la siguiente manera:
En la hoja1 debes poner tus datos.
En la hoja2 en la celda D2 tienes que poner la cantidad de líneas a copiar.
En la hoja2 en las celdas F2 y G2 tienes que poner el rango de fechas, fecha inicial y fecha final.
En la hoja1 está un botón para que lo presiones y se generen los libros y las hojas.
No deben existir los libros, ya que se van a crear nuevos.
El archivo trabaja con las 4 hojas: hoja1, hoja2, hoja3 y hoja4. No las borres ni les cambies el nombre.
Te anexo el archivo con unos datos de prueba para que revises los resultados.
https://www.dropbox.com/s/3m1oehvbhkczsdn/convenio.xlsm?dl=0
Saludos. Dante Amor