Saltar al contenido

Macro para aleatorizar números de una columna con sucesiones de cuatro dígitos


Recommended Posts

publicado

Hola de nuevo a toda la comunidad,

Recientemente me ayudasteis con una estupenda macro pero me encuentro ante un nuevo escollo. Tengo una base de datos con unas 2049 observaciones donde la primera columna refleja individuos y tiene una estrucutra tetranómica. Es decir, para cada sujeto dispongo de cuatro observaciones correspondientes a cuatro elecciones. La cuestión es que esas cuatro elecciones, pertenecientes a la columna ELE, están ordenadas siempre de 1 hasta 4 y lo que pretendo es dentro de cada sujeto (columna 1, con cuatro observaciones) los número de 1 a 4 se distribuyan aleatoriamente, por supuesto, arrastrando toda la observación.

Es decir a modo de ejemplo:

[TABLE=class: MsoNormalTable, width: 375]

[TR]

[TD=colspan: 3] Datos originales

[/TD]

[TD=colspan: 3] Resultados esperado[/TD]

[/TR]

[TR]

[TD] Inviduo[/TD]

[TD] ELE

[/TD]

[TD] Resto de Variables[/TD]

[TD] Individuo[/TD]

[TD] ELE

[/TD]

[TD] Resto de variables[/TD]

[/TR]

[TR]

[TD] 1[/TD]

[TD] 1

[/TD]

[TD]0

[/TD]

[TD] 1

[/TD]

[TD] 2

[/TD]

[TD] 1

[/TD]

[/TR]

[TR]

[TD] 1

[/TD]

[TD] 2

[/TD]

[TD] 1

[/TD]

[TD] 1[/TD]

[TD] 3

[/TD]

[TD] -1

[/TD]

[/TR]

[TR]

[TD] 1

[/TD]

[TD] 3[/TD]

[TD] -1

[/TD]

[TD] 1[/TD]

[TD] 4

[/TD]

[TD] -1

[/TD]

[/TR]

[TR]

[TD] 1

[/TD]

[TD] 4[/TD]

[TD] -1

[/TD]

[TD] 1

[/TD]

[TD] 1

[/TD]

[TD]0

[/TD]

[/TR]

[TR]

[TD] 2[/TD]

[TD] 1[/TD]

[TD] 1

[/TD]

[TD] 2[/TD]

[TD] 3

[/TD]

[TD] -1

[/TD]

[/TR]

[TR]

[TD] 2[/TD]

[TD] 2[/TD]

[TD]0

[/TD]

[TD] 2[/TD]

[TD] 4

[/TD]

[TD]0

[/TD]

[/TR]

[TR]

[TD] 2[/TD]

[TD] 3[/TD]

[TD] -1

[/TD]

[TD] 2[/TD]

[TD] 1

[/TD]

[TD] 1

[/TD]

[/TR]

[TR]

[TD] 2[/TD]

[TD] 4[/TD]

[TD]0

[/TD]

[TD] 2

[/TD]

[TD] 2

[/TD]

[TD]0

[/TD]

[/TR]

[/TABLE]

Os adjunto ejemplo de la base de datos

Gracias por adelantado

Estupenda comunidad

Saludos

eje_para_ayuda_excel.xls

publicado
Intenta con la funcion aleatorio.

Hola Armando gracias por tu respuesta pero no acabo de entender como la función aleatorio puede ayudarme ya que debo aleatorizar entre 1 y 4 dentro de cada individuo. Es decir, cada invividuo tiene ordenada la columna ELE siempre de 1 a 4 y yo debo especificar que esa ordenación sea aleatoria por individuo (por ejemplo, 1324; 1243;3214;4132...) y que, por supuesto, se traslade toda la observación a su nueva posición en función del orden que se le asigne.

Te agradecería infinitamente si puedes concretarme un poco más tu idea

Mil gracias de antemano

Saludos

publicado

Se aplicaria por cada grupo de 4, puede usarse una columna auxiliar temporal.

Dependiendo del numero de registros puede ser manual o con macro.

Si es con macro lo hariamos con areas.

Regresare mas tarde por si necesitas que prepare la macro, depende de la cantidad de registros.

publicado
Se aplicaria por cada grupo de 4, puede usarse una columna auxiliar temporal.

Dependiendo del numero de registros puede ser manual o con macro.

Si es con macro lo hariamos con areas.

Regresare mas tarde por si necesitas que prepare la macro, depende de la cantidad de registros.

Hola de nuevo Armando se trata de 2048 registros correspondientes a 512 individuos (512*4). Si puedes echarme una mano te estaría muy agradecido. Manualmente creo que sería muy complicado. Por otra parte, la fórmula aleatorio parece que funciona con repeticiones... yo necesitaría una fórmula aleatoria para números entre 1 y 4 sin repeticiones y por individuo cada cuatro celdas. Si es necesario subo la base de datos original en lugar del recorte que he subido con cuatro observaciones.

Saludos

Gracias de antemano

publicado

Hola Armando,

En primer lugar muchas gracias por tu estupendo trabajo. En segundo lugar, tengo alguna duda:

1. Entiendo que el orden para aplicar las macros sería 1) ELE 2) Rnd 3) xXArea y por último 4) Blanks.

En mi caso, suponiendo que el orden de las macros sea este (que parece lógico) el comando blanks no me limpia todas las observaciones que se intercalan y a partir de la 1642 se queda intercalado un valor en la primera columna RND que se crea. Como ya no son muchas las puedo eliminar simplemente a mano pero lo comento por si he hecho algo mal. Lo único que he modificado es la macro Blanks consignando "A2:A2766".

Mil gracias

Excelente trabajo

Saludos

Mil gracias

Un trabajo muy profesional

Estupenda comunidad ya que lo mejor son los usuarios como Armando

publicado

Hola de nuevo Armando... lo había imaginado pero me ha confundido que al ejecutar la macro ELE funciona bien aleatorizando y eliminando las filas en blanco hasta la fila 1642, justo en el individuo 412 donde empieza a insertar una fila en blanco hasta el final. En cualquier caso, si me confirmas que no hay problema y no afecta a la aleatorización con la macro blanks fácilmente elimino las fials en blanco a partir de la linea 1642.

Mil gracias de nuevo

Estupenda comunidad

Abrazo

publicado
Solo viendo el libro exacto podria responder.

Hola de nuevo Armando, he comprobado indirectamente los resultados y parece que no hay ningún problema. En cualquier caso, te adjunto un fichero con 2049 observaciones para que veas el efecto que te comentaba en el anterior post.

Saludos

Mil gracias

Abrazo

prueba.zip

publicado
Como no viene el codigo en tu libro, inserte el mio sin ajustar rangos, corre normal asi que no logre ver el problema que mencionas.

Hola de nuevo Armando te adjunto la base de datos a la que ejecuto tu macro ELE... como puedes ver a patir de la la fila 1642 inserta un espacio en blanco cada cuatro observaciones... Para eliminarla simplemente aplico tu macro blanks pero quería cerciorarme que ese inconveniente no altera la aleatorización y el resultado final.

Mil gracias

Saludos

prueba.zip

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.