Pregunta Cómo dividir números en dígitos separados en Excel


¿Alguien sabe de una manera bastante simple dividir números de varias longitudes en dígitos separados y luego manipular cada dígito? Probablemente podría hacerlo en Excel, pero pensar en un macro sería más agradable ya que solo estoy interesado en una lista de resultados que cumplan con unos pocos criterios. Ejemplo: 1234 se divide en 1, 2, 3 y 4. Cada uno de estos se cuadra y la suma de los cuadrados se devuelve como un número (1 ^ 2 + 2 ^ 2 + 3 ^ 2 + 4 ^ 2 = 30) Ahora solo 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 cumplan con la restricción.

Gracias


1


origen




Respuestas:


¿Desea que Macro en Excel VBA haga esto o solo un puntero en una dirección?

Esta puede no ser la forma más eficiente, pero es de una sola manera.

Ir a través del rango de números y para cada número convertir a una Cadena, p. sValue = Trim (Str (I))

luego, para cada dígito en LEN (sValue) obtienes el valor y lo cuadras

p.ej.     Para J = 1 a Len (sValue)         Resultado = Resultado + (Val (Medio (sText, J, 1)) ^ 2)     Siguiente J

Una vez que tenga un resultado, realice los criterios solicitados y confirme que se trata de un número entero (por ejemplo)     p.ej.         (Resultado / Divisor) = Ronda (Resultado / Divisor, 0)

y coloque sus resultados en las celdas requeridas. Repita para tantas iteraciones como necesite (por ejemplo, 10000)

Aquí hay una muestra que acabo de inventar y creo que funciona bien para su ejemplo (da 3711 filas de respuestas), simplemente cambie los valores de Const para 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

0



Muchas gracias por su rápida respuesta. Hermoso código, justo lo que necesitaba. Trim (), Str () y Val () eran nuevos para mí, así que exactamente lo que estaba buscando. - Robert P.
La razón era que me encontré con los números de Munchausen hoy, así que por pura curiosidad quise ver si podía hacer una prueba de macro. Tuve que cambiar algunos Dim a Doblar y aumentar los números para ellos en lugar de 2, pero eso fue todo lo que se necesitó. Ah, y también necesito una computadora nueva. No me gustó cuando cambié EndRange a 1E + 16 :) Buen trabajo, es bueno aprender un código nuevo, gracias de nuevo. - Robert P.
sí, pensé en lo que sucedería si tuvieras números grandes y luego pensé en el ejemplo que diste y decidí que podrías averiguar las otras cosas ... me alegro de que haya ayudado ... las funciones de conversión de Texto / Números son bastante antiguas pero entonces yo también :-) - Kevin Davidson
Por favor, siéntase libre de votar por mi voto como mejor le parezca, ya que es bastante difícil obtener puntos aquí :-) Saludos - Kevin Davidson
Si pudiera, pero nuevo aquí, así que necesito puntos primero;) - Robert P.


Para completar, aquí está cómo hacerlo sin VBA:

  1. Ingrese esta fórmula de matriz en B1 con Ctrl+Cambio+Entrar

    {=SUMSQ(1*MID(ROW(),ROW(OFFSET($A$1,,,LEN(ROW()))),1))}

  2. Ingresa esta fórmula en A1:

    =IF(MOD(B1,3)=0,ROW(),0)

  3. Rellene tantas filas como desee. 10,000 en tu caso

  4. Filtro para ocultar los valores de 0 en columna A O copie / pegue valores y luego clasifique A y eliminar todas las filas con un valor de 0.

1