607 Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

ich habe folgende Frage:

Mit einer Formel soll die Anzahl der Zellen einer Zeile, die eine Primzahl (zw. 1 -100) enthalten (nicht das Ergebnis der Addition dieser Primzahlen) zusammengezählt und das Ergebnis ausgegeben werden.

Bsp:
3 4 5 6 7 [Ausgabe:] 2

Ich habe es mit IST und ODER-Funktionen probiert, aber ohne Erfolg.

Hat jemand eine Lösung, die wie beschrieben und mit versch. math. Abwandlungen funktioniert?

Danke im Voraus

9 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo exlassi,

es wird schwierig, deine Anforderungen komplett zu erfüllen.
Wenn die Anzahl der Primzahlen aus der Menge 3,4,5,6,7 gezählt werden und dabei das Ergebnis 2 sein soll, gibt es ein Problem :-)


Ein Lösung für Excel hätte ich, die nicht sehr elegent dargestellt ist und sicher optimiert werden kann, aber sie funktioniert:
Angenommen die zu testenden Zahlen stehen in der Zeile 1, beginnend mit A1, dann schreibst du in Zelle A2 die Formel
=WENN(SUMME(WENN(REST(A1;ZEILE(INDIREKT("2:"&A1-1)));0;1));"0";"1")

und ziehst diese Formel in Zeile 2 nach rechts.
Jetzt steht unter jeder Primzahl eine 1, unter den Nicht-Primzahlen eine 0
Schließlich lässt du nur noch die Summe über Zeile 2 bilden und hast das Ergebnis.

Die Formel für die Primzahl ist übrigens nicht meine Erfindung. Ich habe sie hier gefunden:
www.excelformeln.de/formeln.html?welcher=129

Gruß
computerschrat
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Die zusätzliche Zeile kannst du ja ausblenden wenn sie in der Optik
stört.

Gruß Flupo
0 Punkte
Beantwortet von
Hallo,
Danke für den Tipp. Er geht aber leider an der Anforderung vorbei.
Vielleicht habe ich es nicht verständlich genug gemacht.
Es handelt sich um Listen mit mehreren tausend Zeilen und in jeder Zeile können unterschiedlich viele Zellen mit je einer Zahl von 1-∞ stehen.
Annahme:
Es gibt 1000 Zeilen mit 10 Spalten. In jeder Zelle steht eine Zahl (zw. 1 und ∞)
Bsp. anhand einer Zeile:
2 7 12 19 22 27 31 42 50 63
Nun sollte in der 11‘ten Spalte jeder Zeile die Anzahl aller Primzahlen (1-100) in diesen 10 Spalten dieser Zeile ausgegeben werden.
Im obigen Beispiel wäre das Ergebnis: 3, da sich 3 Primzahlen in dieser Zeile befinden.

Es wäre bei dieser Datenfülle nicht machbar, nach jeder Zeile eine weitere zur Berechnung einzufügen.

Ich dachte es gibt vielleicht die Möglichkeit über einen Zwischenschritt, sodass z.B. in Spalte 11-20 jeder Zeile die Primzahlen eruiert werden und in einer weiteren Spalte (Nr.21) das Ergebnis ausgegeben wird.
Mir fehlt dabei einfach nur die Idee, wie diese Formel aussehen müßte, die die Anzahl an Primzahlen erkennt und als Zwischenschritt in die Spalten 11-20 einfügt.
Das oben angeführte Bsp. könnte dann so aussehen:

2 7 12 19 22 27 31 42 50 63 0 1 0 1 0 0 1 0 0 0 3

Natürlich wäre es praktischer und eleganter, wenn sich eine Lösung mit ein bis zwei Spalten zur Auswertung finden läßt.

Danke für Eure Bemühungen

Grüße
exlassi
0 Punkte
Beantwortet von
Hallo,

Sorry, das war keine Intelligenzleistung von mir.
Die angebotene Lösung entspricht ja genau dem, was ich gerade zuvor geschrieben habe.
Hatte sie nur durchdacht und nicht probiert.

Vielleicht gibt es trotzdem noch einfachere Lösungen, die man auch ohne viel Aufwand mathematisch abwandeln kann.

Grüße
exlassi
0 Punkte
Beantwortet von
Ein Problem gibt es aber mit dieser Formel.
Es läßt sich keine Summe bilden, selbst dann nicht wenn man die Ergebnisse kopiert und im 'nur Werte'-Modus einfügt.
Seltsamer Weise bleibt im Hintergrund eine Verknüpfung mit den Zellen der Formeln bestehen.
Hab' ich so auch noch nicht gesehen.

Grüße
exlassi
0 Punkte
Beantwortet von
Hallo exlassi :-)

Wie gewünscht!

Gruss Nighty

Sub DeinMakro()
Dim QuellDaten() As Variant, ZielDaten() As Variant
Dim ZeilenLauf As Long, Lzeile As Long
Dim SpaltenLauf As Integer
Lzeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Range("K1:U" & Lzeile).Clear
QuellDaten = Range("A1:J" & Lzeile)
ZielDaten = Range("K1:U" & Lzeile)
For ZeilenLauf = 1 To Lzeile
For SpaltenLauf = 1 To 10
If IstPrim(Val(QuellDaten(ZeilenLauf, SpaltenLauf))) = True Then
ZielDaten(ZeilenLauf, SpaltenLauf) = 1
SummeA = SummeA + 1
Else
ZielDaten(ZeilenLauf, SpaltenLauf) = 0
End If
If SpaltenLauf = 10 Then ZielDaten(ZeilenLauf, 11) = SummeA
Next SpaltenLauf
SummeA = 0
Next ZeilenLauf
Range("K1:U" & Lzeile) = ZielDaten
End Sub

Function IstPrim(zahl As Integer) As Boolean
Dim Zaehler As Integer
IstPrim = True
If zahl <= 1 Then
IstPrim = False
Else
If (zahl Mod 2) = 0 Then
IstPrim = False
Else
For Zaehler = 3 To zahl - 1
If (zahl Mod Zaehler) = 0 Then
IstPrim = False
End If
Next Zaehler
End If
End If
End Function
0 Punkte
Beantwortet von
Hallo Community .-)

Ohne Schleife!

Gruß Nighty

Sub DeinMakro()
Range(Cells(1, 11), Cells(ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row, 20)).FormulaR1C1 = "=IstPrim(RC[-10])"
Range(Cells(1, 21), Cells(ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row, 21)).FormulaR1C1 = "=COUNTIF(RC[-10]:RC[-1],1)"
Range(Cells(1, 11), Cells(ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row, 21)).Copy
Range(Cells(1, 11), Cells(ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row, 21)).PasteSpecial Paste:=xlValues, Operation:=xlNone
Application.CutCopyMode = False
Cells(1, 1).Activate
End Sub

Function IstPrim(zahl As Integer) As Integer
Dim Zaehler As Integer
IstPrim = 1
If zahl <= 1 Then
IstPrim = 0
Else
If (zahl Mod 2) = 0 Then
IstPrim = 0
Else
For Zaehler = 3 To zahl - 1
If (zahl Mod Zaehler) = 0 Then
IstPrim = 0
End If
Next Zaehler
End If
End If
End Function
0 Punkte
Beantwortet von
Hallo,

Danke an Nighty für das Script.
Kann es aber leider im Moment nicht brauchen, da ich mit einer Starter-Version arbeite, die keine Makros zulässt.
Deshalb wollte ich es mit einer Formel lösen.
Werde mir jetzt wohl eine Office-Vollversion zulegen müssen. :-)
0 Punkte
Beantwortet von
Hallo Community .-)

Ich dachte eigentlich an Application.Evaluate statt Copy > Werte,hatte nur zuwenig zeit mich damit zu beschäftigen!
Wären schonmal wieder 3 zeilen weniger .-)

Gruß Nighty
...