Alguém conhece uma maneira bastante simples de dividir números de vários comprimentos em dígitos separados e depois manipular cada dígito? Provavelmente poderia fazer isso no próprio Excel, mas pensar que uma macro seria melhor, pois estou interessado apenas em uma lista de resultados que atenda a alguns critérios. Exemplo: 1234 é dividido em 1, 2, 3 e 4. Cada um deles é então elevado ao quadrado e a soma dos quadrados é retornada como um número (1 ^ 2 + 2 ^ 2 + 3 ^ 2 + 4 ^ 2 = 30 ) Agora, somente se o resultado puder ser dividido por um número escolhido, digamos 3, a macro preencherá uma célula com o número fornecido e seu resultado correspondente: A1 = 1234, A2 = 30. Ela fará isso para todos os i = 1 para 10.000, criando uma lista apenas dos números que atendem à restrição.
Obrigado
Responder1
Você deseja que a macro no Excel VBA faça isso ou apenas um ponteiro em uma direção?
Esta pode não ser a maneira mais eficiente, mas é uma delas.
Percorra o intervalo de números e, para cada número, converta em uma String, por exemplo, sValue = Trim(Str(I))
então, para cada dígito em LEN (sValue), você obtém o valor e o eleva ao quadrado
por exemplo, para J = 1 para Len(sValue) Resultado = Resultado + (Val(Mid(sText, J, 1)) ^ 2) Próximo J
Assim que tiver um Resultado, execute os critérios solicitados e confirme que é um número inteiro (por exemplo) por exemplo (Resultado/Divisor) = Rodada(Resultado/Divisor, 0)
e coloque seus resultados nas células necessárias. Repita para quantas iterações forem necessárias (por exemplo, 10.000)
Aqui está um exemplo que acabei de criar e acho que funciona bem para o seu exemplo (fornece 3.711 linhas de respostas), basta alterar os valores Const de acordo com seus 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
Responder2
Para completar, veja como fazer isso sem VBA:
Insira esta fórmula de matriz
B1
com Ctrl+ Shift+Enter{=SUMSQ(1*MID(ROW(),ROW(OFFSET($A$1,,,LEN(ROW()))),1))}
Insira esta fórmula em
A1
:=IF(MOD(B1,3)=0,ROW(),0)
Preencha quantas linhas desejar. 10.000 no seu caso.
- Filtre para ocultar os valores
0
na colunaA
OU copie/cole os valores e, em seguida, classifiqueA
e exclua todas as linhas com o valor0
.