Кто-нибудь знает довольно простой способ разбить числа разной длины на отдельные цифры и затем манипулировать каждой цифрой? Вероятно, это можно сделать в самом Excel, но было бы лучше подумать о макросе, поскольку мне нужен только список результатов, которые соответствуют нескольким критериям. Пример: 1234 разбивается на 1, 2, 3 и 4. Затем каждое из них возводится в квадрат, а сумма квадратов возвращается в виде числа (1^2 + 2^2 + 3^2 + 4^2 = 30). Теперь, только если результат можно разделить на выбранное число, скажем, 3, макрос заполнит ячейку заданным числом и соответствующим ему результатом: A1 = 1234, A2 = 30. Он сделает это для всех i = 1 до 10000, создав список только тех чисел, которые удовлетворяют ограничению.
Спасибо
решение1
Вы хотите, чтобы макрос в Excel VBA делал это или просто указывал направление?
Возможно, это не самый эффективный способ, но это один из способов.
Пройдите по диапазону чисел и для каждого числа преобразуйте его в строку, например, sValue = Trim(Str(I))
затем для каждой цифры в LEN(sValue) вы получаете значение и возводите его в квадрат
например, для J = 1 до Len(sValue) Результат = Результат + (Val(Mid(sText, J, 1)) ^ 2) Следующий J
Получив результат, выполните требуемые критерии и подтвердите, что это целое число (например), например (Результат / Делитель) = Округлить(Результат / Делитель, 0)
и поместите результаты в требуемые ячейки. Повторите столько итераций, сколько вам нужно (например, 10000)
Вот пример, который я только что составил, и я думаю, что он хорошо подходит для вашего примера (дает 3711 строк ответов), просто измените значения Const в соответствии с вашими требованиями.
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
решение2
Для полноты картины вот как это сделать без VBA:
Введите эту формулу массива
B1
с помощью Ctrl+ Shift+Enter{=SUMSQ(1*MID(ROW(),ROW(OFFSET($A$1,,,LEN(ROW()))),1))}
Введите эту формулу в
A1
:=IF(MOD(B1,3)=0,ROW(),0)
Заполните столько строк, сколько вам нужно. В вашем случае 10 000.
- Фильтруйте, чтобы скрыть значения
0
в столбцеA
ИЛИ копируйте/вставляйте значения, а затем сортируйтеA
и удаляйте все строки со значением0
.