Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

WENN Formel erweitern

Forumthread: WENN Formel erweitern

WENN Formel erweitern
26.01.2025 09:03:14
Christian
Hallo,

gibt es eine Formel, die folgendes macht?

1. In jede Zeile, in der der Text in Spalte C mit einem " beginnt, eine 3 schreiben
2. In jeweils der letzten Zeile davor, in der Spalte C leer ist eine 1 schreiben
3. In alle Zeilen dazwischen eine 2.
4. In allen anderen Zeilen soll nichts ausgegeben werden.

So soll das Ergebnis aussehen:

https://www.herber.de/bbs/user/175267.xlsx

Noch als kleine Info:

1. Keiner der beliebigen Texte beginnt mit einem "
2. Da wo in der Beispieldatei in Spalte C Leerzellen sind, befinden sich auch im Original Leerzellen.




Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: WENN Formel erweitern
26.01.2025 09:14:59
Eifeljoi 5
Hallo

Ich sage mal so:
Wenn es um genau bestimmte Texte geht, dann kenne ich eine Lösung mit PQ.
Weil ich den Sinn für so was nicht verstehe bzw. das Gesamt Konzept nicht kenne werde ich keine Lösung anbieten, die nachher im Endprodukt nicht passt.
=2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 09:55:24
BoskoBiati2
Gruß

Edgar
AW: mit Formel die Auswertung von unten her "aufzäumen" ...
26.01.2025 14:10:23
neopa C
Hallo Christian,

... folgende einfache Formel in D1 eingesetzt und als solche nach unten kopiert, ermittelt auch korrekt bei "Sonderfällen".

=WENN(LINKS(C1;1)="""";3;WENN((D2="")+(D2=1);"";D2-(C1>"")*(D2>2)-(C1="")))

Allerdings wenn Du wirklich Millionen Datensätze haben solltest, dürfte wahrscheinlich eine ähnlich PQ-Auswertung performanter sein.

Gruß Werner
.. , - ...
aus C the unseen
Anzeige
AW: mit Formel die Auswertung von unten her "aufzäumen" ...
26.01.2025 15:28:32
Christian
Hallo Werner,

alleine das herunterladen von 16,2 Mio Daten aus dem Internet, welche dann in Spalte B und C verteilt auf 9 Blätter stehen, dauert schon 4-4,5 Stunden, weshalb ich das wenn dann über Nacht mache. Da macht das den Braten nicht mehr fett, wenn das mit der Berechnung der Formel ein paar Minuten länger dauert oder auch nicht.

Jedenfalls die Formel funktioniert.

Vielen Dank

Anzeige
AW: mit Formel die Auswertung von unten her "aufzäumen" ...
26.01.2025 17:46:47
Christian
Hallo Werner,

kein Problem, wenn ich mich recht entsinne hatte ich auch um nichts anderes als eine Formellösung gebeten.
Vielen Dank für diese.

Gruß
Christian
AW: bitteschön, doch ...
26.01.2025 15:57:47
neopa C
Hallo Christian,

... schon das herunterladen der Daten aus dem Internet dürfte mit PQ möglich sein. Dem kann man da gleich noch die entsprechende Auswertung einbinden. Dann wäre alle mit einem "Aufwasch" getan.

Gruß Werner
.. , - ...
aus C the unseen
Anzeige
AW: bitteschön, doch ...
26.01.2025 16:16:44
Christian
Hallo Werner,

im Prinzip ist das ganze so aufgebaut,
in Spalte A stehen bis zu 2500 URL's, das Makro schreibt sämtliche Hyperlinks die es auf diesen Seiten findet (ca. 400 Pro Seite) in Spalte B, die Outer Texts wenn vorhanden in Spalte C.

Die Formel markiert die Zeilen, die ich dann auch wirklich benötige

und ein weiterer Teil des Makros verteilt die Daten dann auf 3 Spalten.

Das bisherige Makro hat den Vorteil dass ich es einmal starte und irgendwann ist es fertig. Es macht ja noch mehr als nur das gerade beschriebene.
Andere Lösungen wären für mich nur interessant, wenn sie ebenfalls das selbe tun wie das Makro, ohne dass ich zwischendrin nochmal eingreifen muss (will nachts nicht aufstehen und trotzdem haben dass es wenn ich aufstehe fertig ist).

Hier das Makro komplett:
Aber noch so eine Sache am Rande, ich komme an die Daten nur ran wenn ich mich bei der Internetseite anmelde. Da ich meine Anmeldedaten nicht rausgeben will wäre das schon das nächste Problem.

Sub erstesMakro()

Dim QuellBlatt As Worksheet, ZielBlatt As Worksheet
Dim Text As String, url As String, baseUrl As String
Dim i As Integer, j As Integer, BlattNr As Integer, Anzahl As Integer
Dim letzteZeile As Long, MaxEintraegeProBlatt As Long
Dim ws As Worksheet, neuesBlatt As Worksheet, cell As Range
Dim http As Object, html As Object, links As Object, link As Object
Dim lastRow As Long, outputRow As Long
Dim BlattIndex As Integer
Dim rng As Range, arr As Variant
Dim zielZeileA As Long, zielZeileB As Long, zielZeileC As Long

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

' Filter entfernen und UsedRange setzen
Dim wksSheet As Worksheet
Dim lngCount As Long
For Each wksSheet In ThisWorkbook.Worksheets
For lngCount = wksSheet.ListObjects.Count To 1 Step -1
With wksSheet.ListObjects(lngCount)
If Not .AutoFilter Is Nothing Then
.Range.AutoFilter
End If
End With
Next lngCount
Next wksSheet ' -- This was missing

' Schritt 1: Blätter erstellen und füllen
MaxEintraegeProBlatt = 2500
Set QuellBlatt = ThisWorkbook.Sheets("Hilfe")
BlattNr = 1
letzteZeile = 1
Set ZielBlatt = ThisWorkbook.Sheets(CStr(BlattNr))

For j = 1 To 12
Text = QuellBlatt.Cells(j, 1).Value
Anzahl = QuellBlatt.Cells(j, 2).Value

For i = 1 To Anzahl
If letzteZeile > MaxEintraegeProBlatt Then
BlattNr = BlattNr + 1
Set ZielBlatt = ThisWorkbook.Sheets(CStr(BlattNr))
letzteZeile = 1
End If
ZielBlatt.Cells(letzteZeile, 1).Value = Text & i & ".html"
letzteZeile = letzteZeile + 1
Next i
Next j

' Schritt 2: URLs extrahieren
Set http = CreateObject("MSXML2.XMLHTTP")

For BlattIndex = 1 To 9
Set ws = ThisWorkbook.Sheets(CStr(BlattIndex))
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
outputRow = 1

For i = 1 To lastRow
url = ws.Cells(i, 1).Value
If url > "" Then
On Error Resume Next
http.Open "GET", url, False
http.Send
If http.Status = 200 Then
Set html = CreateObject("htmlfile")
html.body.innerHTML = http.responseText
Set links = html.getElementsByTagName("a")
baseUrl = Left(url, 23)
For Each link In links
If link.href > "" Then
If Left(link.href, 6) = "about:" Then
link.href = IIf(Right(link.href, 4) = ".jpg", _
Replace(link.href, "about:", "https:"), _
Replace(link.href, "about:/", baseUrl))
End If
ws.Cells(outputRow, 2).Value = link.href
ws.Cells(outputRow, 3).Value = link.outerText
outputRow = outputRow + 1
End If
Next link
End If
On Error GoTo 0
End If
Next i
Next BlattIndex

' Schritt 3: Formeln einfügen und auflisten
Set neuesBlatt = ThisWorkbook.Worksheets("alle")

' Zielzeilen für die jeweiligen Spalten, unter Berücksichtigung bereits vorhandener Daten
zielZeileA = neuesBlatt.Cells(neuesBlatt.Rows.Count, "A").End(xlUp).Row + 1
zielZeileB = neuesBlatt.Cells(neuesBlatt.Rows.Count, "B").End(xlUp).Row + 1
zielZeileC = neuesBlatt.Cells(neuesBlatt.Rows.Count, "C").End(xlUp).Row + 1

For BlattIndex = 1 To 9
Set ws = ThisWorkbook.Worksheets(CStr(BlattIndex))
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Set rng = ws.Range("D2:D" & lastRow)
rng.FormulaLocal = "=WENN(UND($C2="""";LINKS($C4;1)="""""""");1;WENN($D1=1;2;WENN($D1=2;3;"""")))"
rng.Value2 = rng.Value2
arr = ws.Range("D2:D" & lastRow).Value2
For i = LBound(arr, 1) To UBound(arr, 1)
If IsNumeric(arr(i, 1)) Then
Select Case arr(i, 1)
Case 1
neuesBlatt.Cells(zielZeileA, 3).Value = ws.Cells(i + 1, "B").Value
zielZeileA = zielZeileA + 1
Case 2
neuesBlatt.Cells(zielZeileB, 2).Value = ws.Cells(i + 1, "C").Value
zielZeileB = zielZeileB + 1
Case 3
neuesBlatt.Cells(zielZeileC, 1).Value = ws.Cells(i + 1, "C").Value
zielZeileC = zielZeileC + 1
End Select
End If
Next i

' Entferne Duplikate
lastRow = neuesBlatt.Cells(neuesBlatt.Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
neuesBlatt.Range("A1:C" & lastRow).RemoveDuplicates Columns:=Array(3), Header:=xlNo
End If

' Zielzeilen nach Duplikatenentfernung neu berechnen
zielZeileA = neuesBlatt.Cells(neuesBlatt.Rows.Count, "A").End(xlUp).Row + 1
zielZeileB = neuesBlatt.Cells(neuesBlatt.Rows.Count, "B").End(xlUp).Row + 1
zielZeileC = neuesBlatt.Cells(neuesBlatt.Rows.Count, "C").End(xlUp).Row + 1
Next BlattIndex

' Entferne alle " in Spalte A des Blatts "alle"
For Each cell In neuesBlatt.Range("A1:A" & neuesBlatt.Cells(neuesBlatt.Rows.Count, "A").End(xlUp).Row)
cell.Value = Replace(cell.Value, """", "")
Next cell

' Schritt 4: Aufräumen und Anpassen
Dim targetSheets As Variant
targetSheets = Array("1", "2", "3", "4", "5", "6", "7", "8", "9")
For Each ws In ThisWorkbook.Sheets
If Not IsError(Application.Match(ws.Name, targetSheets, 0)) Then
ws.Cells.Clear
End If
Set rng = ws.usedRange
Next ws

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

MsgBox "Kombiniertes Makro abgeschlossen!", vbInformation

End Sub



Unterm Strich frage ich mich jetzt, sollen wir wegen einem an für sich funktionierenden Makro so ein Fass aufmachen und das alles versuchen in PQ umzusetzen, wo es noch 6 weitere funktionierende Makros gibt, die teilweise um das 10fache umfangreicher sind. Wobei ich auch dank eurer Versuche hier, es umzusetzen weiß, dass sich nicht alle Formeln, die die Makros berechnen in PQ umsetzen lassen.

Ich rede sicher von diesen beiden Formeln aus dem 5. Makro

=DATEDIF(G2;C2;""YD"") hier gibt die Möglichkeit die ihr mir per PQ gegeben habt um +-1 Tag andere Ergebnisse aus als die Datedif Formel

sowie =RANG.GLEICH(G2;K$2:K2;0) da hatte selbst Günther damals keine Lösung gefunden in PQ, weil sich der Bereich mit jeder Zeile ändert. Da das aber die für mich wichtigste Formel der ganzen Mappe ist, ist sie für mich unersetzbar.

Unterm Strich sehe ich an dem Versuch das ganze in PQ zu bringen ein Fass ohne Boden.


Anzeige
AW: nun, hierzu festgestellt ...
26.01.2025 17:44:28
neopa C
Hallo Christian,

... eine komplette PQ-Lösung war meinerseits ja nur ein Vorschlag auf Basis dessen, was bisher als Informationen für mich aus diesem thread bekannt war.
Mit VBA-Lösungen beschäftige ich mich prinzipiell nicht, so dass ich auf Dein Makro und deine ergänzenden Angaben nicht weiter eingehen werde.

Aber Du hast ja jetzt eine funktionierende Formellösung, die Du bei Bedarf auch in eine VBA-Lösung transformieren könntest.

Gruß Werner
.. , - ...
aus C the unseen
Anzeige
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 09:57:28
Christian
Hallo Edgar,

bin jetzt grad auf dem Weg zum Bahnhof und schreibe vom Handy aus, melde mich heute Nachmittag wieder.

Vielen Dank schonmal
Christian
Testergebnis
26.01.2025 15:31:58
Christian
Hallo Edgar,

wie schon vermutet, innnerhalb des Blocks, wo sie die Zahlen von 1-3 ausgeben soll funktioniert die Formel, außerhalb des Blocks gibt sie aber 2 statt "" aus. Ich weiß jetzt im Moment nicht, ob da noch die Notwendigkeit einer weiteren Bsp Datei besteht, obwohl Werner mir ja eine funktionierende Lösung gegeben hat.

Viele Grüße
Christian
Anzeige
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 10:05:19
Christian
Hallo Edgar,

eine Sache fällt mir leider so schon ungetestet auf. Deine Formel setzt voraus, dass ich sie in den Bereich einfüge, in denen die Zahlen 1 bis 3 ausgegeben werden sollen.
Ich wäre jedoch auf eine Formel angewiesen, die ich in die komplette Spalte D einfügen kann.
Hintergrund ist, ich habe jetzt nur einen kleinen teil der Tabelle gepostet, damit es nicht zu unübersichtlich wird. Da kommen im weiteren Verlauf noch weitere Blöcke, in denen die Zahlen von 1-3 nach demselben Schema ausgegeben werden sollen.
Das meinte ich damit, als ich sagte in allen anderen Zeilen soll die Formel nichts ausgeben. Sorry dass das so misverständlich war.

Christian
Anzeige
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 10:46:18
BoskoBiati2
Hi,

1. Hättest Du dann ein Muster einstellen sollen, was die realen Gegebenheiten 1:1 abbildet.
2. Solltest Du ja wohl in der Lage sein, diese absolut simple Formel anzupassen.

Gruß

Edgar
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 11:05:03
Christian
Hallo Edgar,

Zu 1. Ich hatte mich dagegen entschieden, wegen der Übersichtlichkeit. Ich war in dem Moment davon ausgegangen, dass die Info dass die Formel in den anderen Zeilen nichts ausgeben soll ausreicht, um klar zu machen, dass sie in der kompletten Spalte stehen soll. Das ist halt leider dass Problem, dass ich anscheinend nicht in der Lage war, mich in euch als Helfer hineinzuversetzen, was benötigt wird und wie das was ich schreibe interpretiert werden könnte. Aus meiner Sicht war das in dem Moment eindeutig. Dass das jetzt zu solchen Missverständnissen geführt hat, tut mir leid.

Das originalblatt hat mehr als 1 Mio Zeilen und 2500 solcher Blöcke in denen die Zahlen 1-3 ausgegeben werden sollen. Ich gehe davon aus, dass wenn du das als 1:1 Beispiel bekommen hättest du mehr als nur die Hände über dem Kopf zusammengeschlagen hättest.

Zu 2. Nein das kann ich leider nicht. Eine wenn Formel, die Zeilen vorgibt a la wenn Zeile = .... dann '"" sonst deine Formel, bringt mir nichts, da ich keine Ahnung habe, wie ich diese Bereiche festlegen soll.
Zum anderen noch ungetestet weil ich in der Bahn sitze, gehe ich davon aus dass die Formel 2 ausgibt in den Zellen in denen sie nichts ausgeben soll. Die 2 durch "" ersetzen bringt also auch nichts, da dann auch die 2en ersetzt würden, die gewünscht sind...
Sorry ich brauche da wirklich deine hilfe, wie ich die Formel anpassen muss.

Gruß
Christian
Anzeige
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 11:40:00
BoskoBiati2
Hi,

ich warte dann, bis Du eine entsprechende Datei eingestellt hast.

Gruß

Edgar


AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 11:48:51
Christian
Mache ich heute nachmittag, wird aber nichts anderes sein als eine mehrfache Wiederholung dessen was du schon hast. Das einzige was ja noch fehlt ist dass die Lücken zwischen einer 1 und einer 3 mit einer 2 gefüllt werden und die zwischen einer 3 und einer 1 mit "". Dafür müsste es ja reichen, den geposteten Teil mehrfach untereinanderzukopieren.
Anzeige
AW: =2+(CODE(C221&" ")=34)-(C221="")*(CODE(C222&" ")<>34) owT
26.01.2025 11:53:39
Christian
Und in den Zeilen vor der ersten 1 und nach der letzten 3 auch ""
AW: WENN Formel erweitern
26.01.2025 09:51:15
Christian
Hallo Eifeljoi,

erstmal danke für deine Antwort.
Ich denke leider mit einer PQ Lösung ist mir leider auch nicht gedient.

Weil ich vorhabe die Formel in 9 Blättern einzufügen, die bislang keine Spur von PQ beinhalten.
Das würde fürchte ich ein immenser Aufwand werden, nur um eine bestehende Formel zu ersetzen.

Bislang sieht das Ganze so aus, per VBA.

....


VBA-Teil, der die Texte in Spalte B und C erstellt, werden mit "MSXML2.XMLHTTP" aus dem Internet heruntergeladen. Funktioniert einwandfrei.

...

'Formeln einfügen und auflisten
Set neuesBlatt = ThisWorkbook.Worksheets("alle")

' Zielzeilen für die jeweiligen Spalten, unter Berücksichtigung bereits vorhandener Daten
zielZeileA = neuesBlatt.Cells(neuesBlatt.Rows.Count, "A").End(xlUp).Row + 1
zielZeileB = neuesBlatt.Cells(neuesBlatt.Rows.Count, "B").End(xlUp).Row + 1
zielZeileC = neuesBlatt.Cells(neuesBlatt.Rows.Count, "C").End(xlUp).Row + 1

'Teil der die Formeln einfügt

For BlattIndex = 1 To 9
Set ws = ThisWorkbook.Worksheets(CStr(BlattIndex))
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Set rng = ws.Range("D2:D" & lastRow)
rng.FormulaLocal = "=WENN(UND(C2="""";LINKS(C4;1)="""""""");1;WENN(D1=1;2;WENN(D1=2;3;"""")))"
rng.Value2 = rng.Value2
arr = ws.Range("D2:D" & lastRow).Value2
For i = LBound(arr, 1) To UBound(arr, 1)
If IsNumeric(arr(i, 1)) Then
Select Case arr(i, 1)
Case 1
neuesBlatt.Cells(zielZeileA, 3).Value = ws.Cells(i + 1, "B").Value
zielZeileA = zielZeileA + 1
Case 2
neuesBlatt.Cells(zielZeileB, 2).Value = ws.Cells(i + 1, "C").Value
zielZeileB = zielZeileB + 1
Case 3
neuesBlatt.Cells(zielZeileC, 1).Value = ws.Cells(i + 1, "C").Value
zielZeileC = zielZeileC + 1
End Select
End If
Next i


hatte bislang alles funktioniert.

Allerdings war es bislang so, dass immer nur eine Zeile zwischen einer 1 und einer 3 lag. Jetzt sind es dank einer Änderung teilweise mehr als eine Zeile und deshalb passt die Formel nicht mehr.

Das heißt mir wäre am meisten geholfen, wenn ich einfach im Makro diese Formel ersetzen kann.

Gruß
Christian
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige