VBA-Code, der zum Löschen des Inhalts von Zelle AQ erforderlich ist, wenn sich der Wert von Zelle D ändert; Microsoft Excel für Office 365 MSO 32-Bit

642
MJS

Ich möchte damit sagen, dass das Programmieren nicht meine Stärke ist, aber ich würde mich über jede Hilfe freuen.

Ich habe die folgende Formel verwendet, um den Inhalt von Zelle AQ zu löschen, wenn sich der Wert von Zelle D (in derselben Zeile) ändert. Derzeit wird der Inhalt in AQ nur gelöscht, wenn sich der Wert in Zelle D in 1 ändert (vermutlich aufgrund der Zeile "If Target = 1 Then". Was verwende ich anstelle von "1", so dass sich alle Änderungen von einem beliebigen Wert zu ändern ein beliebiger Wert, initiiert die ClearContents-Anweisung für Zelle AQ?

Option Explicit  Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("D7:D506")) Is Nothing Then If Target = 1 Then Range("AQ" & Target.Row).ClearContents End If End If End Sub 
0
Warum testen Sie "If Target = 1"? Warum nicht einfach herausnehmen und `` Wenn nicht schneiden (Ziel, Bereich ("D7: D506")) ist dann nichts? `...` `Range (" AQ "& Target.Row) .ClearContents``? Scott vor 5 Jahren 0
Hallo Scott, ich habe es gerade herausgefunden. Ich hätte Ihre Antwort vor einer Stunde sehen sollen! Um Ihre Frage zu beantworten: Das ist das Problem, wenn man den gesamten Code von anderen ähnlichen Beispielen im Web plagiiert. Einfache Lösungen sind für Uneingeweihte nicht offensichtlich. Wenn ich Sie habe, gibt es Code, den ich hinzufügen könnte, der verhindert, dass AQ gelöscht wird, wenn der Wert von D auf denselben Wert geändert wird. (dh D = 1, dann gib ich wieder D = 1 ein). Derzeit kann der Code nicht zwischen einer echten Wertänderung (dh 1 zu 2) und der erneuten Eingabe desselben Werts (dh 1 zu 1) unterscheiden. MJS vor 5 Jahren 0
Interessante Frage. Ich habe ziemlich wenig Erfahrung mit `Worksheet_Change`. Ich gehe davon aus, dass Sie durch Experimente bestätigt haben, dass die Routine `Worksheet_Change` auch aufgerufen wird, wenn eine Zelle auf ihren aktuellen Wert„ geändert “wird. In diesem Fall vermute ich, dass Sie kein Glück haben (jeder, der es besser weiß, kann mich jederzeit korrigieren!). Ich kann vorschlagen, dass Sie eine Sicherungskopie der Spalte "D" aufbewahren und den "neuen" Wert mit Ihrer gespeicherten Kopie vergleichen. Scott vor 5 Jahren 0
Danke für die Hilfe @Scott MJS vor 5 Jahren 0
Vielen Dank @Christofer Weber. Ich hatte einige Probleme mit Ihrem Code, aber in der Zwischenzeit erhielt ich eine (scheinbar) praktikable Lösung in einem anderen Forum. Vielen Dank für Ihre Zeit und Mühe. MJS vor 5 Jahren 0

1 Antwort auf die Frage

0
Christofer Weber

Um sicherzustellen, dass eine echte Änderung stattgefunden hat, speichern wir zuerst den Wert der ausgewählten Zelle als öffentliche Variable. Da Sie mehrere Zellen gleichzeitig auswählen können, habe ich mich für eine öffentliche Sammlung entschieden.

Wenn dann eine Änderung auftritt, vergleichen wir den neuen Wert dieser Zelle mit dem alten Wert in der Auflistung. Nur wenn sie nicht übereinstimmen, löschen Sie den Inhalt von AQ. So etwas wie:

Public coll As New Collection  Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim cel As Range Set coll = New Collection If Not Intersect(Target, Range("D7:D506")) Is Nothing Then For Each cel In Target coll.Add cel.Value, cel.Address Next cel End If End Sub  Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("D7:D506")) Is Nothing Then If Not Target.Value = coll(Target.Address) Then Range("AQ" & Target.Row).ClearContents End If End If End Sub 

Die Bearbeitung wurde aktualisiert, wenn mehrere Zellen ausgewählt werden.

Wenn Sie einen Wert ändern, Range("D7:D506")ohne zuvor die Zelle auszuwählen, wird offensichtlich ein Fehler ausgegeben.

Denken Sie daran, Sie können mehrere Zellen gleichzeitig bearbeiten, wenn Sie den Wert löschen. Dann gibt dieser Code auch einen Fehler aus. Aber wir können das umgehen, indem Worksheet_Changewir denselben Ansatz verwenden wie in Worksheet_SelectionChange:

Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range If Not Intersect(Target, Range("D7:D506")) Is Nothing Then For Each cel In Target If Not cel.Value = coll(cel.Address) Then Range("AQ" & cel.Row).ClearContents End If Next cel End If End Sub 
(1) Nizza. Ich dachte daran, eine Kopie der Spalte "D" an einer anderen Stelle auf dem Arbeitsblatt aufzubewahren (z. B. Spalte "AD"). Das Speichern im VBA-Speicher scheint sicherer zu sein. (2) Zwischen dem Fragetitel und der Zeile "Wenn sich nicht schneidet (Ziel, Bereich (" D7: D506 ") ist Nothing Then"? ", Scheint es, dass der Benutzer nur mit Änderungen *** in ** Spalte` D befasst ist `; * speziell im Bereich` D7: D506`. Ich würde also vorschlagen, dass Ihre Routine nicht "For Each cel In Target", sondern "For Each cel In Intersect (Target, Range (" D7: D506 "))" sein sollte. " Scott vor 5 Jahren 1
Schnittpunkt in die for-Schleife setzen? Ich habe nie daran gedacht. Ich mag das! Sehr effizient. Christofer Weber vor 5 Jahren 0