如何使用excel VBA向列中添加数组值

如何使用excel VBA向列中添加数组值,excel,vba,Excel,Vba,我使用下面的vba代码,我有多个样本列,我提供了几个。 我所要做的只是,如果我尝试进行更改,那么相同的值应该恢复到已删除的列标题。 如果我对范围“A1”进行任何更改,下面的代码工作正常。但是,如果我对范围“A1”进行任何更改,代码完成时间太长,循环次数太多 Private Sub Worksheet_Change(ByVal Target As Range) Dim headers() As Variant If Range("A1").Value <> "FIRST" Or Ran

我使用下面的vba代码,我有多个样本列,我提供了几个。 我所要做的只是,如果我尝试进行更改,那么相同的值应该恢复到已删除的列标题。 如果我对范围“A1”进行任何更改,下面的代码工作正常。但是,如果我对范围“A1”进行任何更改,代码完成时间太长,循环次数太多

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
Private子工作表\u更改(ByVal目标作为范围)
Dim headers()作为变量
如果范围(“A1”).值“第一”或范围(“B1”).值“第二”或范围(“C1”).值“第三”,则
headers()=数组(“第一”、“第二”、“第三”)
附页(“第1页”)
对于i=LBound(headers())到UBound(headers())
.Cells(1,1+i).值=标题(i)
接下来我
.Rows(1).Font.Bold=True
以
如果结束
==============================
请帮助我解决此问题,提前感谢您的帮助。

问题是
.Cells(1,1+i)上的值更改。value=headers(i)
会触发事件本身。你基本上进入了这样一个无休止的执行链

您应该在执行此宏期间禁用事件,或者检查每个标头

最简单的解决方案:

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
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim headers()作为变量
作为整数的Dim i
Application.EnableEvents=False'这将修复您的问题。
如果范围(“A1”).值“第一”或范围(“B1”).值“第二”或范围(“C1”).值“第三”,则
headers()=数组(“第一”、“第二”、“第三”)
附页(“第1页”)
对于i=LBound(headers())到UBound(headers())
.Cells(1,1+i).值=标题(i)
接下来我
.Rows(1).Font.Bold=True
以
如果结束
Application.EnableEvents=True
端接头

在更改值之前,必须注意禁用事件。 请尝试以下代码:

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

非常感谢你,一切如期进行。1) 然而,我有一个问题,“选项明确”的用途是什么?因为,即使没有“选项显式”代码,代码也可以正常工作。2) 我需要在列“a”(A2到A100)中使用VBA(“一”和“二”)添加一个具有两个值的LOV。但是,如果我复制粘贴一些其他值,比如“三”,那么这应该会覆盖,但是LOV仍然可以用于选择原始值(“一”和“二”)。请告诉我,再次感谢你的帮助。