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

VBA mit meiner if Anweisung stimmt was nicht

Forumthread: VBA mit meiner if Anweisung stimmt was nicht

VBA mit meiner if Anweisung stimmt was nicht
09.12.2024 14:09:39
Christian
    Dim nachricht As String

nachricht = "Daten und Formeln wurden erfolgreich aktualisiert!"
If fehlendeN > "" Then
nachricht = nachricht & vbNewLine & "Leere Zellen in Spalte N, Werte aus M:" & vbNewLine & fehlendeN
End If
If fehlendeQ > "" Then
nachricht = nachricht & vbNewLine & "Leere Zellen in Spalte Q, Werte aus P:" & vbNewLine & fehlendeQ
End If
MsgBox nachricht, vbInformation


Hallo, ich weiß da ist wahrscheinlich nur ein dummer Denkfehler, aber wie bekomme ich es hin, dass wenn beide Prüfungen ungleich leer sind, sowohl die werte aus fehlendeN als auch fehlendeQ ausgegeben werden? Irgendwie stehe ich gerade total auf dem Schlauch. Chatgpt meint, das tut der Code bereits, tut er aber de facto nicht, es werden nur die Werte aus fehlendeQ ausgegeben.

Danke
Christian
Anzeige

35
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA mit meiner if Anweisung stimmt was nicht
09.12.2024 14:15:25
{Boris}
Hi,

dann ist fehlendeN eben "". Mehr geht nicht, da man nicht weiß, wie fehlendeN bzw. fehlendeQ befüllt werden.

VG, Boris
AW: VBA mit meiner if Anweisung stimmt was nicht
09.12.2024 14:21:35
Christian
Hallo Boris,

auf unterem Weg wird es befüllt, aber ich wüsste jetzt nicht, was ich bei Spalte M und N anders gemacht haben sollte als in P und Q. Leerzellen gibt es jedenfalls sowol in N als auch Q. Das die letzten Zeilen in beiden Fällen dieselbe ist ist korrekt.

' **Prüfung auf leere Zellen in Spalten N und Q**

datenN = wsNV.Range("N" & startZeile & ":N" & letzteZeileM).Value
datenQ = wsNV.Range("Q" & startZeile & ":Q" & letzteZeileM).Value
datenM = wsNV.Range("M" & startZeile & ":M" & letzteZeileM).Value
datenP = wsNV.Range("P" & startZeile & ":P" & letzteZeileM).Value

' Dictionaries für einzigartige Werte
Set uniqueN = CreateObject("Scripting.Dictionary")
Set uniqueQ = CreateObject("Scripting.Dictionary")

Dim j As Long
For j = 1 To UBound(datenN, 1)
If IsEmpty(datenN(j, 1)) Then uniqueN(datenM(j, 1)) = True
If IsEmpty(datenQ(j, 1)) Then uniqueQ(datenP(j, 1)) = True
Next j

If uniqueN.Count > 0 Then fehlendeN = Join(uniqueN.Keys, vbNewLine)
If uniqueQ.Count > 0 Then fehlendeQ = Join(uniqueQ.Keys, vbNewLine)

Anzeige
AW: VBA mit meiner if Anweisung stimmt was nicht
09.12.2024 14:19:57
daniel
Hi
bei mir funktioniert der Code wie von dir gewünscht.
Der Fehler muss irgendwo in einem Bereich liegen, den du uns nicht zeigst.

Verwendest du Option Explicit?
Vielleicht liegt der Fehler ja dort, wo du die beiden Variabeln "fehlendeN" und "fehlendeQ" befüllst.

Gruß Daniel
Anzeige
hier die Datei
09.12.2024 17:10:43
Christian
https://www.herber.de/bbs/user/174197.xlsm

im Moment ist die Datei ziemlich leer. Ihr müsst damit es funktioniert erst alle Abfragen aktualisieren danach das Makro Verarbeite Daten und Aktualisiere ausführen.
Dann erst habt ihr den Zustand, bei dem ich das Problem habe. Sorry aber dieser Zustand nahm zuviel Platz in Anspruch.

Die Blätter Punkte und Tabelle1 hab ich ebenfalls aus Platzgründen weggelassen und im Code auskommentiert.

Der Code Aktualisiere und berechne Alles ist dann der der das Problem macht, sobald das Sortieren des Bereichs M:R ausgeführt wird, stehen in Spalte N 5078 Texte statt 4710 und damit keine Leerzellen mehr.

Die CSV Dateien, die man braucht um die Abfragen zu aktualisieren:

