さまざまな長さの数字を別々の桁に分割し、各桁を操作するかなり簡単な方法を知っている人はいますか? おそらく Excel 自体で実行できますが、いくつかの基準を満たす結果のリストだけが必要なので、マクロの方がよいと思います。例: 1234 は 1、2、3、4 に分割されます。次に、これらをそれぞれ 2 乗し、2 乗の合計が数値として返されます (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)の各桁の値を取得し、それを2乗します。
例えば、J = 1 の場合、Len(sValue) の結果 = Result + (Val(Mid(sText, J, 1)) ^ 2) 次の J
結果を取得したら、要求された基準を実行し、それが整数であることを確認します(例)例:(結果 / 除数)= Round(結果 / 除数、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
で入力しますCtrlShiftEnter{=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
。