Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Anzahl Teiler

Anzahl Teiler
08.05.2013 11:24:01
alifa
Hallo,
kennt jemand eine Funktion(Makro), die prüft, ob eine(bis sechsstellige) Zahl eine bestimmte Anzahl von Teilern hat? Beispiel: 414637 hat genau 5 Teiler:1,19,139,157,414637
Danke im Voraus!
Alifa

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anzahl Teiler
08.05.2013 11:26:41
JACKD
Hallo Alifa
=KKLEINSTE(WENN(REST(A$1;ZEILE(INDIREKT("1:"&KÜRZEN(A$1^0,5))))=0;ZEILE(INDIREKT("1:"&KÜRZEN(A$1^0,5) )));ZEILE())
als Matrixformel abschliessen
und runterkopieren
Grüße

Teilerzahl
08.05.2013 11:45:02
WF
Hi,
folgende Arrayformel:
{=SUMMENPRODUKT((REST(A$1;ZEILE(INDIREKT("1:"&KÜRZEN(A$1^0,5))))=0)*2)-(REST(A1^0,5;1)=0)}
Da enthalten sind auch 1 und die Zahl selbst - ohne: also 2 subtrahieren.
siehe unsere:
http://www.excelformeln.de/formeln.html?welcher=139
Salut WF

Anzeige
AW: Anzahl Teiler
08.05.2013 13:36:38
Erich
Hi Erhard,
diese Formeln sind (genauso lange) Varianten von WFs Formeln, ohne INDIREKT(). D1 ist keine Matrixformel:
 ABCD
1361369
2 218 
3 312 
4 49 
5 66 

Formeln der Tabelle
ZelleFormel
B1{=KKLEINSTE(WENN(REST(A$1;ZEILE(A$1:INDEX(A:A;KÜRZEN(A$1^0,5))))=0;ZEILE(A$1:INDEX(A:A;KÜRZEN(A$1^0,5)))); ZEILE())}
C1=A$1/B1
D1=SUMMENPRODUKT((REST(A$1;ZEILE(A$1:INDEX(A:A;KÜRZEN(A$1^0,5))))=0)*2)-(REST(A1^0,5;1)=0)
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Anzahl Teiler
08.05.2013 14:01:26
alifa
Hallo Erich,
zunächst werden die zu analysierenden Zahlen ermittelt. Dann soll jede einzeln auf WAHR geprüft werden. Die Anzahl der Teiler ist vorgegeben. Etwa diese Programmzeile soll da stehen: If AnzTeiler(Zahl)=5 Then.....Was ich suche, ist diese Funktion(hier mit "AnzTeiler" angedeutet). Mit der Zahl 414637 würde die Funktion WAHR erkennen.
Gruß, Erhard

AW: Anzahl Teiler
08.05.2013 14:23:45
Erich
Hi Erhard,
deine Zahl hat 8 Teiler:
 ABC
14146371414637
2 1921823
3 1392983
4 1572641

Formeln der Tabelle
ZelleFormel
B1{=KKLEINSTE(WENN(REST(A$1;ZEILE(A$1:INDEX(A:A;KÜRZEN(A$1^0,5))))=0;ZEILE(A$1:INDEX(A:A;KÜRZEN(A$1^0,5)))); ZEILE())}
C1=A$1/B1
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Hier etwas, das deine Liste ergeben könnte:
(Spalte E ist nur zu Info, C2:E2 kannst du nach unten kopieren)
 ABCDE
1Zahlvorg. AnzTest Anz. Teiler
24146378WAHR 8
3164FALSCH 5
443WAHR 3
521FALSCH 2

Formeln der Tabelle
ZelleFormel
C2=B2=SUMMENPRODUKT((REST(A2;ZEILE(A$1:INDEX(A:A;KÜRZEN(A2^0,5))))=0)*2)-(REST(A2^0,5;1)=0)
E2=SUMMENPRODUKT((REST(A2;ZEILE(A$1:INDEX(A:A;KÜRZEN(A2^0,5))))=0)*2)-(REST(A2^0,5;1)=0)

Wenn du das in VBA brauchst, wäre es gut, die Umgebung zu kennen...
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Anzahl Teiler
08.05.2013 19:46:45
alifa
Hallo Erich,
diese Funktion benötige ich für die Lösung einer Kreuzzahlaufgabe, in der die Stellenzahl und die Anzahl der Teiler der Zahlen gegeben ist. Meine Zahl(414637) hat tatsächlich 6 Teiler, ohne 1 und sich selbst. Hatte das glatt übersehen. Habe das gebastelt:

Function AnzTeiler(z, k) As Boolean 'k ist die vorgegebene Anzahl aller Teiler-2
Dim i&, n As Byte
n = 0
For i = 2 To Fix(z / 2)
If z Mod i = 0 Then n = n + 1
Next i
If n = k Then AnzTeiler = True
End Function

Danke für eure Beiträge! Verbesserungen nimm ich gerne zur Kenntnis!
Erhard

Anzeige
Anzahl Teiler - VBA
08.05.2013 20:47:52
Erich
Hi Erhard,
eine Beschleunigung kannst du dadurch erreichen, dass die Schleife nicht bis z/2, sondern nur bis WURZEL(z)
läuft. Hier ein paar Codes:

Option Explicit
Function AnzTeilerV(z, k) As Boolean ' k = vorgegebene Anzahl aller Teiler-2
Dim i As Long, n As Byte
For i = 2 To Fix(z / 2)
If z Mod i = 0 Then n = n + 1
Next i
If n = k Then AnzTeilerV = True
End Function
Function AnzTeilerOK(zz, kk) As Boolean ' kk = vorgegebene Anzahl aller Teiler-2
Dim ii As Long, nn As Byte
For ii = 2 To Fix(Sqr(zz)) - 1
If zz Mod ii = 0 Then nn = nn + 2
Next ii
nn = nn - (Sqr(zz) = Fix(Sqr(zz)))
AnzTeilerOK = nn = kk
End Function
Function AnzTeiler(zz) As Long
Dim ii As Long, nn As Byte
For ii = 2 To Fix(Sqr(zz)) - 1
If zz Mod ii = 0 Then nn = nn + 2
Next ii
nn = nn - (Sqr(zz) = Fix(Sqr(zz)))
AnzTeiler = nn
End Function
Function AnzTeilerOK2(zz, kk) As Boolean ' kk = vorgegebene Anzahl aller Teiler-2
AnzTeilerOK2 = AnzTeiler(zz) = kk
End Function
Und hier ein paar Excel-Beispiele:
 ABCDEFGHI
1Zahlvorg. AnzTest Anz. TeilerVBAAnzTeilerVAnzTeilerOKAnzTeilerOK2
24146376WAHR 66WAHRWAHRWAHR
3164FALSCH 33FALSCHFALSCHFALSCH
441WAHR 11WAHRWAHRWAHR
521FALSCH 00FALSCHFALSCHFALSCH

Formeln der Tabelle
ZelleFormel
C2=B2=SUMMENPRODUKT((REST(A2;ZEILE(A$1:INDEX(A:A;KÜRZEN(A2^0,5))))=0)*2)-(REST(A2^0,5;1)=0)-2
E2=SUMMENPRODUKT((REST(A2;ZEILE(A$1:INDEX(A:A;KÜRZEN(A2^0,5))))=0)*2)-(REST(A2^0,5;1)=0)-2
F2=AnzTeiler(A2)
G2=AnzTeilerV(A2;B2)
H2=AnzTeilerOK(A2;B2)
I2=AnzTeilerOK2(A2;B2)

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Anzahl Teiler - VBA
10.05.2013 09:21:31
alifa
Hallo Erich,
die Funktion AnzTeilerOK findet die Zahl 20 nicht(k-2=4), die AnzTeilerV findet sie, korrekterweise.
Die Abfrage: For a=20 to 23: If AnzTeilerOK(a,4) Then, gibt fälschlicherweise kein Ergebnis. Mit AnzTeilerV gibt es das korrekte Ergebnis, 20. Tatsächlich ist AnzTeilerV sehr,sehr langsam. Die Funktion
AnzTeilerOK2 funktioniert nicht, ein Argument wird vermisst. Oder verstehe ich etwas falsch?
LG Erhard

AW: Anzahl Teiler - VBA
10.05.2013 17:13:22
Erich
Hi Erhard,
in den Funktionen AnzTeiler und AnzTeilerOK war ein Fehler - die Schleife lief nicht weit genug,
weil das "-1" beim To falsch positioniert war.
Hier die korrigierten Fassungen:

Function AnzTeilerOK(zz, kk) As Boolean ' kk = vorgegebene Anzahl aller Teiler-2
Dim ii As Long, nn As Byte
For ii = 2 To Fix(Sqr(zz - 1))
If zz Mod ii = 0 Then nn = nn + 2
Next ii
nn = nn - (Sqr(zz) = Fix(Sqr(zz)))
AnzTeilerOK = nn = kk
End Function
Function AnzTeiler(zz) As Long
Dim ii As Long, nn As Byte
For ii = 2 To Fix(Sqr(zz - 1))
If zz Mod ii = 0 Then nn = nn + 2
Next ii
nn = nn - (Sqr(zz) = Fix(Sqr(zz)))
AnzTeiler = nn
End Function
Function AnzTeilerOK2(zz, kk) As Boolean ' kk = vorgegebene Anzahl aller Teiler-2
AnzTeilerOK2 = AnzTeiler(zz) = kk
End Function
Sub Kreuzz()
Dim a&, z%, t!, arrE() As Long
t = Timer
Cells.ClearContents
ReDim arrE(1 To 199999 - 100000 + 1)
For a = 100000 To 199999
'      If AnzTeilerV(a, 5) Then   ' ist langsam
If AnzTeilerOK2(a, 5) Then
'     If AnzTeilerOK(a, 5) Then
z = z + 1
arrE(z) = a
End If
Next a
ReDim Preserve arrE(1 To z)
Cells(1, 1).Resize(z) = Application.Transpose(arrE)
Columns(1).AutoFit
MsgBox Round(Timer - t, 1)
End Sub
Noch ein Tipp: Das "Columns(1).AutoFit" habe ich hinter die Schleife verschoben, das muss nur einmal laufen.
Ich wünsch dir und allen ein schönes Wochenende!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Anzahl Teiler - VBA
10.05.2013 18:37:05
alifa
Hi Erich,
jetzt passt das perfekt! Allerdings verstehe ich das noch nicht ganz. Werde mich noch damit befassen.
Recht schönen Dank und Grüße aus dem, zu dieser Jahreszeit am schönsten, Oberberg!
Erhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige