Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1900to1904
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

Zahl 30 in ersten 30 Zeilen

Zahl 30 in ersten 30 Zeilen
12.10.2022 16:20:49
Chris
https://www.herber.de/bbs/user/155631.xlsx
Hallo,
bitte helft mir, ich weiß das ist eher eine knifflige Sache und eher was für die Formelspezialisten aber ich hoffe jemand weiß trotzdem eine Formel für mich.
Mein Ziel ist die Spalte S zu berechnen.
Ein paar Erkläungen dazu, ich hoffe ihr blickt durch, falls nicht, fragt bitte nach.
Ich will in die ersten 30 Zeilen die Zahl 30 schreiben, welche folgende Bedingungen erfüllen:
1. Das Datum in Spalte C liegt nicht in der Zukunft.
2. Die Zahl in Spalte N ist kleiner gleich 30.
3. Der Text in Spalte A steht in keiner nachfolgenden Zeile, die ebenfalls eine Zahl in Spalte N kleiner gleich 30 enthält. Beispiel hierzu wären zb. die Zeilen 187 und 188, sie haben beide denselben Text in Spalte A und beide eine Zahl kleiner 30 in Spalte N, die Formel in Spalte S gibt aber nur in Zeile 188 die Zahl 30 aus.. Das selbe zb. in den Zeilen 196 und 198.
4. Eigentlich will ich ja nur in die ersten 30 Zeilen, die in Frage kommen die Zahl 30 schreiben, wie ihr aber seht, in der Bsp Datei sind es 31. Das Datum in der 30. Zeile (C280) ist der 9.7.21. Wenn es noch weitere Zeilen mit demselben Datum gibt die die Punkte 2 und 3 erfüllen, im Beispiel Zeile 281, soll auch in diese eine 30 geschrieben werden.
Hoffe ihr blickt durch, wenn nicht fragt bitte.
Gruß
Chris

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zahl 30 nach Bedingung
12.10.2022 17:08:06
NoNet
Hallo Chris,
gib die folgende Funktion in S2 ein (oder besser: zuerst in eine Hilfsspalte) und kopiere sie dann nach unten :

=WENN(UND(Tabelle4[@3]"";SUMMENPRODUKT((A4:A$999=A3) *(N4:N$999""))=0);30;"") 
Ich hoffe, das war die gesuchte Funktion :-D !
Salut, NoNet
AW: Zahl 30 nach Bedingung
12.10.2022 17:20:28
Chris
Hallo Nonet,
danke erstmal für deine Mühe.
leider nicht so ganz, schau dir bitte mal die Zeilen 187 bis 200 an als Beispiel.
Ich hatte ja noch erklärt weshalb in Zeile 187 keine 30 stehen soll, aus dem selben Grund soll auch in Zeile 196 und 197 nichts stehen.
Zum zweiten sollte die Formel nur 30mal die Zahl 30 ausgeben, danach nicht mehr, mit der einzigen Ausnahme dass es noch weitere Zeilen mit dem selben Datum gibt wie beim 30. mal, auf die die Bedingungen zutreffen.
Und das 3. ist du hast dich auf Zeile 4 als Startzeile festgelegt, wenn ich das richtig interpretiere. Die Anzahl der Zeilen mit Daten in der Zukunft kann sich künftig noch ändern.
Gruß
Chris
Anzeige
Einige Korrekturen ;-)
12.10.2022 18:17:22
NoNet
Hallo Chris,
so GAAANZ stimmen Deine Feststellungen ja nicht ;-)
1.)

Ich hatte ja noch erklärt weshalb in Zeile 187 keine 30 stehen soll,
Ja, das hatte ich berücksichtigt, daher steht in 187 auch keine Zahl :
Userbild

2.) Zum zweiten sollte die Formel nur 30mal die Zahl 30 ausgeben
Das hatte ich nicht ignoriert, aber versehentlich nur bis Zeile 200 getestet, bis dahin waren es in Deiner Datei nur 13 Zeilen auf die alle Bedingungen zutreffen. Die Korrektur kann man aber noch ergänzen (bitte in S2 eingeben) :

=WENN(ZÄHLENWENN(S$1:S1;30)"";SUMMENPRODUKT((A3:A$999=A2) *(N3:N$999""))=0);30;"");"") 

3. (...)du hast dich auf Zeile 4 als Startzeile festgelegt, 
Nööö, habe ich nicht - wie kommst Du darauf ? - Ganz im Gegenteil : Zeile 1 sind Überschriften, Zeile 2 beginnt die Tabelle. Lediglich das Ende habe ich auf Zeile 999 festgelegt - das kannst Du gerne nach Belieben erweitern ;-)
Salut, NoNet
Anzeige
AW: Einige Korrekturen ;-)
12.10.2022 18:58:29
Chris
Hallo Nonet,
vielen Dank, das kommt dem Ganzen schon deutlich näher. Aber erstmal komisch, dass deine Formel, welche ich in Spalte T in der folgenden Datei schreibe, in Zeile187 etwas anderes ausgibt als in deinem Screenshot.
In Spalte U steht jetzt deine zweite Formel, die unterscheidet sich immer noch in Zeile 281 von meinen Werten in Spalte S.
Ich drücke es vielleicht nochmal anders, vielleicht verständlicher aus, weshalb in S281 auch eine 30 steht, auch wenn es die 31. "30" in der Liste ist.
Stell dir vor, die texte in Spalte A stehen für Filmtitel (in Relität stehen sie auch dafür) und Spalte C ist das Veröffentlichungsdatum. Ich will die 30 jüngsten Filme, die bereits veröffentlicht sind und die Bedingung N kleiner gleich 30 erfüllen mit der Zahl 30 kennzeichnen.
Jetzt kann es aber sein, dass der 30. und der 31. Film in der Liste am selben Tag veröffentlicht wurden, daher will ich dann den 31. oder je nachdem wie viele an diesem Tag veröffentlicht wurden auch den 32. 33. usw. ebenfalls mit 30 kennzeichnen, solange sie halt am selben Tag wie der 30. veröffentlicht wurden.
https://www.herber.de/bbs/user/155640.xlsx
Gruß
Christian
Anzeige
zur Startzeile
12.10.2022 19:10:56
Chris
ich dachte, weil du in der Summenprodukt Formel von A4 und N4 gesprochen hast, aber du hast Recht das war mein Irrtum
kann mir da niemand mehr helfen? owT
13.10.2022 15:44:27
Chris
.
Formeln sind doof
13.10.2022 20:18:58
Yal
...besonders, wenn diese "nach dem 30ten vorkommen" aufhören sollen.
Ich habe es mit Power Query gemacht. Kein VBA.
Die Schritten:
_ Index eingeführt, um die Zeilennummer nachzubauen
_ die Prüfung Datum <= Heute und Wert <= 30
_ in einer separate (Verweis) Abfrage auf den Treffer gefiltert
_ gruppiert nach eindeutige Wert in Spalte1, dabei den Max-Zeilennummer behalten (Duplikate entfernen ist unter Power Query nicht sicher)
_ sortiert nach Zeilennummer,
_ die 30 erste Treffer behalten
_ für den einen "30" eingetragen
_ Join mit der ersten Abfrage
Fertig.
https://www.herber.de/bbs/user/155661.xlsx
Viel Spass damit.
VG
Yal
Anzeige
AW: Formeln sind doof
13.10.2022 20:40:16
Chris
Hallo Yal,
danke erstmal für die Mühe.
leider nicht so ganz, das Problem was ich bereits in Bezug auf Zeile 281 angesprochen habe, ist auch in deiner Lösung nicht gelöst.
Kurz gesagt, ich wollte dass auch auch 31., 32., 33. mal die 30 ausgegeben wird, wenn das Datum in diesen Zeilen dasselbe ist, wie bei der 30. Ausgabe der Zahl 30
Daher steht das 31. mal die 30 in der Tabelle, weil beim 30. mal (Zeile 280) und beim 31. mal (Zeile 281) beide male das selbe Datum (9.7.21) steht.
Mit der PQ Lösung habe ich leider noch ein weiteres Problem, ich lasse die Formeln in der Tabelle durch ein Makro berechnen a la
With .Columns(9)
.FormulaR1C1 = "=IF(RC[-2]="""","""",RC[-6]-RC[-3])"
.Formula = .Value2
End With
um jetzt einfach mal Spalte I als Beispiel zu nehmen.
Bei der Frage wie ich per Makro diese PQ Abfrage aktualisiere, hören meine VBA Kenntnisse auf. Gibt es denn einen Weg der mir erspart erst das Makro zu starten und dann nochmal zusätzlich die Abfrage zu aktualisieren? Eine Formel hätte ich einfach wie oben ins Makro eingefügt (und wie man eine "normale Formel" ins R1C1 Format bringt hätte ich auch gewusst).
Gruß
Christian
Anzeige
Na dann
13.10.2022 23:11:05
Yal
https://www.herber.de/bbs/user/155662.xlsx
getestet, in dem in den Zeile 287, 288, 289 das Datum 09.07.2021 und den Wert 10 gelegt wurde: es kommt ein 32te (287) und 33te (289) "30"
Berechnung auf derselben Zeile kannst Du mit Power Query besonders gut, auch wenn in dem Fall die Spalte 9 zuerst gelöscht wird um eine neue Spalte 9 als Ergebnis der Berechnung
= if [7] = "" then "" else [3] - [6]
Nur dass [3] ein Datum ist, was deren Berechnung eventuell das Nutzen von Date-Funktion wie Date.AddDays ([3], - [6])
https://learn.microsoft.com/de-de/powerquery-m/date-adddays
Der Einstieg in Power Query ist easy: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert
VG
Yal
Anzeige
AW: Na dann
13.10.2022 23:37:02
Chris
Hallo Yal,
ja das mit der PQ Lösung passt so, danke für die viele Mühe und Geduld
du hast ja vielleicht gesehen, dass Spalte I nur ein Bsp. war. Sag wenn ich falsch liege, aber ich hab das Gefühl du willst darauf hinaus das ganze Makro durch eine PQ Abfrage zu ersetzen. Ich habe mir bei der Bitte um eine Formellösung gedacht, dass dies das einfachste ist, in die bestehende Strukturen einzubauen. Wir reden von einer Tabelle, die alleine auf diesem Blatt 16 Formeln hat, die durchaus komplexer sind als die eine jetzt in Spalte I, außerdem später mal wenn sie fertig ist 4 Makros, und 12 PQ Abfragen. Für all das hat bei meinen jetzigen Planungen nur diese eine Formel gefehlt.
Jetzt anzufangen aus diesem Makro zum Berechnen der Formeln eine einzge PQ Abfrage zu bauen, wird denke ich aufgrund der Komplexität auch für einen Profi sehr aufwändig.
Also bleiben für mich eigentlich nur 3 Lösungen
1. Ich schreibe die "30" von Hand in die Tabelle, mit der Gefahr das ich was übersehe
2. ich nutze das bisherige Makro bis einschließlich Spalte R und starte für Spalte S aus dem Makro heraus deine PQ Abfrage oder
3. es gibt doch eine Formel mit der ich das berechnen kann.
Hier mal das gesamte Makro, damit du mal einen Einblick bekommst was da bei einer Umsetzung in PQ von Nöten wäre (und ja das Makro bezieht sich auch auf Blätter, von denen in der Bsp. Datei keine Rede war, nur da ich an den bestehenden Formeln auch nichts ändern wollte, sah ich auch keine Notwendigkeit, davon etwas zu posten).

Sub Ergebnis()
Dim loLetzte As Long, j As Long, x As Long, lC As Long
Application.ScreenUpdating = False
With Worksheets("Ergebnis").ListObjects(1).DataBodyRange
With .Columns(2)
.NumberFormat = "General"
.FormulaR1C1 = "=XLOOKUP(RC[-1],Filme!R2C1:INDEX(Filme!C[-1],neue!R1C[3]),Filme!R2C2:INDEX(Filme!C,neue!R1C[3]),"""",0,1)"
.NumberFormat = "@"
.Formula = .Value2
End With
With .Columns(3)
.FormulaR1C1 = "=IF(XLOOKUP(RC[-2],Filme!R2C1:INDEX(Filme!C[-2],neue!R1C[2]),Filme!R2C3:INDEX(Filme!C,neue!R1C[2]),"""",0,1)="""",0,XLOOKUP(RC[-2],Filme!R2C1:INDEX(Filme!C[-2],neue!R1C[2]),Filme!R2C3:INDEX(Filme!C,neue!R1C[2]),"""",0,1))"
.Formula = .Value2
End With
With .Columns(5)
.FormulaR1C1 = "=XLOOKUP(RC[-1],Leute!R2C1:INDEX(Leute!C[-4],neue!R2C),Leute!R2C2:INDEX(Leute!C[-3],neue!R2C),"""",0,1)"
.Formula = .Value2
End With
With .Columns(6)
.FormulaR1C1 = "=IF(XLOOKUP(RC[-2],Leute!R2C1:INDEX(Leute!C[-5],neue!R2C[-1]),Leute!R2C3:INDEX(Leute!C[-3],neue!R2C[-1]),"""",0,1)="""","""",XLOOKUP(RC[-2],Leute!R2C1:INDEX(Leute!C[-5],neue!R2C[-1]),Leute!R2C3:INDEX(Leute!C[-3],neue!R2C[-1]),"""",0,1))"
.Formula = .Value2
End With
End With
With Worksheets("Ergebnis")
loLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("C2:C" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlDescending, DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("F2:F" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A2:R" & loLetzte)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
With Worksheets("Ergebnis").ListObjects(1).DataBodyRange
With .Columns(7)
.FormulaR1C1 = "=IF(OR(RC[-4]=0,RC[-1]=""""),"""",IF(RC[-1]>RC[-4],0,DATEDIF(RC[-1]+1461000,RC[-4]+1461000,""Y"")))"
.Formula = .Value2
End With
With .Columns(8)
.FormulaR1C1 = "=IF(RC[-1]="""","""",IF(RC[-2]>RC[-5],0,DATEDIF(RC[-2]+1461000,RC[-5]+1461000,""YD"")))"
.Formula = .Value2
End With
With .Columns(9)
.FormulaR1C1 = "=IF(RC[-2]="""","""",RC[-6]-RC[-3])"
.Formula = .Value2
End With
With .Columns(10)
.FormulaR1C1 = "=IF(RC[-3]="""","""",RANK(RC[-1],R2C9:INDEX(C[-1],neue!R3C[-5]),1))"
.Formula = .Value2
End With
With .Columns(11)
.FormulaR1C1 = "=IF(RC[-4]="""","""",IF(COUNTIF(RC[-7]:INDEX(C[-7],neue!R3C5),RC[-7])=1,RC[-5],""""))"
.Formula = .Value2
End With
With .Columns(12)
.FormulaR1C1 = "=IF(IF(RC[-9]=0,"""",MAX(RC[-6]:INDEX(C[-6],neue!R3C5)))=0,"""",IF(RC[-9]=0,"""",MAX(RC[-6]:INDEX(C[-6],neue!R3C5))))"
.Formula = .Value2
End With
With .Columns(13)
.FormulaR1C1 = "=IF(COUNTIF(RC[-2]:INDEX(C[-2],neue!R3C5),"">0"")30),"""",DATEDIF(RC[-2],RC[-12],""Y""))"
.Formula = .Value2
End With
With .Columns(16)
.FormulaR1C1 = "=IF(RC[-1]="""","""",DATEDIF(RC[-3],RC[-13],""YD""))"
.Formula = .Value2
End With
With .Columns(17)
.FormulaR1C1 = "=IF(RC[-2]="""","""",RC[-14]-RC[-4])"
.Formula = .Value2
End With
With .Columns(18)
.FormulaR1C1 = "=IF(AND(RC[-4]0),""MRS ""&IF(RC[-9]

Anzeige
AW: Na dann
14.10.2022 09:48:36
Yal
Moin Chris,
eine schnelle Analyse (werde heute wenig Zeit haben):
Daten kommen erst nur in Spalte1. Diese Daten kommen wahrscheinlich aus einer Textdatei: hier wäre PQ zu Hause.
Die Formeln für Spalten 2,3, 5,6 sind SVerweis, also in Datenbanksprache "Joins". Hier ist PQ besonders geeignet.
Dann erfolgt einen Sortierung. Auch PQ-tauglich.
Formel in 7,8,9 sind innerhalb einer Zeilen ("in der Datensatz"). PQ kann's gut.
Formel 10,11,12,13,14 mit Bezug auf andere Quelle. Muss ich in Detail anschauen, aber im Prinzip not a problem: Join + Formel. Hilfespalte werden in PQ oft eingebaut/berechnet, verwendet und wieder gelöscht. Wichtig ist nur das Endergebnis. Wenn diese andere Quelle auch als externe Dateien vorliegen (ideal: csv), Plus-Punkte für PQ.
Formel 15,16,17,18 auch innerhalb eines Datensatzes.
Dann 19, das Thema wie bisher: temporäre Kopie/Verweis, Endergebnis wieder joinen.
Und am Ende alles durch Wert erstzen. PQ kann keine Formel herausgeben, nur Werte.
Ich sage nicht, dass mit Power Query alles besser ist, nur das es machbar ist. Bei reiner Datenhandlung ist es mit VBA auf lange Sicht "teuerer".
Aber es muss auch gelernt werden. Und Punkt 19 ist eben nicht so einfach wie den anderen (obwohl: Siehe Beschriebung) und wenn Du dich mit VBA wohler füllst, dann VBA.
Wenn Du das Ersetzen der Formel durch Wert nur einmal am Ende machst, könntest Du den Code wie folgt kompakter machen:

Sub Ergebnis()
Dim loLetzte As Long, j As Long, x As Long, lC As Long
Application.ScreenUpdating = False
With Worksheets("Ergebnis").ListObjects(1).DataBodyRange
With .Columns(2)
.NumberFormat = "General"
.NumberFormat = "@"
.Formula = .Value2
End With
.Columns(2).FormulaR1C1 = "=XLOOKUP(RC[-1],Filme!R2C1:INDEX(Filme!C[-1],neue!R1C[3]),Filme!R2C2:INDEX(Filme!C,neue!R1C[3]),"""",0,1)"
.Columns(3).FormulaR1C1 = "=IF(XLOOKUP(RC[-2],Filme!R2C1:INDEX(Filme!C[-2],neue!R1C[2]),Filme!R2C3:INDEX(Filme!C,neue!R1C[2]),"""",0,1)="""",0,XLOOKUP(RC[-2],Filme!R2C1:INDEX(Filme!C[-2],neue!R1C[2]),Filme!R2C3:INDEX(Filme!C,neue!R1C[2]),"""",0,1))"
.Columns(5).FormulaR1C1 = "=XLOOKUP(RC[-1],Leute!R2C1:INDEX(Leute!C[-4],neue!R2C),Leute!R2C2:INDEX(Leute!C[-3],neue!R2C),"""",0,1)"
.Columns(6).FormulaR1C1 = "=IF(XLOOKUP(RC[-2],Leute!R2C1:INDEX(Leute!C[-5],neue!R2C[-1]),Leute!R2C3:INDEX(Leute!C[-3],neue!R2C[-1]),"""",0,1)="""","""",XLOOKUP(RC[-2],Leute!R2C1:INDEX(Leute!C[-5],neue!R2C[-1]),Leute!R2C3:INDEX(Leute!C[-3],neue!R2C[-1]),"""",0,1))"
End With
With Worksheets("Ergebnis")
loLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
With .Sort
.SortFields.Clear
.SortFields.Add Key:=.Range("C2:C" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlDescending, DataOption:=xlSortNormal
.SortFields.Add Key:=.Range("F2:F" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A2:R" & loLetzte)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
With Worksheets("Ergebnis").ListObjects(1).DataBodyRange
.Columns(7).FormulaR1C1 = "=IF(OR(RC[-4]=0,RC[-1]=""""),"""",IF(RC[-1]>RC[-4],0,DATEDIF(RC[-1]+1461000,RC[-4]+1461000,""Y"")))"
.Columns(8).FormulaR1C1 = "=IF(RC[-1]="""","""",IF(RC[-2]>RC[-5],0,DATEDIF(RC[-2]+1461000,RC[-5]+1461000,""YD"")))"
.Columns(9).FormulaR1C1 = "=IF(RC[-2]="""","""",RC[-6]-RC[-3])"
.Columns(10).FormulaR1C1 = "=IF(RC[-3]="""","""",RANK(RC[-1],R2C9:INDEX(C[-1],neue!R3C[-5]),1))"
.Columns(11).FormulaR1C1 = "=IF(RC[-4]="""","""",IF(COUNTIF(RC[-7]:INDEX(C[-7],neue!R3C5),RC[-7])=1,RC[-5],""""))"
.Columns(12).FormulaR1C1 = "=IF(IF(RC[-9]=0,"""",MAX(RC[-6]:INDEX(C[-6],neue!R3C5)))=0,"""",IF(RC[-9]=0,"""",MAX(RC[-6]:INDEX(C[-6],neue!R3C5))))"
.Columns(13).FormulaR1C1 = "=IF(COUNTIF(RC[-2]:INDEX(C[-2],neue!R3C5),"">0"")30),"""",DATEDIF(RC[-2],RC[-12],""Y""))"
.Columns(16).FormulaR1C1 = "=IF(RC[-1]="""","""",DATEDIF(RC[-3],RC[-13],""YD""))"
.Columns(17).FormulaR1C1 = "=IF(RC[-2]="""","""",RC[-14]-RC[-4])"
.Columns(18).FormulaR1C1 = "=IF(AND(RC[-4]0),""MRS ""&IF(RC[-9]
(ich hoffe, ich habe keinen Tippfehler eingebaut)
Ich habe übrigens eine Fehler in der Datei: ich nehme den Werte in der Zeile "30", um alles was gleiche Datum oder jünger ist mit einem "30" zu belegen. Da die Zeilnnummer mit 0 anfangen, sollte es 29 sein.
Menü "Daten", "Abfrage anzeigen", Abfrage "Tabelle4 (3)" rechtsklicken und "bearbeiten". In PQ-Editor auf "erweiterter Editor" und Zeile
Date30 = #"Hinzugefügter Index"[3]{30},
in
Date30 = #"Hinzugefügter Index"[3]{29},
ändern.
Der Fehler ist mir nicht aufgefallen, weil beide dieselbe Datum haben (die berühmte Zeilen 280 und 281).
VG
Yal
Anzeige
AW: Na dann
14.10.2022 10:03:02
Chris
Hallo Yal,
erstmal danke. Mein Zeitplan ist heute ebenfalls total voll, dass ich auch heute eher wenig Zeit haben werde, also gar nicht mal so schlimm wenn es bis morgen dauert. Zum ausgiebigen testen und Ändern deines Vorschlags werde ich vermutlich auch erst morgen kommen.
Aber vorweg eine kurze Frage am Rande. Der Grund weshalb ich das Makro nutze anstatt die Formeln in die Tabelle zu schreiben ist ja der dass sich die Ergebnisse der Formeln nur dann ändern, wenn sich auch die Datenquelle sprich der Inhalt der Tabelle Leute und Filme ändert. Wenn ich sie in die Tabelle schreiben würde, würden sie auch bei jeder anderen Änderung, die nichts mit den Formeln zu tun hat neu berechnet werden, was bei einer aktuellen Berechnungszeit von 12 Sekunden dann bei jeder Änderung sehr zeitaufwändig würde. Meine Frage wäre dann, wenn ich die Werte erst zum Schluss einfüge, verlängert sich dadurch nicht die Zeit die das Makro zum Ausführen braucht, weil z.b. wenn Spalte 18 berechnet wird, immer noch auch die Formeln der vorherigen Spalten in der Tabelle stehen und berechnet werden wollen?
Eine Sache müsste bei einer PQ Lösung jedoch noch bedacht werden, die Blätter Filme und Leute muss man als komplette Liste ansehen, während im Blatt Ergebnis nur eine Auswahl nach persönlichen Vorlieben davon steht. Die Auswahl meiner persönlichen Vorlieben kann mir kein Makro, keine Formel und keine PQ Abfrage abnehmen.
Wie du an dem Makro siehst, stehen in dem Makro in Spalte A und D keine Formeln. Diese beiden Spalten fülle ich von Hand um eben diese Auswahl treffen zu können. Diese Möglichkeit muss auch in einer PQ Lösung weiterhin gegeben sein.
Gruß
Christian
Anzeige
aber was spricht dagegen...
14.10.2022 10:16:55
Chris
meine Struktur mit dem Makro beizubehalten und wie ursprünglich geplant eine weitere Formel einzufügen.
Hinter dem was in dem Makro steht, steckt eine Tabelle die ich seit 10 Jahren nutze, die immer weiter an meine Bedürfnisse angepasst wurde, immer mit neuen Ideen erweitert wurde und ganz wichtig es ist eine Lösung, die ich aus eigener Kraft anpassen kann. Da jetzt PQ einzubauen führt dazu, dass ich es nicht mehr aus eigener Kraft kann. Außerdem fürchte ich, dass dies ein Fass ohne Boden wird, weil jede einzelne Formel so viele Zwecke erfüllt, was ich damit erreichen will, z.B. die Gründe weshalb ich das Zellformat bei der ersten Formel ändere oder die Gründe weshalb ich sie nur unter bestimmten Vorraussetzungen berechne und ansonsten "" ausgebe, genauso wie die weiteren Blätter, deren Formeln sich wiederum auf die Formelergebnisse dieser Tabelle beziehen, bis das alles umgesetzt ist fürchte ich sind wir alt und mit den Nerven am Ende.
Wie schonmal gesagt, ich hab mir zu Beginn was dabei gedacht, das Ganze lediglich um eine Formel zu erweitern.
AW: aber was spricht dagegen...
14.10.2022 12:04:13
Yal
Hallo Chris,
Es ist im Prinzip immer das gleiche Rezept: lesen, transformieren, ablegen. In Fachjargon ETL: Extract-Transform-Load.
Dass das mit einer Formel, die anschliessend gefreezed, ober einen VBA, oder eine PQ-Abfrage, die mit Rechtsklick auf "Aktualisieren" die geänderte Quelldaten oder Eingabe berücksichtig, ist alles gleich.
Du verwendest was Du beherrschst und es ist richtig so. Meine Idee war nur eine andere Möglichkeit zu präsentieren.
Für deinen Fall, jetzt dass ich weiß, dass Du eine Makro verwendest, um Formel einzutragen und anschliessend durch Wert zu ersetzen, wäre die logischste Variante, VBA zu verwenden, um die richtige Stelle für den 30 zu ermitteln. Aber den Weg über ein Formel halte ich für wenig geeignet. Hier müsste man in VBA genau entweder den PQ-Weg nachbauen, oder verschiedenen Hilfspalte erzeugen, die danach wieder gelöscht werden. Aber hier auch wird es sich wahrscheinlich ausserhalb deiner Komfortzone bewegen.
Zum Thema Performance: Excel benutzt eine Markierung, um zu wissen, was neuzurechnen ist und was nicht. Jede deiner Formel wird nur einmal berechnet. Es könnte aber einige Beschleuniger im Code eingebaut werden.
VG
Yal
mal ein Vorschlag von mir...
14.10.2022 20:13:34
mir...
... hatte ja heute nen ganzen Tag Zeit zum Grübeln
les ihn dir doch einfach mal durch, vielleicht lässt er sich in die Tat umsetzen, wenn ja benötigt es neben der Formel im Makro nur eine kleine Nebenrechnung, die wie andere Nebenrechnungen ja auch schon im Blatt "neue" stattfinden kann.
Die Idee ist folgende, wir können 3 Dinge voraussetzen.
1. Wir haben ein Blatt Ergebnis, dass durch das Makro nach Spalte C also dem Datum sortiert ist.
2. Da es sich bei den Texten in Spalte A um Codes für Filmtitel handelt und es für einen Filmtitel nur ein Datum der Erstveröffentlichung gibt, kann man auch sicher sagen, selber Text = selbes Datum.
3. Wir haben die Formel von Nonet, die ja bis zur 30. Ausgabe der Zahl 30 alles korrekt berechnet, es fehlt nur das was danach kommt.

=WENN(ZÄHLENWENN(S$1:S1;30)"";SUMMENPRODUKT((A3:A$999=A2)  *(N3:N$999""))=0);30;"");"") 
Jetzt zu meiner Idee, wir machen eine Nebenrechnung, in der wir die Zeile bestimmen, in der diese Formel das 30. mal die Zahl 30 ausgibt und geben das Datum aus das in dieser Zeile steht.
Wir streichen dann das Zählenwenn aus der Formel und setzen Datumsgrenzen stattdessen

=WENN(UND([@3]=XXX;[@14]"";SUMMENPRODUKT((A3:A$999=A2) *(N3:N$999""))=0);30;"");"")
wobei xxx für das zuvor ermittelte Datum steht.
Hoffe du kannst nachvollziehen was ich meine, wäre das umsetzbar?
zu deinem geänderten Makro
15.10.2022 10:22:39
Chris
Hallo Yal,
habe jetzt auch mal das Makro getest es sagt leider "Objekt unterstützt diese Eigenschaft oder Methode nicht."
Und danach steht in Spalte B das was eigentlich die Formel sein soll als Text.
Was ich auch nicht verstehe, warum hast du das Ändern des zellformats und das Berechnen der Formel für Spalte B voneinander getrennt.
Hintergrund dessen dass ich das gemacht habe, war es gibt Filmtitel (die realen Filmtitel in Spalte B) die heißen z.b. 12/12/12 oder 3% und stehen auch so in der CSV Datei und im Blatt "Filme".
Die Änderung des Zellformats hab ich deshalb gemacht, damit dies auch so bleibt und nicht die Formel 12.12.2012 oder 0,03 daraus macht.
Bei deinem Makro wurde das Format jedoch wieder zurückgeändert bevor die Formel berechnet wird, in meinem Makro berechne ich die Formel zwischen den beiden Änderungen des Formats.
Gruß
Christian
PS: Mit der Änderung der PQ Abfrage von 30 in 29 hab ich mich bislang noch nicht beschäftigt, da wir im Moment ja auf eine VBA Lösung hinauswollen. Schau dir bitte aber auch mal meinen Lösungsvorschlag von gestern abend an.
Und wenn du wie erwähnt einen Vorschlag hast das Makro zu beschleunigen, immer gerne her damit.
bekomme ich jetzt keine Antwort mehr, Yal? owT
17.10.2022 14:27:34
Chris
.
Antwort
17.10.2022 19:26:28
Yal
Moin,
ich erlaube mir am Wochenende, fern vom Rechner zu bleiben. Höchsten gebe ich kurze Antwort über den Smartphone. Da habe ich kein Excel.
Meine Schwierigkeit mit deiner Frage, ob die Formel geeignet wäre, um das gewünschte Ergebnis zu liefern, ist, dass jede Werkzeug sein bevorzugte Aufgaben hat. Man kann bestimmte Problem am besten mit einem Formel lösen (und solche Problem sind alle mit Power Query lösbar), andere wiederum besser mit VBA. Solang deine Informationsverarbeitung leicht mit Formeln zu machen war, war VBA nur für eine bequeme Wiederholung zustandig. Mehr nicht.
Die Aufgabe der Verteilung von 30 mal "30" plus alle, die noch direkt anschliessend dieselbe Datum wie der letzte "30", wäre ein Fall gewesen, wo VBA mehr bringen kann als die Formeln. Der Weg über Formeln halte ich für unnötig kompliziert.
Übrigens: mit FormulaLocalR1C1 kannst Du eine deutsche Formel per VBA in einer Zelle übergeben.
Ich kann dein Code nicht testen, weil es eine Tabelle "neue" verlangt, die ich nicht habe.
Ich habe .Columns(2) in 2 Teile getrennt, weil der erste Block nur die .Columns(2) und der zweite verschiedenen. Dementsprechend sind unterschiedlichen "With" vorangestellt. Die Formeln gehören zusammen. Der erste Block ist die Ausnahme.
Die Behandlung könnte wie folgt aussehen:

Sub Markierung30_einfügen()
Dim L As ListRow
Dim D
Dim i As Long
Dim LetzteDatum
Set D = CreateObject("Scripting.Dictionary")
With Worksheets("Ergebnis").ListObjects(1)
'Die Zeilnummer sammeln, wo die Bedingung trifft
For Each L In .ListRows
If CDate(L.Range(3).Value)  "" And L.Range(14).Value 
Aber ich befürchte, dass Du damit nicht zurecht kommst. Da ist das Verstehen von Power Query wesentlich einfacher.
VG
Yal
AW: Antwort
17.10.2022 21:12:41
Chris
Hallo Yal,
sorry erstmal für meine Ungeduld. Ich hoffe du hattest ein erholsames Wochenende
https://www.herber.de/bbs/user/155723.xlsm
damit müsstest du das Makro testen können, falls du die CSV Dateien brauchst hab ich die Links nochmal im Blatt neue hinterlegt.
Dein jetziges Makro macht leider gar nichts mit Spalte S, egal ob ichs ins Blatt oder in ein Modul packe. Fehlermeldung kommt auch keine. Habs jedenfalls in diesem Beispiel im Blatt stehen.
Gut da ich inzwischen mit der Datei weitergearbeitet hab, haben sich die Einträge geändert, jedoch das Prinzip dass ich erreichen will bleibt dasselbe.
Prinzipiell habe ich nichts dagegen, die Spalte S statt durch eine Formel durch einen VBA Code zu testen, es ist ja auch möglich, diesen Code in den anderen einzubauen bzw. das neue Makro aus dem alten heraus zu starten. Solange es funktioniert, nehme ich auch so eine Lösung.
Zu Formula Local, als ich die Formeln damals ins Makro eingefügt hatte, meine ich irgendwo hier im Forum gelesen zu haben, dass FormulaLocal und Datedif sich nicht vertragen, daher hatte ich damals die R1C1 Schreibweise gewählt und ums einheitlich zu haben dann auch überall nicht nur in den Spalten mit Datedif.
Ich hatte versucht, meinen Vorschlag selbst zu testen, habe blöderweise diese Datei gelöscht. Aber das Ergebnis war, dass es ohne Makro funktioniert hat, aber als ich es dann in gewohnter Manier ins Makro eingetragen habe, hats gedauert, gedauert und irgendwann kam dann ein Fehler 400.
Viele Grüße
Chris
AW: Antwort
18.10.2022 08:54:35
Yal
Hallo Chris,
ganz kurz vor dem vollen Arbeitstag...
DateDiff nimmt als erste Parameter einen String, das definiert, in welcher Granularität die Antwort gegeben werden soll: Monate, Tage, Stunde, Minuten. Da dieses Zeichen fest aber unterschiedlich zwischen deutsch und englisch kommt es zu einer Inkompatibilität. Da es um Tage geht, braucht man DateDiff nicht: Daten in Long konvertieren ( cLng () ) und das eine minus das andere. Fertig.
Die Spalte S muss zuerst in der aktive Tabelle eingeführt werden, bevor diese als Teil der Tabelle verwendet werden kann. Sonst kommt eine Fehler bei .ListRows(D(i)).Range(19) , weil das ListObject nur 18 Spalten hat. Füge eine Spalte rechts der Tabelle unter laufenden Makrorekorder, dann hast Du den notwendigen Code.
Makrorekorder ist grundsätzlich die erste Adresse für VBA-Anfänger (aber nicht nur: ich benutze es weiterhin regelmässig)
VG
Yal

258 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige