Kennt jemand eine einigermaßen einfache Möglichkeit, Zahlen unterschiedlicher Länge in einzelne Ziffern aufzuteilen und dann jede Ziffer zu bearbeiten? Man könnte das wahrscheinlich in Excel selbst machen, aber ich denke, ein Makro wäre besser, da ich nur an einer Liste mit Ergebnissen interessiert bin, die ein paar Kriterien erfüllen. Beispiel: 1234 wird in 1, 2, 3 und 4 aufgeteilt. Jede dieser Zahlen wird dann quadriert und die Summe der Quadrate wird als Zahl zurückgegeben (1^2 + 2^2 + 3^2 + 4^2 = 30). Nur wenn das Ergebnis durch eine gewählte Zahl geteilt werden kann, sagen wir 3, füllt das Makro eine Zelle mit der angegebenen Zahl und dem entsprechenden Ergebnis: A1 = 1234, A2 = 30. Es macht das für alle i = 1 bis 10000 und erstellt eine Liste mit nur den Zahlen, die die Bedingung erfüllen.
Danke
Antwort1
Möchten Sie, dass das Makro in Excel VBA dies tut, oder nur einen Zeiger in eine Richtung?
Dies ist möglicherweise nicht der effizienteste Weg, aber es ist einer.
Gehen Sie den Zahlenbereich durch und konvertieren Sie jede Zahl in einen String, z. B. sValue = Trim(Str(I)).
dann erhält man für jede Ziffer in LEN(sValue) den Wert und quadriert ihn
zB Für J = 1 Bis Len(sValue) Ergebnis = Ergebnis + (Val(Mid(sText, J, 1)) ^ 2) Nächstes J
Sobald Sie ein Ergebnis haben, führen Sie die gewünschten Kriterien aus und bestätigen Sie, dass es sich um eine ganze Zahl handelt (zum Beispiel), z. B. (Ergebnis / Divisor) = Runden(Ergebnis / Divisor, 0)
und geben Sie Ihre Ergebnisse in die erforderlichen Zellen ein. Wiederholen Sie dies für so viele Iterationen, wie Sie benötigen (z. B. 10000).
Hier ist ein Beispiel, das ich gerade erstellt habe, und ich denke, es funktioniert für Ihr Beispiel ganz gut (ergibt 3711 Zeilen mit Antworten), ändern Sie einfach die Const-Werte entsprechend Ihren Anforderungen.
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
Antwort2
Der Vollständigkeit halber hier die Vorgehensweise ohne VBA:
Geben Sie diese Matrixformel
B1
mit Ctrl+ Shift+ ein.Enter{=SUMSQ(1*MID(ROW(),ROW(OFFSET($A$1,,,LEN(ROW()))),1))}
Geben Sie diese Formel ein in
A1
:=IF(MOD(B1,3)=0,ROW(),0)
Füllen Sie nach unten so viele Zeilen aus, wie Sie möchten. In Ihrem Fall 10.000.
0
Filtern Sie, um Werte in der Spalte auszublenden,A
ODER kopieren/fügen Sie Werte ein und sortierenA
und löschen Sie dann alle Zeilen mit einem Wert von0
.