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

Änderungen dokumentieren

Änderungen dokumentieren
08.06.2021 10:33:17
Christian
Hallo,
ich möchte mich informieren, wie ihr Excel Profis folgendes Problem lösen würdet.
Ich würde gerne dokumentieren, welche Änderungen sich an Spalte Q durch das Ausführen des am Schluss stehenden Makros ergeben.
Das heißt ich habe ein Blatt namens Texte erstellt.
In Spalte A möchte ich die Texte auflisten, die vor dem Ausführen in Spalte Q standen und nach dem Ausführen nicht mehr
In Spalte B den umgekehrten Fall, die Texte die nach dem Ausführen in Spalte Q stehen, jedoch noch nicht davor.
Wie kann man das lösen? Am liebsten wäre es mir natürlich, wenn man das Makro entsprechend erweitert.
Vielen Dank
Christian

Sub Makro3()
Dim loLetzte As Long, j As Long, x As Long, lC As Long
Application.ScreenUpdating = False
With Worksheets("Ergebnis")
loLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("B1:C1").Copy .Range("B1:C" & loLetzte)
.Range("B2:C" & loLetzte).Formula = .Range("B2:C" & loLetzte).Value2
.Range("E1:F1").Copy .Range("E2:F" & loLetzte)
.Range("E2:F" & loLetzte).Formula = .Range("E2:F" & loLetzte).Value2
.Range("R1") = "Formel"  'Zeile 1 markieren!!
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("C1:C" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("F1:F" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:R" & loLetzte)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Zeile der Markierung in Spalte l suchen
x = .Cells(Rows.Count, 18).End(xlUp).Row
'Formeln ggf. in Zeile1 zurück kopieren
If x > 1 Then
.Cells(x, 2).Resize(1, 2).Copy .Range("B1")
.Cells(x, 5).Resize(1, 13).Copy .Range("E1")
.Cells(x, 5).Copy .Range("E1")
.Rows(x).Value = .Rows(x).Value
End If
.Range("G1:Q1").Copy .Range("G2:Q" & loLetzte)
.Range("G2:Q" & loLetzte).Formula = .Range("G2:Q" & loLetzte).Value2
.Cells(x, 18) = Empty 'markierung löschen
.Range("A1").Select
End With
Application.CutCopyMode = False
End Sub

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Änderungen dokumentieren
09.06.2021 15:51:58
Yal
Hallo Christian,
am einfachste ist eine Kopie vor der Änderung in Spalte A und nach der Änderung in Spalte B zu machen.
Es sieht dann so aus:

'bevor
.Range("Q2:Q" & loLetzte).Copy
.Range("A2:A" & loLetzte).PasteSpecial xlPasteValues
'danach
.Range("Q2:Q" & loLetzte).Copy
.Range("B2:B" & loLetzte).PasteSpecial xlPasteValues
Dazwischen findet deine Bearbeitung statt.
Diese PasteSpecial ist übrigens genau was Du sonst mit

.Range("B1:C1").Copy .Range("B1:C" & loLetzte)
.Range("B2:C" & loLetzte).Formula = .Range("B2:C" & loLetzte).Value2
etwas aufwendig machst. Nicht wesentlich kürzer aber stringender:

.Range("B1:C1").Copy
.Range("B2:C" & loLetzte).PasteSpecial xlPasteValues
VG
Yal
Anzeige
AW: Änderungen dokumentieren
09.06.2021 16:07:04
Christian
Hallo Yal,
erstmal vielen Dank.
So in etwa hatte ich mir das auch vorgestellt.
Zumindest für mich als Laien scheinen da noch 2 Dinge zu fehlen.
Zum einen wollte ich ja nicht die beiden kompletten Spalten, sondern nur die Texte, die (in Spalte A) ausschließlich vorher und (in Salte B) ausschließlich nachher in Spalte Q stehen. Also die Frage, kann man dem Makro nicht irgendwie noch sagen, dass es die Texte löscht, die in beiden Spalten stehen?
Zum anderen, wo ist der Bezug zu dem Blatt "Texte"? Es nutzt mir wenig, wenn die Spalten A und B des Blatts "Ergebnis" überschrieben werden.
Zu deinem Einwand mit dem xlPasteValues, ich bin grad am überlegen, weshalb ich es so gemacht habe wie ich es gemacht hatte. Das Makro ist schon was älter und ich bin der Meinung ursprünglich war es auch mit xlPasteValues.
Kann es sein dass es daran liegt, dass meine Variante beim Einfügen der Werte Leerzellen leer lässt und diene Variante "" einfügt? Das das der Grund war damals? Ich hoffe da liege ich jetzt nicht vollkommen daneben
Gruß und danke schonmal
Christian
Anzeige
AW: Änderungen dokumentieren
09.06.2021 16:53:50
Yal
Hallo Christian,
zu deinem 1:
Ja. Es wäre Stufe 2: eine Makro, die alle Zelle von Spalte A durchläuft und die Einträge in A un B löscht, wenn diese gleich sind. Alternativ: bedingte Formatierung, die den Schrift bei gleicheit Weiß oder grau sehr hell verfärbt.
zu deinem 2:
Vergleich den von dir gelieferte Code und der von mir. Was feht bei mir?
(Tip: https://docs.microsoft.com/de-de/office/vba/language/concepts/getting-started/using-with-statements )
zu Pastevalue:
Ja, mit PasteSpecial wird eine leere Zeichenkette als Value eingetragen. Mit Formula ="" wird eine leere Formel eingetragen, was zu eine leere Zelle führt. Spielt nur eine Rolle, wenn Du den Blocksprung verwendest (Strg+Pfeil nach oben/unten/seitlich). Es ist weder Optimierung noch Verschlechterung. PasteValue ist das üblicher Ergebnis beim Makro Rekorder.
VG
Yal
Anzeige
AW: Änderungen dokumentieren
09.06.2021 19:45:19
Christian
Hallo Yal,
naja das mit der bedingen Formatierung ist weniger eine Alternative für mich, weil geschätzt weniger als 5% der Texte schwarz bleiben würden, das würde sehr viel scrollen und suchen bedeuten.
Bislang habe ich das Problem immer so gelöst dass ich wie du selbst auch vorgeschlagen hattest die beiden kompletten Listen nebeneinander kopiert und dann mit ZÄhlenwenn verglichen und dann Filter auf 0 gesetzt.
Da hatte ich mir mit diesem Beitrag hier einfach erhofft, dass es auch eine weniger aufwändige Lösung gibt und dachte dann das ließe sich dann sicher doch auch mit dem sowieso bereits bestehenden Makro verbinden.
Zu zweitens, ok es wird die Zeile With Worksheets("Texte") fehlen, vermute ich mal.
Zum dritten, mir ging es damals ums sortieren. Wenn ich xlPasteValues benutzt habe, standen zuerst die Einträge da in denen "" stand und dann die mit Inhalt, wenn ich Value2 nutze, ist es umgekehrt.
Gruß
Christian
Anzeige
AW: Änderungen dokumentieren
09.06.2021 23:51:35
Yal
Hallo Christian,
Leere oder vermeintliche leere Zelle auswählen und richtig leeren:

.Range(.Range("B2:C2"), .Range("B99999").End(xlUp)).SpecialCells(xlCellTypeBlanks).ClearContents
und ja: mit with davor.
Mit Makro Recorder aufgenommen und per hand gekürzt.
Zellen in Bereich A:B löschen wenn Gleichheit:

Sub VonA2BisAxBeiGleichheitMitB_leeren()
Dim Z As Range
With Worksheets("Texte")
For Each Z In .Range(.Range("A2"), .Range("A99999").End(xlUp)).Cells
If Z.Value = Z.Offset(0, 1) Then
Z.Resize(1, 2).ClearContents
End If
Next
End With
End Sub
VG
Yal
Anzeige
AW: Änderungen dokumentieren
10.06.2021 18:55:42
Christian
Hallo Yal,
ja ok, ich habe mal versucht, das was du so geschrieben hast, umzusetzen. Ich hoffe, es mit meinem eher dürftigen VBA Wissen, richtig gemacht zu haben.
Testen kann ich es erst heute abend, wenn neue Daten zur Verfügung stehen. Es bringt nichts, es jetzt zu testen und es passiert nichts, weil keine Änderungen stattgefunden haben.
VG
Christian
PS: Ja ich habe das Makro umbenannt, wollte das Makro3 als Sicherung behalten.

Sub Makro4()
Dim loLetzte As Long, j As Long, x As Long, lC As Long
Application.ScreenUpdating = False
With Worksheets("Ergebnis")
loLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("Q2:Q" & loLetzte).Copy
Sheets("Texte").Range("A2:A" & loLetzte).PasteSpecial xlPasteValues
.Range("B1:C1").Copy .Range("B1:C" & loLetzte)
.Range("B2:C" & loLetzte).Formula = .Range("B2:C" & loLetzte).Value2
.Range("E1:F1").Copy .Range("E2:F" & loLetzte)
.Range("E2:F" & loLetzte).Formula = .Range("E2:F" & loLetzte).Value2
.Range("R1") = "Formel"  'Zeile 1 markieren!!
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("C1:C" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("F1:F" & loLetzte), SortOn:=xlSortOnValues, _
Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:R" & loLetzte)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Zeile der Markierung in Spalte l suchen
x = .Cells(Rows.Count, 18).End(xlUp).Row
'Formeln ggf. in Zeile1 zurück kopieren
If x > 1 Then
.Cells(x, 2).Resize(1, 2).Copy .Range("B1")
.Cells(x, 5).Resize(1, 13).Copy .Range("E1")
.Cells(x, 5).Copy .Range("E1")
.Rows(x).Value = .Rows(x).Value
End If
.Range("G1:Q1").Copy .Range("G2:Q" & loLetzte)
.Range("G2:Q" & loLetzte).Formula = .Range("G2:Q" & loLetzte).Value2
.Cells(x, 18) = Empty 'markierung löschen
.Range("Q2:Q" & loLetzte).Copy
Sheets("Texte").Range("B2:B" & loLetzte).PasteSpecial xlPasteValues
With Worksheets("Texte")
For Each Z In .Range(.Range("A2"), .Range("A99999").End(xlUp)).Cells
If Z.Value = Z.Offset(0, 1) Then
Z.Resize(1, 2).ClearContents
End If
Next
End With
Sheets("Ergebnis").Range("A1").Select
End With
Application.CutCopyMode = False
End Sub

Anzeige
AW: Änderungen dokumentieren
09.06.2021 16:39:47
Christian
Hallo Yal,
erstmal vielen Dank.
So in etwa hatte ich mir das auch vorgestellt.
Zumindest für mich als Laien scheinen da noch 2 Dinge zu fehlen.
Zum einen wollte ich ja nicht die beiden kompletten Spalten, sondern nur die Texte, die (in Spalte A) ausschließlich vorher und (in Salte B) ausschließlich nachher in Spalte Q stehen. Also die Frage, kann man dem Makro nicht irgendwie noch sagen, dass es die Texte löscht, die in beiden Spalten stehen?
Zum anderen, wo ist der Bezug zu dem Blatt "Texte"? Es nutzt mir wenig, wenn die Spalten A und B des Blatts "Ergebnis" überschrieben werden.
Zu deinem Einwand mit dem xlPasteValues, ich bin grad am überlegen, weshalb ich es so gemacht habe wie ich es gemacht hatte. Das Makro ist schon was älter und ich bin der Meinung ursprünglich war es auch mit xlPasteValues.
Kann es sein dass es daran liegt, dass meine Variante beim Einfügen der Werte Leerzellen leer lässt und diene Variante "" einfügt? Das das der Grund war damals? Ich hoffe da liege ich jetzt nicht vollkommen daneben
Gruß und danke schonmal
Christian
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige