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

OldValue <> NewValue im Loop

OldValue <> NewValue im Loop
26.07.2022 14:14:30
David
Guten Tag liebe Helden und Heldinnen des Excel Alltags
Schon so oft konnte ich als passiver Teilnehmer dieses Forums von eurem Wissen profitieren. Nun aber komme ich, nach einer endlosen und erfolgslosen Suche, nicht darum herum, selber einen Beitrag zu verfassen. Der untenstehende VBA Code funktioniert hervorragend, wenn einzelne Zeilen manuelle oder per Copy Paste geändert werden. Sobald ich jedoch mehrere Zeilen überschreibe, bekomme ich einen Typenfehler 13.
Dies liegt daran, dass die Zeile If StrConv(vNew, vbLowerCase) StrConv(vOld, vbLowerCase) nicht ausgeführt werden kann. Ich dachte, ich hätte dieses Problem durch den Loop behoben aber dem war nicht so.
Könnt ihr mir dabei helfen, dass der Loop korrekt funktioniert, sodass er auch bei mehreren eingefügten Zellen auf einmal korrekt reagiert?
Herzliche Grüsse
David:)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range, vNew, vOld
For Each c In Target.Cells
Set KeyCells = Range("A1:AO1")
If Not Application.Intersect(KeyCells, Target) Is Nothing Then
vNew = Target.Value
Application.EnableEvents = False
Application.Undo
vOld = Target.Value
Target.Value = vNew
Application.EnableEvents = True
If StrConv(vNew, vbLowerCase)  StrConv(vOld, vbLowerCase) Then
Call Modul1.TabName1
Call Modul2.Email_Tabelle1
End If
End If
Next
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: OldValue <> NewValue im Loop
26.07.2022 16:45:15
GerdL
Hallo David,
die Behandlung der Ersterfassung u. Löschung von Werten ist außen vor.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim v As Variant, x As Long, C As Range
If Not Intersect(Target, Range("A1:AO1")) Is Nothing Then
ReDim v(1 To Intersect(Target, Range("A1:AO1")).Cells.Count, 1 To 2)
For Each C In Intersect(Target, Range("A1:AO1"))
x = x + 1
v(x, 1) = C.Value
v(x, 2) = C.Address
Next
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
For x = LBound(v, 1) To UBound(v, 1)
If LCase(v(x, 1))  LCase(Range(v(x, 2))) Then
MsgBox "Houston Calling"
'Call Modul1.TabName1
'Call Modul2.Email_Tabelle1
Exit For 'ggf. damit Wiederholung unterbleibt!
End If
Next
End If
End Sub
Gruß Gerd
Anzeige
AW: OldValue <> NewValue im Loop
27.07.2022 09:12:31
David
Lieber Gerd
Danke dir für deine umgehende Unterstützung. Ich bin fasziniert von deinem Code und frage mich immer, wie man zu solch kreativen Lösungen kommt. Ich werde versuchen deinen Code zu verstehen, um für die Zukunft daraus zu lernen.
Nun funktioniert, bis auf ein kleines Detail, alles Perfekt. Es ist nämlich so, dass der neu hinzugefügte Wert in der Zelle stehen bleiben soll und der alte Wert verschwinden darf. Das Ziel des Codes ist lediglich die Auslösung der 2 Module. Die Werte sollen jedoch überschrieben werden und die alten Werte müssen weder aufbewahrt noch angezeigt werden.
Denkst du, du kannst mir da nochmal weiterhelfen?
Ich bin dir unglaublich dankbar für deine bisherige Hilfe:).
LG
David
Anzeige
AW: OldValue <> NewValue im Loop
27.07.2022 10:00:31
GerdL
Hallo David,
teste mal.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim v As Variant, x As Long, C As Range, b As Boolean
If Not Intersect(Target, Range("A1:AO1")) Is Nothing Then
ReDim v(1 To Intersect(Target, Range("A1:AO1")).Cells.Count, 1 To 2)
For Each C In Intersect(Target, Range("A1:AO1"))
x = x + 1
v(x, 1) = C.Value
v(x, 2) = C.Address
Next
Application.EnableEvents = False
Application.Undo
For x = LBound(v, 1) To UBound(v, 1)
If LCase(v(x, 1))  LCase(Range(v(x, 2))) Then
If Range(v(x, 2))  "" Then b = True
End If
Range(v(x, 2)) = v(x, 1)
Next
Application.EnableEvents = True
If b = True Then
MsgBox "Houston Calling"
'Call Modul1.TabName1
'Call Modul2.Email_Tabelle1
End If
End If
End Sub
Gruß Gerd
Anzeige
AW: OldValue <> NewValue im Loop
27.07.2022 11:44:55
David
Hallo Gerd
Das hat das Problem behoben! Du bist grossartig. Jetzt schäme ich mich fast zu sagen, dass sich ein letztes kleines Problem ergeben hat. Meine Daten werden von einem anderen VBA Code von einem anderen Workbook in dieses Workbook kopiert. Das verwirrt aber die Application.Undo Funktion, die dann Gelb markiert wird. Ich vermute, weil diese dann den Copy Paste Code rückgängig machen möchte. Denn wenn man einen manuellen Copy Paste Vorgang durchführt, funktioniert er jetzt tadellos. Der Code für den Copy Paste Vorgang habe ich untenstehend hinzugefügt. Übrigens Gerd, du hilfst mir hier völlig uneigennützig mit einem grossen Problem. Ist es also in irgendeiner Form erlaubt, dir per Twint einen kleinen Betrag zu überweisen oder irgendetwas in dieser Richtung. Alleine hätte ich die Lösung nämlich nie gefunden.
Liebe Grüsse
David
Sheets("Gruppenplanung").Select
Range("A2").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
ActiveSheet.Range("A2").AutoFilter Field:=19, Criteria1:="SG 3", Operator:=xlAnd
Rows("3:100").Select
Selection.Copy
Workbooks.Open "R:\BINplus\Langenthal\Stammgruppen\Stammgruppe 3\Stammgruppe 3_Unterrichtspläne Test.xlsm"
Worksheets("Stammdaten").Range("A1").PasteSpecial
Workbooks("Stammgruppe 3_Unterrichtspläne Test.xlsm").Close SaveChanges:=True
End Sub
Anzeige
AW: OldValue <> NewValue im Loop
27.07.2022 15:59:41
David
Ich habe vergessen den Hacken zu setzen:)
AW: OldValue <> NewValue im Loop
28.07.2022 22:49:46
GerdL
Ja, wir müssen die Hacken zusammenschlagen u. umdisponieren.
Jetzt fällt mit wieder ein, warum ich kaum mit dem für Änderungen per Code resistenten Application.Undo arbeite. :-)

'In ein allgemeines Modul, z.B. Modul1
Option Explicit
Public vntValues As Variant

Option Explicit
'Ins Modul DieseArbeitsmappe; Blattname ggf. anpassen!
Private Sub Workbook_Open()
Dim lngCol As Long
ReDim vntValues(1 To 41)
For lngCol = 1 To 41
vntValues(lngCol) = Worksheets("Tabelle1").Cells(1, lngCol).Value
Next
End Sub

Option Explicit
'Ins Modul der zu überwachendenTabelle
Private Sub Worksheet_Change(ByVal Target As Range)
Const RefAdr = "A1:AO1"
Dim objCell As Range, blnCheck As Boolean
If Not Intersect(Range(RefAdr), Target) Is Nothing Then
Application.EnableEvents = False
For Each objCell In Intersect(Range(RefAdr), Target)
If Not IsEmpty(vntValues(objCell.Column)) Then
If vntValues(objCell.Column)  objCell.Value Then
vntValues(objCell.Column) = objCell.Value
blnCheck = True
End If
End If
Next
End If
Application.EnableEvents = True
If blnCheck Then
MsgBox "Houston Calling"
'Call Modul1.TabName1
'Call Modul2.Email_Tabelle1
End If
End Sub
Für mich ist das hier "Just for fun".
Spende fürs Ahrtal über ZDF
IBAN DE 65 100 400 600 100 400 600 ""Hochwasser""
oder an irgendeine gemeinnützige Organisation.
Gruß Gerd
Anzeige
AW: OldValue <> NewValue im Loop
29.07.2022 10:57:04
David
Hallo Gerd
Einfach nur beeindruckend. Das funktioniert perfekt! Ich versuche gerade noch alle Zeilen in diesem Code zu verstehen, um ihn für mehrere Zeilen zu multiplizieren. Indem ich Const RefAdr1 und RefAdr2 definiere gelingt mir das eigentlich auch. Jedoch werden die Module für die Range A2:AO2 immer ausgelöst, auch wenn die Daten, die überschrieben wurden, dieselben wie davor sind. Untenstehend habe ich meinen Laienhaften Versuch mitgeschickt. Kannst du mir noch ein letztes Mal helfen:)?
Ich finde es beispiellos solidarisch von dir, so etwas "just for fun" zu machen. Schon faszinierend, dass hier auf dem Forum scheinbar etwas gelebt wird, was im restlichen Internet ausgestorben scheint. Ich werde sehr gerne etwas über die entsprechende IBAN spenden, um die Opfern der Hochwasserkatastrophe zu unterstützen.
Gruss David

Private Sub Worksheet_Change(ByVal Target As Range)
Const RefAdr1 = "A1:AO1"
Const RefAdr2 = "A2:AO2"
Dim objCell As Range, blnCheck As Boolean
If Not Intersect(Range(RefAdr1), Target) Is Nothing Then
Application.EnableEvents = False
For Each objCell In Intersect(Range(RefAdr1), Target)
If Not IsEmpty(vntValues(objCell.Column)) Then
If vntValues(objCell.Column)  objCell.Value Then
vntValues(objCell.Column) = objCell.Value
blnCheck = True
End If
End If
Next
End If
Application.EnableEvents = True
If blnCheck Then
Call Modul1.TabName1
Call Modul2.Email_Tabelle1
End If
If Not Intersect(Range(RefAdr2), Target) Is Nothing Then
Application.EnableEvents = False
For Each objCell In Intersect(Range(RefAdr2), Target)
If Not IsEmpty(vntValues(objCell.Column)) Then
If vntValues(objCell.Column)  objCell.Value Then
vntValues(objCell.Column) = objCell.Value
blnCheck = True
End If
End If
Next
End If
Application.EnableEvents = True
If blnCheck Then
Call Modul1.TabName2
Call Modul2.Email_Tabelle2
End If
End Sub

Anzeige
AW: OldValue <> NewValue im Loop
31.07.2022 15:28:16
GerdL
Hallo David,
für ein größeres rechteckiges Spielzeug.

'In ein allgemeines Modul, z.B. Modul1
Option Explicit
Public vntValues As Variant
'Ins Modul DieseArbeitsmappe; Blattname u. Bereich ggf. anpassen!
Option Explicit
Private Sub Workbook_Open()
Dim X As Range
With Worksheets("Tabelle1").Range("A1:AO2")
ReDim vntValues(.Row To .Rows.Count - .Row + 1, .Column To .Columns.Count - .Column + 1)
For Each X In .Cells
vntValues(X.Row, X.Column) = X.Value
Next
End With
End Sub
'Ins Modul der zu überwachenden Tabelle
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Const RefAdr = "A1:AO2"
Dim objCell As Range, blnCheck As Boolean, Z As Long, S As Long
If Not Intersect(Range(RefAdr), Target) Is Nothing Then
Application.EnableEvents = False
For Each objCell In Intersect(Range(RefAdr), Target)
Z = objCell.Row
S = objCell.Column
If vntValues(Z, S)  objCell.Value Then
If Not IsEmpty(vntValues(Z, S)) Then blnCheck = True
End If
vntValues(Z, S) = objCell.Value
Next
End If
Application.EnableEvents = True
If blnCheck Then
MsgBox "Houston Calling"
'Call Modul1.TabName1
'Call Modul2.Email_Tabelle1
End If
End Sub
Gruß Gerd
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige