¿Alguien conoce una forma bastante sencilla de dividir números de distinta longitud en dígitos separados y luego manipular cada dígito? Probablemente podría hacerlo en Excel, pero sería mejor pensar en una macro, ya que solo me interesa una lista de resultados que cumplan con algunos criterios. Ejemplo: 1234 se divide en 1, 2, 3 y 4. Luego, cada uno de estos se eleva al cuadrado y la suma de los cuadrados se devuelve como un número (1^2 + 2^2 + 3^2 + 4^2 = 30 ) Ahora, sólo si el resultado se puede dividir por un número elegido, digamos 3, la macro llenará una celda con el número dado y su resultado correspondiente: A1 = 1234, A2 = 30. Hará esto para todo i = 1 a 10000, creando una lista de solo los números que cumplen la restricción.
Gracias
Respuesta1
¿Quiere que la Macro en Excel VBA haga esto o simplemente un puntero en una dirección?
Puede que esta no sea la forma más eficiente, pero es una forma.
Revise el rango de números y para cada número convierta a una cadena, por ejemplo, sValue = Trim(Str(I))
luego, para cada dígito en LEN (sValue), obtienes el valor y lo elevas al cuadrado.
por ejemplo, para J = 1 a Len(sValue) Resultado = Resultado + (Val(Mid(sText, J, 1)) ^ 2) Siguiente J
Una vez que tenga un resultado, ejecute los criterios solicitados y confirme que sea un número entero (por ejemplo), por ejemplo (Resultado/Divisor) = Ronda (Resultado/Divisor, 0).
y coloque sus resultados en las celdas requeridas. Repita tantas iteraciones como necesite (por ejemplo, 10000)
Aquí hay una muestra que acabo de crear y creo que funciona bien para su ejemplo (da 3711 filas de respuestas), simplemente cambie los valores de Const según sus requisitos.
Sub SplitNumber()
Const StartRange = 1
Const EndRange = 10000
Const Divisor = 3
Const InputCol = 1
Const ResultCol = 2
Dim StartRow, Result As Integer
Dim sValue As String
StartRow = 1
I = StartRange
CurrentRow = StartRow
While I <= EndRange
sValue = Trim(Str(I))
Result = 0
If Len(sValue) > 1 Then
For J = 1 To Len((sValue))
Result = Result + (Val(Mid(sValue, J, 1)) ^ 2)
Next J
Else
Result = Val(sValue) ^ 2
End If
If (Result / Divisor) = Round(Result / Divisor, 0) Then
Cells(CurrentRow, InputCol) = I
Cells(CurrentRow, ResultCol) = Result
CurrentRow = CurrentRow + 1
End If
I = I + 1
Wend
End Sub
Respuesta2
Para completar, aquí se explica cómo hacerlo sin VBA:
Ingrese esta fórmula matricial
B1
con Ctrl+ Shift+Enter{=SUMSQ(1*MID(ROW(),ROW(OFFSET($A$1,,,LEN(ROW()))),1))}
Introduzca esta fórmula en
A1
:=IF(MOD(B1,3)=0,ROW(),0)
Complete tantas filas como desee. 10.000 en tu caso.
- Filtre para ocultar los valores de
0
en la columnaA
O copie/pegue valores y luego ordeneA
y elimine todas las filas con un valor de0
.