Macro para obtener las Permutaciones sin Repetición de un Número en Excel
1️⃣ Insertamos un módulo
OPCIÓN 1: Si desea que la macro solo esté disponible para el libro en uso, puede agregarla en el VBAProject de ese libro en particular. El VBAProject lleva el mismo nombre que el libro. Una vez que haya escrito su código en el VBAProject del libro, asegúrese de guardarlo como un Libro de Excel habilitado para macros, para que la macro esté disponible en el libro en uso y se pueda ejecutar.
OPCIÓN 2: Si desea que la macro este disponible para emplearse en cualquier Libro, insertamos un módulo en el VBAProject (PERSONAL.XLSB).
2️⃣ Copiamos el siguiente Código:
Sub PermutacionSinRepeticionNumero()
Dim N As String, R() As String, U() As Boolean, S() As String, i As Integer, CI As Range, E As VbMsgBoxResult, TP As Long
E = MsgBox("¿Desea seleccionar la celda que contiene el número a permutar?", vbYesNoCancel)
If E = vbYes Then
On Error Resume Next
Set CI = Application.InputBox("Seleccione la celda que contiene el número a permutar", Type:=8)
On Error GoTo 0
If CI Is Nothing Then
N = InputBox("No se ha seleccionado una celda válida. Ingrese el número a permutar")
Else
If Len(CI.Value) > 6 Then
MsgBox "La celda seleccionada contiene un número demasiado largo. Se tomarán en cuenta solo las primeras 6 cifras."
N = Left(CI.Value, 6)
Else
N = CI.Value
End If
End If
ElseIf E = vbNo Then
N = InputBox("Ingrese el número a permutar")
If Len(N) > 6 Then
MsgBox "El número ingresado es demasiado largo. Se tomarán en cuenta solo las primeras 6 cifras."
N = Left(N, 6)
End If
Else
Exit Sub
End If
If Not N = "" Then
Set CI = Application.InputBox("Ingrese la celda de inicio para enumerar las permutaciones", Type:=8)
ReDim R(Len(N) - 1), U(Len(N) - 1), S(Len(N) - 1)
For i = 0 To Len(N) - 1
R(i) = Mid(N, i + 1, 1)
Next i
TP = PermuteUnique(R, U, S, 0, Len(N) - 1, CI)
MsgBox "Para el número " & N & " es posible " & TP & " permutaciones sin repetir."
End If
End Sub
Private Function PermuteUnique(R() As String, U() As Boolean, S() As String, N As Integer, M As Integer, CI As Range) As Long
Dim i As Integer, count As Long
If N > M Then
CI.Value = Join(S, "")
Set CI = CI.Offset(1, 0)
count = 1
Else
Dim used(10) As Boolean
For i = 0 To M
If Not U(i) And Not used(Val(R(i))) Then
U(i) = True
S(N) = R(i)
count = count + PermuteUnique(R, U, S, N + 1, M, CI)
U(i) = False
used(Val(R(i))) = True
End If
Next i
End If
PermuteUnique = count
End Function
3️⃣ Pegamos y Guardamos el Código:
4️⃣ Acerca de "PermutacionesSinRepeticiónNúmero"
Esta macro de VBA en Excel genera todas las permutaciones posibles sin repetición de un número de 6 cifras. A continuación, se explica el funcionamiento del código:
En primer lugar, se declara una serie de variables y se muestra un mensaje para que el usuario decida si desea seleccionar la celda que contiene el número a permutar o ingresarlo manualmente. En caso de seleccionar la celda, se valida que sea una celda válida y se toman en cuenta solo las primeras 6 cifras si el número es demasiado largo. Si se decide ingresar el número manualmente, también se valida que no exceda de 6 cifras.
Luego, se pide al usuario que ingrese la celda de inicio para enumerar las permutaciones y se declaran tres arreglos: R(), U() y S(). R() contiene las cifras del número ingresado, U() es un arreglo de booleanos que se utiliza para verificar si una cifra ya ha sido utilizada en una permutación, y S() contiene las cifras que forman cada permutación.
El siguiente paso es recorrer el arreglo R() para llenar cada posición con las cifras del número. A continuación, se llama a la función PermuteUnique(), que se encarga de encontrar todas las permutaciones únicas del número.
La función PermuteUnique() utiliza la técnica de backtracking para encontrar todas las permutaciones. La función recibe como parámetros los arreglos R(), U() y S(), así como dos índices: N y M. N indica la posición actual en el arreglo S() donde se va a colocar la siguiente cifra de la permutación, y M indica la posición final en el arreglo R().
Si N es mayor que M, significa que se ha formado una permutación completa y se escribe en la celda indicada por el usuario. Si no, se recorre el arreglo R() buscando las cifras que no han sido utilizadas y se llama recursivamente a la función con N+1. Se utiliza el arreglo U() para evitar repeticiones y el arreglo used() para verificar si una cifra ya ha sido utilizada en una permutación.
Finalmente, la función retorna la cantidad de permutaciones encontradas y se muestra un mensaje al usuario con esta información.
Al ejecutar la macro, el usuario es preguntado si desea seleccionar la celda que contiene el número a permutar o si desea ingresar el número manualmente. Si el usuario selecciona una celda, el valor de esa celda se utiliza como el número a permutar. Si el usuario no selecciona una celda o si la celda seleccionada no contiene un número válido, se le solicita que ingrese el número manualmente.
Después de ingresar el número a permutar, el usuario debe seleccionar la celda de inicio para enumerar las permutaciones. La macro utiliza la función Permute para generar todas las permutaciones posibles sin repetición del número ingresado y las escribe en las celdas a partir de la celda de inicio seleccionada.
La función Permute es una función recursiva que utiliza tres matrices: R(), U() y S(). La matriz R() contiene los caracteres del número a permutar, la matriz U() se utiliza para llevar un registro de qué caracteres se han utilizado en una permutación determinada y la matriz S() se utiliza para construir cada permutación. La función utiliza un bucle For para iterar a través de los caracteres de la matriz R() y construir cada permutación posible. Cuando se encuentra una permutación completa, se escribe en la celda especificada y se avanza a la siguiente celda.
Al final de la macro, se calcula el número total de permutaciones posibles sin repetición para el número ingresado utilizando la función Factorial (Fact) de Excel y se muestra en un mensaje MsgBox. En general, esta macro es útil para calcular todas las permutaciones posibles sin repetición de un número dado en Excel.
5️⃣Limitaciones:
Se limitó a un máximo de 6 cifras en la generación de permutaciones debido a consideraciones prácticas de rendimiento y capacidad de procesamiento del equipo. La generación de permutaciones puede ser un proceso intensivo en términos de recursos y puede tomar mucho tiempo para números más grandes.
La cantidad de permutaciones posibles para un número de 6 cifras distintas es de 720, lo que es un número considerable. Si se permitieran números más grandes, el número total de permutaciones posibles aumentaría rápidamente, lo que podría llevar mucho tiempo y recursos para generarlas todas. Si se tienen 7 cifras diferentes para permutar, hay 5,040 posibles permutaciones. Esto es una cantidad manejable para una hoja de cálculo de Excel, pero aun así puede ser un proceso intensivo en términos de recursos y puede tomar algún tiempo para generar todas las permutaciones posibles.
El número de permutaciones posibles aumenta rápidamente con el tamaño del conjunto de elementos que se están permutando. Por ejemplo, si se tienen 10 cifras distintas para permutar, hay 3,628,800 permutaciones posibles. Si se intenta generar todas estas permutaciones, esto puede llevar mucho tiempo y utilizar muchos recursos del equipo y sobre todo en Excel solo hay 1,048,576 filas disponibles. Además, las hojas de cálculo de Excel tienen limitaciones de memoria y rendimiento, lo que puede hacer que el proceso se vuelva inmanejable para números más grandes.
En resumen, limitar la generación de permutaciones a 6 cifras es una medida práctica para evitar la sobrecarga del equipo y garantizar un rendimiento óptimo. Generar permutaciones de números más grandes puede ser intensivo en términos de recursos y tiempo, lo que puede afectar la estabilidad y el rendimiento de la hoja de cálculo y la computadora en general.
Muy bueno, tengo un inconveniente, tengo que permutar estas letras con Repeticion A B C D E F . no encuentro el codig para repeticion y menos con letras.
ResponderEliminaratt : juan sebastian desde colombia gracias.
Saludos, disculpa que la fecha responda, esto te puede ser de utilidad https://youtu.be/Gb84Y1fc8Ys puedes asignar un valor numérico a cada letra 1 para A, 2 para B 6 para F y luego solo sustituyes cada numero por su respectiva letra mediante sustituir
Eliminarcorreo :
ResponderEliminarjsjimenezh@ut.edu.co