https://www.herber.de/bbs/user/174199.zip

PS: kommt bitte nicht auf die Idee diese beiden Makros zu einem zu machen, die Arbeit wäre umsonst

Anzeige
AW: hier die Datei
09.12.2024 18:13:44
daniel
wie ich hier schrieb:
https://www.herber.de/forum/messages/1999224.html
der Fehler ist das Hochkomma in der Formel für Spalte N.
das verhindert, dass mit dem nachfolgenden .Value = .Value die Formelergebnisse "" (leer) zu echten Leerzellen werden, sondern diese Zellen bleiben Text.
das wirkt sich dann auf die Sortierung aus (echte Leerzellen ans Ende, Zellen mit Text "" an den Anfang) und auf deine Inhaltsprüfung:
IsEmpty ergibt nur bei echten Leerzellen ein TRUE, nicht aber bei Texten ohne Zeichen. weniger Spezifisch wäre hier die Prüfung mit If x = ""
Gruß Daniel
Anzeige
AW: hier die Datei
09.12.2024 19:59:31
Eifeljoi 5
Hallo

Ich verfolge immer wieder deine Beiträge wenn ich Zeit dazu habe.
Ich kann und will es auch nicht verstehen das du weiterhin dein Konzept mit VBA mit aller Gewalt durch prügeln möchtest.
Sei es auch drum jedem das seine wie er möchte ich hätte die schon längst anderes gelöst.
Werde auch nicht mehr hier rein schauen.
Anzeige
AW: hier die Datei
09.12.2024 20:20:03
Christian
Hallo Eifeljoi,

naja das vba hat ja 3 Zwecke alles was ich sowieso regelmäßig gleichzeitig mache, auch gleichzeitig mit einem Abwasch auszuführen. Nr. 2 Formeln die ewig brauchen zum Berechnen nur dann berechnen zu lassen wenn ich sie brauche und 3. auch wenn es jetzt aus der Datei weniger ersichtlich ist, Backups einzubauen wo sich etwas verändert hat bzw. ich schlampig war und was vergessen habe.
Mein Problem damit ist, ich habe weder wirklich verstanden wie ich Zählenwenn oder XVERWEIS zwischen verschiedenen PQ Abfragen abbilden kann und sage deshalb mehr oder weniger never change a running system. Die Grundidee dieser Makros ist über 10 Jahre alt, also aus einer Zeit lange vor PQ. Damals war noch viel mehr in den Dateien mit VBA gemacht, inzwischen hab ich ja auch das ein oder andere was ich mache in PQ umgesetzt, sofern ich durchblicke. Wo ich aber wie gesagt nicht durcblicke bleibt das mit den Joins zwichen verschiedenen Abfragen.

Aber selbst wenn man das auch noch durch PQ ersetzt. An dem Prinzip, in Makros alles zusammen zufassen was ich auf einen Schlag erledigen will würde auch das nichts ändern, es würden höchstens im Makro das Berechnen durch Formeln durch Aktualisieren von Abfragen ersetzt werden.
Anzeige
komplettes Makro
09.12.2024 14:25:56
Christian
Sorry dachte es liegt an der if anweisung und wollte euch dann ersparen, euch durch das ganze Makro durchzuarbeiten aber hier: und nein Option Explicit nutze ich nicht, probiere ich sofort aus
Sub AktualisiereUndBerechneAlles()


' Deklaration der Arbeitsblätter
Dim wsNV As Worksheet
Dim wsPunkte As Worksheet
Dim letzteZeileD As Long, letzteZeileM As Long, letzteZeileI As Long
Dim startZeile As Long
Dim aktualisieren As Boolean
Dim abfragen As Variant
Dim datenN As Variant, datenQ As Variant, datenM As Variant, datenP As Variant
Dim fehlendeN As String, fehlendeQ As String
Dim uniqueN As Object, uniqueQ As Object

' Konstanten und Startwerte
startZeile = 253
Set wsNV = ThisWorkbook.Worksheets("nv")
Set wsPunkte = ThisWorkbook.Worksheets("Punkte")
Set wsTabelle1 = ThisWorkbook.Worksheets("Tabelle1")


' Benutzerabfrage: Soll das vollständige Update erfolgen?
If MsgBox("Sollen alle Abfragen und die Formeln in den Spalten N, O, Q und R aktualisiert werden?", _
vbYesNo + vbQuestion, "Aktion wählen") = vbYes Then
aktualisieren = True
abfragen = Array("Filme1", "Leute1", "U_250", "jüngste")
Else
aktualisieren = False
abfragen = Array("U_250", "jüngste")
End If

' Optimierung: Bildschirmaktualisierung und Berechnung ausschalten
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

' **Abfragen aktualisieren**
Dim i As Integer
For i = LBound(abfragen) To UBound(abfragen)
wsNV.ListObjects(abfragen(i)).QueryTable.Refresh BackgroundQuery:=False
Next i

' **Letzte Zeilen in wichtigen Spalten berechnen**
letzteZeileD = wsNV.Cells(wsNV.Rows.Count, "D").End(xlUp).Row
letzteZeileM = wsNV.Cells(wsNV.Rows.Count, "M").End(xlUp).Row
letzteZeileI = wsNV.Cells(wsNV.Rows.Count, "I").End(xlUp).Row

' **Formeln in Spalten N, O, Q, R einfügen, wenn vollständige Aktualisierung gewünscht**
If aktualisieren Then

' **Berechnungen und Anpassungen in Tabelle1**
anzahlSeitenD = Application.WorksheetFunction.Ceiling((letzteZeileD - 253) / 250, 1)
wsTabelle1.Range("J6").Value = "https://www.imdb.com/list/ls548888454/edit-larger?sort=list_order,asc&page=" & anzahlSeitenD

anzahlSeitenI = Application.WorksheetFunction.Ceiling((letzteZeileI - 253) / 250, 1)
wsTabelle1.Range("J7").Value = "https://www.imdb.com/list/ls590005043/edit-larger?sort=list_order,asc&page=" & anzahlSeitenI

' Formeln für Spalten N, O, Q, R
wsNV.Range("N" & startZeile & ":N" & letzteZeileM).FormulaLocal = _
"=""'"" & XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$E$254:$E$" & letzteZeileD & ";"""";0;1)"
wsNV.Range("O" & startZeile & ":O" & letzteZeileM).FormulaLocal = _
"=WENN(XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$G$254:$G$" & letzteZeileD & ";"""";0;1)=0;"""";XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$G$254:$G$" & letzteZeileD & ";"""";0;1))"
wsNV.Range("Q" & startZeile & ":Q" & letzteZeileM).FormulaLocal = _
"=XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$J$254:$J$" & letzteZeileI & ";"""";0;1)"
wsNV.Range("R" & startZeile & ":R" & letzteZeileM).FormulaLocal = _
"=WENN(XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$K$254:$K$" & letzteZeileI & ";"""";0;1)=0;"""";XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$K$254:$K$" & letzteZeileI & ";"""";0;1))"

' Werte fixieren
wsNV.Range("N253:R" & letzteZeileM).Value = wsNV.Range("N253:R" & letzteZeileM).Value

' **Bereich sortieren**
With wsNV.Sort
.SortFields.Clear
.SortFields.Add key:=wsNV.Range("O" & startZeile & ":O" & letzteZeileM), Order:=xlDescending
.SortFields.Add key:=wsNV.Range("R" & startZeile & ":R" & letzteZeileM), Order:=xlDescending
.SetRange wsNV.Range("M" & startZeile & ":R" & letzteZeileM)
.Header = xlNo
.Apply
End With
End If

' **Prüfung auf leere Zellen in Spalten N und Q**
datenN = wsNV.Range("N" & startZeile & ":N" & letzteZeileM).Value
datenQ = wsNV.Range("Q" & startZeile & ":Q" & letzteZeileM).Value
datenM = wsNV.Range("M" & startZeile & ":M" & letzteZeileM).Value
datenP = wsNV.Range("P" & startZeile & ":P" & letzteZeileM).Value

' Dictionaries für einzigartige Werte
Set uniqueN = CreateObject("Scripting.Dictionary")
Set uniqueQ = CreateObject("Scripting.Dictionary")

Dim j As Long
For j = 1 To UBound(datenN, 1)
If IsEmpty(datenN(j, 1)) Then uniqueN(datenM(j, 1)) = True
If IsEmpty(datenQ(j, 1)) Then uniqueQ(datenP(j, 1)) = True
Next j

If uniqueN.Count > 0 Then fehlendeN = Join(uniqueN.Keys, vbNewLine)
If uniqueQ.Count > 0 Then fehlendeQ = Join(uniqueQ.Keys, vbNewLine)

' Formeln für X und AC berechnen
With wsNV
.Range("X254:X503").FormulaLocal = "=ZÄHLENWENN(Z$254:Z$503;U254)"
.Range("AC254:AC503").FormulaLocal = "=ZÄHLENWENN(U$254:U$503;Z254)"
.Range("X254:AC503").Value = .Range("X254:AC503").Value
End With

' Formeln und Berechnungen im Blatt Punkte
With wsPunkte
.Range("B1:B250").FormulaLocal = "=XVERWEIS(A1;NV!Z$254:Z$503;NV!AA$254:AA$503;"""";0;1)"
.Range("C1:C250").FormulaLocal = "=XVERWEIS(A1;NV!Z$254:Z$503;NV!AB$254:AB$503;"""";0;1)"
.Range("D1:D250").FormulaLocal = "=WENN(RANG.GLEICH(C1;C$1:C$250;0)31;RANG.GLEICH(C1;C$1:C$250;0);"""")"
.Range("E1:E250").FormulaLocal = "=251*ANZAHL2(H1:BG1)-SUMME(H1:BG1)"
.Range("F1:F250").FormulaLocal = "=RANG.GLEICH(E1;E$1:E$250;0)"
.Range("G1:G250").FormulaLocal = "=MIN(H1:BG1)"
.Range("B1:G250").Value = .Range("B1:G250").Value

With .Sort
.SortFields.Clear
.SortFields.Add key:=wsPunkte.Range("F1:F250"), Order:=xlAscending
.SetRange wsPunkte.Range("A1:BG250")
.Header = xlNo
.Apply
End With
End With

' Bildschirmaktualisierung wieder aktivieren
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

' Abschlussnachricht
Dim nachricht As String
nachricht = "Daten und Formeln wurden erfolgreich aktualisiert!"
If fehlendeN > "" Then
nachricht = nachricht & vbNewLine & "Leere Zellen in Spalte N, Werte aus M:" & vbNewLine & fehlendeN
End If
If fehlendeQ > "" Then
nachricht = nachricht & vbNewLine & "Leere Zellen in Spalte Q, Werte aus P:" & vbNewLine & fehlendeQ
End If
MsgBox nachricht, vbInformation

End Sub



Anzeige
Es bleibt dabei...
09.12.2024 14:36:43
{Boris}
Hi,

...wenn am Ende nur fehlendeQ ausgegeben werden (und nicht fehlendeN), dann ist fehlendeN leer.

VG, Boris
AW: komplettes Makro
09.12.2024 17:51:08
daniel
ja, denken ist manchmal schlecht.

die Ursache für deinen Fehler liegt in dieser Zeile:

        ' Formeln für Spalten N, O, Q, R

wsNV.Range("N" & startZeile & ":N" & letzteZeileM).FormulaLocal = _
"=""'"" & XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$E$254:$E$" & letzteZeileD & ";"""";0;1)"


du stellst hier dem Ergebnis noch das Hochkomma ' voraus (.FormulaLocal = "=""'"" & ...)
das Hochkomma ist das Texterkennungszeichen für Excel, dh wenn du was in eine Zelle schreibst, das das mit dem Hochkomma beginnt, dann ist das immer Text.
dh wenn du hinterher die Formeln in Werte wandelst, bleiben sie auch bei einem XVerweis-Ergebnis "" technisch gesehen Text (halt ohne Zeichen) und diese Zellen werden keine Leerzellen (obwohl sie so aussehen)
damit wird hier auch deine spätere Prüfung mit If IsEmpty() nicht TRUE sondern bleibt FALSE, weil diese Zellen Text enthalten.
somit bekommst du auch für Spalte N kein Ergebnis.

Abhilfe wäre also, dass du hier das Hochkomma in der Formel weglässt, so wie in den anderen Formeln auch.
Sollte das Hochkomma an dieser Stelle aus einem anderen Grund notwendig sein, dann kannst auch die Prüfung auf Leerzelle so machen:
If datenN(j, 1) = ""  Then uniqueN(datenM(j, 1)) = True


das ="" ist da weniger sensibel als das IsEmpty, weil es eben auch bei einem Text ohne Inhalt ein TRUE ergibt und nicht nur bei einer echten Leerzelle.

Gruß Daniel
Anzeige
AW: komplettes Makro
09.12.2024 18:49:33
Christian
Hallo Daniel,

dann muss ich dich jetzt fragen, was du mir raten würdest. Das ' hat den Zweck, dass nicht wenn z.b. als Rückgabewert des XVERWEIS 9-1-1 steht daraus 09.01.2001 gemacht wird, sondern 9-1-1 beibehalten wird. Das soll auf jeden Fall so bleiben.
Die anderen Formeln haben das nicht, weil da sowas nicht vorkommt.

Welchen Weg würdest du mir dann raten? Deinen bereits gemachten Alternativvorschlag oder das ' durch eine andere Lösung ersetzen?

BItte bei deinem Vorschlag auch bedenken, das was du jetzt gesehen hast hat ca 8-9% der Ausmaße die es mal haben wird, wenn es fertig ist, mir liegt also auch Ausführzeit des Makros am Herzen.

Danke
Christian
Anzeige
AW: komplettes Makro
09.12.2024 19:07:45
Uduuh
Hallo,
oder das ' durch eine andere Lösung ersetzen?
Du könntest die Spalte vorab auf Format TEXT setzen. Dann wird 9-1-1 nicht in ein Datum umgewandelt.

Gruß aus'm Pott
Udo
AW: komplettes Makro
09.12.2024 19:16:07
daniel
das ist quatsch und hilft nicht weiter.
zum einen müsste man dann so vorgehen
1. Zellbereich als Standard formatieren
2. Formel einfügen
3. Zellbereich als TEXT formatieren
4. Formeln durch Werte ersetzen1
zum anderen löst es nicht das Problem, weil es genauso wie das Hochkomma verhindert, das ein Leerstring beim Umwandeln "Formel in Wert" zur echten Leerzelle wird.

Gruß Daniel
Anzeige
AW: komplettes Makro
09.12.2024 19:09:30
daniel
Hi
das "'" darf nur vorangestellt werden, wenn der XVErweis einen Wert findet, aber nicht im Fehlerfall.
daher würde ich nicht folgendes formulieren:

="'"&XVerweis(bereich1;bereich2;"";0;1)


sondern:

=WennFehler(&"'"&XVErweis(bereich1;bereich2;;0;1);"")


dh du lässt beim XVerweis den Fehlerwert weg, damit bekommst du erstmal den #NV-Fehler
über das WennFehler ersetzt du dann den Fehler durch einen anderen Wert.
auf diese weise kannst du steueren, dass nur der über den XVerweis gefundene Wert das Hochkomma erhält, aber nicht die Fehler-Alternative.

Gruß Daniel
Anzeige
AW: komplettes Makro
09.12.2024 19:39:01
Christian
Hallo Daniel, danke für den Tipp aber wozu das & vor dem ' ?

aber kannst du mir nochmal kurz bei einem anderen Punkt in diesem Makro helfen? Ich denke mal, nichts wildes. Aber wie mache ich das nochmal dass die Werte in Spalte O im Format TT.MM.JJJJ;;; und in Spalte R im Format TT.MM.JJJJ;-0;; eingefügt werden?

Danke
Christian

PS: Das mit den Leerzellen in Spalte N funktioniert jetzt (ohne das &, mit habe ich nicht getestet)
Anzeige
AW: komplettes Makro
09.12.2024 20:11:13
Christian
gut, habe grad noch rausgefunden, dass es sinnvoller ist, das ' vor den Rückgabewert zu schreiben, vor dem Suchbegriff bringt es nicht viel.

Und dass ich das Format englisch schreiben muss hab ich auch bemerkt.
AW: komplettes Makro
09.12.2024 19:45:38
daniel
& ist Tippfehler.

und der rest, versteh ich nicht.
wie wäre des mit "neue Frage, neuer Beitrag?"
und dann vielleicht mit einer etwas ausführlicheren Beschreibung?
Anzeige
AW: komplettes Makro
09.12.2024 19:50:25
Christian
        ' Formeln für Spalten N, O, Q, R

wsNV.Range("N" & startZeile & ":N" & letzteZeileM).FormulaLocal = _
"=WENNFEHLER(XVERWEIS(""'"" & M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$E$254:$E$" & letzteZeileD & ";;0;1);"""")"
wsNV.Range("O" & startZeile & ":O" & letzteZeileM).FormulaLocal = _
"=WENN(XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$G$254:$G$" & letzteZeileD & ";"""";0;1)=0;"""";XVERWEIS(M" & startZeile & ";$D$254:$D$" & letzteZeileD & ";$G$254:$G$" & letzteZeileD & ";"""";0;1))"
wsNV.Range("Q" & startZeile & ":Q" & letzteZeileM).FormulaLocal = _
"=XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$J$254:$J$" & letzteZeileI & ";"""";0;1)"
wsNV.Range("R" & startZeile & ":R" & letzteZeileM).FormulaLocal = _
"=WENN(XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$K$254:$K$" & letzteZeileI & ";"""";0;1)=0;"""";XVERWEIS(P" & startZeile & ";$I$254:$I$" & letzteZeileI & ";$K$254:$K$" & letzteZeileI & ";"""";0;1))"

' Werte fixieren
wsNV.Range("N253:R" & letzteZeileM).Value2 = wsNV.Range("N253:R" & letzteZeileM).Value2


mit dem Tippfehler kein Problem. Das war so gemeint, dass es doch irgendwie möglich sein muss anzugeben, in welchem Zellformat die Einträge in Spalte O und R da stehen sollen, wenn das Makro fertig ist. Die Formeln wandeln nämlich Daten in Zahlen um und ich muss dann immer von Hand das Zellformat wieder in Datum ändern.
Anzeige
Nachtrag
09.12.2024 19:52:26
Christian
also in den Zeilen die seit dem letzten händig formatieren neu dazugekommen sind, stehen dann Zahlen statt Daten
sorry manchmal sieht man den Wald vor lauter Bäumen nicht
09.12.2024 19:56:36
Christian
wsNV.Range("O253:O" & letzteZeileM).NumberFormat = "TT.MM.JJJJ;;;"

wsNV.Range("R253:R" & letzteZeileM).NumberFormat = "TT.MM.JJJJ;-0;;"
AW: Es bleibt dabei...
09.12.2024 14:40:59
Christian
Das kann nicht sein. Das folgende Makro, welches ich zuvor ausführe schreibt neue Texte in die Spalten M und P und lässt die Spalten N und Q unverändert, also leer. Und von Hand trage ich da auch nix ein. Es müssen also zwangsweise leere Zellen in Spalte N da sein.


Sub VerarbeiteDatenUndAktualisiere()
Dim wsNV As Worksheet
Dim letzteZeile As Long, letzteZeileD As Long, letzteZeileI As Long
Dim letzteZeileM As Long, letzteZeileP As Long, letzteZeileAE As Long, letzteZeileAF As Long
Dim dictD As Object, dictI As Object
Dim quellenRangeA As Range, quellenRangeB As Range
Dim arrA As Variant, arrB As Variant
Dim i As Long

' Arbeitsblatt festlegen
Set wsNV = ThisWorkbook.Sheets("NV")

' Bildschirmaktualisierungen und Berechnungen ausschalten
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

' Abfrage "Update" aktualisieren
wsNV.ListObjects("Update").QueryTable.Refresh BackgroundQuery:=False

' Zeilen mit Daten in den Spalten AE und AF finden
letzteZeileAE = wsNV.Cells(wsNV.Rows.Count, "AE").End(xlUp).Row
letzteZeileAF = wsNV.Cells(wsNV.Rows.Count, "AF").End(xlUp).Row
If letzteZeileAE >= 253 Then wsNV.Range("AE253:AE" & letzteZeileAE).ClearContents
If letzteZeileAF >= 253 Then wsNV.Range("AF253:AF" & letzteZeileAF).ClearContents

' Zeilen in den Spalten D und I finden
letzteZeileD = wsNV.Cells(wsNV.Rows.Count, "D").End(xlUp).Row
letzteZeileI = wsNV.Cells(wsNV.Rows.Count, "I").End(xlUp).Row

' Dictionaries für Duplikate in D und I erstellen
Set dictD = CreateObject("Scripting.Dictionary")
Set dictI = CreateObject("Scripting.Dictionary")

' D und I in Dictionaries einfügen
For i = 254 To letzteZeileD
If wsNV.Cells(i, "D").Value > "" Then dictD(wsNV.Cells(i, "D").Value) = True
Next i
For i = 254 To letzteZeileI
If wsNV.Cells(i, "I").Value > "" Then dictI(wsNV.Cells(i, "I").Value) = True
Next i

' Daten in Spalten A und B von Zeile 254 bis zur letzten Zeile einlesen
letzteZeile = wsNV.Cells(wsNV.Rows.Count, "A").End(xlUp).Row
Set quellenRangeA = wsNV.Range("A254:A" & letzteZeile)
Set quellenRangeB = wsNV.Range("B254:B" & letzteZeile)

arrA = quellenRangeA.Value
arrB = quellenRangeB.Value

' Neue Zeilen für M und P festlegen
letzteZeileM = IIf(wsNV.Cells(wsNV.Rows.Count, "M").End(xlUp).Row 253, 253, wsNV.Cells(wsNV.Rows.Count, "M").End(xlUp).Row)
letzteZeileP = IIf(wsNV.Cells(wsNV.Rows.Count, "P").End(xlUp).Row 253, 253, wsNV.Cells(wsNV.Rows.Count, "P").End(xlUp).Row)

' Werte in Spalte M und P einfügen
For i = 1 To UBound(arrA, 1)
wsNV.Cells(letzteZeileM + i, "M").Value = arrA(i, 1)
wsNV.Cells(letzteZeileP + i, "P").Value = arrB(i, 1)
Next i

' Spalte AE für Werte, die nicht in D sind
letzteZeileAE = 252
For i = 1 To UBound(arrA, 1)
If Not dictD.exists(arrA(i, 1)) And arrA(i, 1) > "" Then
letzteZeileAE = letzteZeileAE + 1
wsNV.Cells(letzteZeileAE, "AE").Value = arrA(i, 1)
End If
Next i

' Spalte AF für Werte, die nicht in I sind
letzteZeileAF = 252
For i = 1 To UBound(arrB, 1)
If Not dictI.exists(arrB(i, 1)) And arrB(i, 1) > "" Then
letzteZeileAF = letzteZeileAF + 1
wsNV.Cells(letzteZeileAF, "AF").Value = arrB(i, 1)
End If
Next i

' Duplikate in AE und AF entfernen
wsNV.Range("AE253:AE" & wsNV.Cells(wsNV.Rows.Count, "AE").End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo
wsNV.Range("AF253:AF" & wsNV.Cells(wsNV.Rows.Count, "AF").End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo

' Duplikate in den Spalten M bis R entfernen
letzteZeileM = wsNV.Cells(wsNV.Rows.Count, "M").End(xlUp).Row
wsNV.Range("M253:R" & letzteZeileM).RemoveDuplicates Columns:=Array(1, 4), Header:=xlNo

' Berechnungen und Bildschirmaktualisierungen wieder aktivieren
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True

MsgBox "Daten wurden verarbeitet, Abfrage aktualisiert, Duplikate entfernt und Berechnung wieder aktiviert!", vbInformation
End Sub

Anzeige
Dann zeig mal bitte...
09.12.2024 14:42:01
{Boris}
Hi,

...eine stark abgespeckte Beispieldatei, in der man das nachvollziehen kann.

VG, Boris
AW: Es bleibt dabei...
09.12.2024 14:49:19
daniel
Hi
naja, dieses Makro zeigt dir immer nur einen Standardtext in der Messagebox, egal was passiert.
das von dir in der Eingangsfrage fallweise zusammenstellen der Nachricht kommt hier gar nicht vor.
auch die jeweilgen Variablen (nachricht, nachricht, fehlendeN, fehlendeQ) kommen nicht vor.
Du hast das, was du gefragt hast, in dem Makro, dass du hier zeigtst überhaupt nicht eingebaut. Es fehlt vollkommen.
Gruß Daniel
Anzeige
AW: Es bleibt dabei...
09.12.2024 15:20:55
Christian
Hallo Daniel, dann habe ich mich wohl misverständlich ausgedrückt. Das 2. Makro sollte nur zeigen, wie die Leerzellen in Spalte N entstehen, weil Boris ja meinte es kann nicht anders sein, als das es in Spalte N keine Leerzellen gibt. (bzw. das Dictionary dass die Texte in Spalte M sammelt leer ist).

Ansonsten hat dieses Makro nichts mit meiner Fragestellung zu tun.

Gruß
Christian
Anzeige
Wie Daniel schon schrieb...
09.12.2024 15:18:20
{Boris}
Hi,

...zeigst Du hier gerade ein Makro, das Du in Deinem anderen Beitrag nicht gepostet hast.
In dem ersten (langen) Makro kommen fehlendeN und fehlendeQ gar nicht vor, sind auch nicht als Public deklariert etc.

Ohne Deine Datei wird das nix.

VG, Boris
AW: Wie Daniel schon schrieb...
09.12.2024 15:23:19
Christian
Hallo Boris,Das 2. Makro sollte nur zeigen, wie die Leerzellen in Spalte N entstehen, weil du ja meintest es kann nicht anders sein, als das es in Spalte N keine Leerzellen gibt. (bzw. das Dictionary dass die Texte in Spalte M sammelt leer ist).

Ansonsten hat dieses Makro nichts mit meiner Fragestellung zu tun.

Gruß
Christian
Anzeige
Nochmal: Zeig bitte eine Beispieldatei...oT
09.12.2024 15:26:03
{Boris}
VG, Boris
ich hab eine mögliche Lösung (m.E.)
09.12.2024 15:31:46
Christian
ich glaub die XVERWEIS Formel ist das Problem, weil die hinterlässt keine Leerzellen sondern "" wenn sie nix findet.
Werde jetzt mal was kochen und es dann nach dem Essen es mal mit Value2 beim Werte einfügen probieren.

Was meint ihr, könnte das sein?
AW: Wie Daniel schon schrieb...
09.12.2024 15:45:29
Onur
Das wird nix ohne Datei.
Da werden auch noch über VBA Formeln eingetragen - WOZU ? Wozu Dictionaries?
Irgendwie glaube ich, dass du einen riesigen Denkfehler hast und das Ganze viel zu kompliziert gebaut has, aber ohne Datei kann man nix überprüfen.
Anzeige
wie gesagt bin die DAtei am Bauen
09.12.2024 16:39:00
Christian
Hallo Onur,

Dictionaries, weil Chatgpt das vorgeschlagen hatte, als ich es drum gebeten habe dafür zu sorgen, dass es bei großen Datenmengen schneller geht
Formelberechnung aus demselben Grund, Zeitbeschleunigung wenn sie im Makro stehen, werden sie nur neu berechnet, wenn ich das Makro starte und nicht bei jedem Piep, den ich an einer für die Formel relevanten Zelle ändere. 80000 XVERWEIS Formeln, wenn das ganze fertig ist können lange brauchen zum Berechnen.
Ich weiß man kann auch mit den Berechnungsoptionen arbeiten, hab mich aber für den Weg entschieden.

Aber nochmal zurück zu meinem Problem. Das Problem liegt beim Sortieren

With wsNV.Sort

.SortFields.Clear
.SortFields.Add key:=wsNV.Range("O" & startZeile & ":O" & letzteZeileM), Order:=xlDescending
.SortFields.Add key:=wsNV.Range("R" & startZeile & ":R" & letzteZeileM), Order:=xlDescending
.SetRange wsNV.Range("M" & startZeile & ":R" & letzteZeileM)
.Header = xlNo
.Apply
End With
End If


im zuerst geposteten Code, sobald ich da auf Apply drücke beim Einzelschritt ausführen ändert sich die Anzahl2(N:N) von 4710 (was den tatsächlichen Texten in Spalte N entspricht) auf 5078, was der Anzahl der Texten in Spalte M entspricht.

beim Werte einfügen davor ist noch alles in Butter.

Gruß
Christian
Anzeige
AW: ich hab eine mögliche Lösung (m.E.)
09.12.2024 15:42:22
daniel
eine Formel kann niemals eine Leerzelle erzeugen.
ein "" als Formelergebnis ist technisch ein Text.

um eine echte Leerzelle zu erzeugen, musst du die Formel durch ihr Ergebnis ersetzten, aber nur über VBA mit .Value = .Value

Gruß Daniel
AW: ich hab eine mögliche Lösung (m.E.)
09.12.2024 16:40:27
Christian
genau das ist ja das was ich im Makro mache. Schau dir mal meinen vorigen Beitrag bitte an, wo ich auf das Sortieren eingehe
Anzeige
Bspdatei
09.12.2024 15:26:02
Christian
eine Datei mit 15,7Mb, 15 Blättern und 3 CSV DAteien als Datenqulle, in der viele Blätter Verweise untereinander haben wird nicht einfach, auf 300KB zu reduzieren dass alles noch wie gedacht funktioniert. Aber ich gebe mein bestes.
Option Explicit...
09.12.2024 14:30:03
Christian
hat nur dazu geführt dass ich auch die letzten Variablen deklariert habe.

Gruß
Christian
Anzeige
AW: Option Explicit...
09.12.2024 14:41:28
daniel
Option Explict schützt einen vor Fehlern durch falsch geschriebene Variablennamen.

Mit Opition Explict muss jede Variable deklariert werden und du bekommst einen Fehler gleich zu beginn, wenn du dich mal vertippt hast.

einfaches Beispiel:
du willst einen Zähler hochzählen, vertippst dich aber einmal:
Zähler = 1

Zähler = Zaehler + 1
msgbox Zähler

ohne Option Explicit funktioniert es, weil Zaehler dann eine neue Variable ist und du wunderst dich, warum Zähler nicht 2 sondern 1 ist.
mit Option Explicit bekommst du sofort beim Start des Makros eine Meldung. dass da was nicht stimmt.

Daher sollte man immer mit Option Explicit arbeiten.

Gruß Daniel


Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18