2017-07-04 4 views
0

hinzufügen Ich verwende unter VBA-Code, ich habe mehrere Spalten für Beispiel habe ich wenige zur Verfügung gestellt. Alles, was ich versuche, ist, wenn ich versuche, die Änderungen denselben Wert auf die gelöschten Spaltenüberschriften wiederherzustellen. Unten Code funktioniert gut, wenn ich Änderungen an den Bereich "A1" vornehmen, aber wenn ich andere Änderungen als "A1", Code dauert zu viel Zeit abgeschlossen und es ist zu oft Schleifen.Wie Array-Werte zu Spalte mit Excel VBA

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim headers() As Variant 
If Range("A1").Value <> "FIRST" Or Range("B1").Value <> "Second" Or Range("C1").Value <> "Third" Then 
headers() = Array("FIRST", "Second", "Third") 
With Sheets("Sheet1") 
For i = LBound(headers()) To UBound(headers()) 
.Cells(1, 1 + i).Value = headers(i) 
Next i 
.Rows(1).Font.Bold = True 
End With 
End If 

============================== Bitte mir helfen, dieses Problem zu beheben, schätzen Ihre Hilfe voraus.

Antwort

0

Sie haben Ereignisse der Sperrung kümmern, bevor Sie die Werte ändern. Versuchen Sie den folgenden Code:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim Header As Variant 
    If Application.Intersect(Target, Target.Parent.Range("A1:C1")) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
    Header = Array("FIRST", "Second", "Third") 
    Target.Parent.Range("A1:C1").Value = Header 
    Application.EnableEvents = True 
End Sub 
+0

Vielen Dank für die Hilfe. Es funktioniert – Rick

0

Das Problem ist, dass die Wertänderung auf .Cells(1, 1 + i).Value = headers(i) das Ereignis selbst auslöst. Du gehst im Grunde in eine endlose Ausführungskette wie diese.

Sie sollten entweder die Ereignisse während der Ausführung dieses Makros deaktivieren oder eine Überprüfung für jede Kopfzeile durchführen.

Die einfachste Lösung:

Option Explicit 
Private Sub Worksheet_Change(ByVal Target As Range) 
Dim headers() As Variant 
Dim i As Integer 

Application.EnableEvents = False 'This fixes your issue. 

If Range("A1").Value <> "FIRST" Or Range("B1").Value <> "Second" Or Range("C1").Value <> "Third" Then 
    headers() = Array("FIRST", "Second", "Third") 
    With Sheets("Sheet1") 
     For i = LBound(headers()) To UBound(headers()) 
      .Cells(1, 1 + i).Value = headers(i) 
     Next i 
     .Rows(1).Font.Bold = True 
    End With 
End If 

Application.EnableEvents = True 
End Sub 
+0

Vielen Dank, es funktioniert wie erwartet. – Rick

+0

Vielen Dank, es funktioniert wie erwartet. 1) Allerdings habe ich eine Frage, was ist die Verwendung von "Option Explicit"? denn Code funktioniert auch ohne "Option Explicit" Code. 2) Ich muss eine LOV mit zwei Werten unter Verwendung von VBA ("Eins" und "Zwei") in Spalte "A" (A2 bis A100) hinzufügen. Allerdings sollte dies überschrieben werden, wenn ich kopiere einen anderen Wert einfügen sagen "Drei", aber immer noch LOV sollte verfügbar sein für die Auswahl der ursprünglichen Wert ("Eins" und "Zwei"). Bitte beraten Sie mich, nochmals vielen Dank im Voraus für Ihre Hilfe. – Rick