【问题标题】:Worksheet_change event - change cell value on all sheets when selecting from drop-down listWorksheet_change 事件 - 从下拉列表中选择时更改所有工作表上的单元格值
【发布时间】:2014-01-21 19:10:00
【问题描述】:

我想知道是否有人可以用以下代码提供建议。在我将下拉列表添加到“D4”单元格之前它运行良好(更准确地说,它们是合并的单元格“D4:F4”)。 D4 单元格中的这些下拉列表位于工作簿的所有工作表上,“列表”工作表除外,并且包含相同的数据。这些源数据位于工作表“列表”上的命名表中,并使用INDIRECT 函数引用。我想要实现的是,如果我从任何工作表的下拉列表中选择一个项目,其他工作表上的“D4”单元格值会自动更改。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim wb1 As Workbook
Dim ws1 As Worksheet

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

Set wb1 = ThisWorkbook
Set ws1 = wb1.ActiveSheet

If Target.Cells.Count > 1 Then GoTo LetsContinue

'Change cell value on all sheets except for sheet "lists"
If Not Intersect(Target, ws1.Range("D4")) Is Nothing Then
    For Each ws In wb1.Worksheets
        If ws.Name <> "lists" Then
            If Target.Value <> ws.Range(Target.Address).Value Then
            ws.Range(Target.Address).Value = Target.Value
        End If
    End If
    Next ws
Else
    GoTo LetsContinue
End If

LetsContinue:
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

【问题讨论】:

  • 请告诉什么是不工作,什么是问题/错误/发生了什么变化??
  • 嗨,我已经尝试了 hstay 的解决方案并将代码放入 Workbook_SheetChange,这是向前迈出的一步。当手动将值输入“D4”单元格时效果很好,但是当我只从 D4 的下拉数据验证列表中选择值时,其他工作表上没有任何变化。有什么想法吗?
  • 您能否更具体地了解“下拉命名表-间接函数”关系如何为您工作?
  • @hstay 是的,当然。在“列表”表上,我有一个名为“ExportData”的表,所有其他表上的单元格“D4”指的是表的第一列标题“名称”。数据验证公式如下所示:=INDIRECT("ExportData[Name]")。我需要当我在“D4”单元格中选择一个名称时,更改也将在“D4”单元格的其他表格中引入。实际上,现在我认为问题与从下拉列表中选择或删除“D4”中的值时,此单元格仍然保持活动状态有关。只有当我手动输入值,按下回车键并且下面的单元格变为活动状态时,宏才会正确触发。
  • @hstay 我在互联网上做了更多的研究,发现如果工作表中的 Worksheet_Change/Workbook_SheetChange 事件和 UDF 函数组合,则 Application.Volatile 语句必须变为“False”在函数中。我在我的文件中尝试了这个,现在它就像一个魅力!感谢您的时间和所有的帮助!当然,我也会将您的回答标记为有帮助。

标签: vba excel


【解决方案1】:

尝试将您的代码作为 Workbook 模块中的 Worbook_SheetChange 事件而不是使用工作表事件:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim wb1 As Workbook
Dim ws1 As Worksheet

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

Set wb1 = ThisWorkbook
Set ws1 = Sh

If Target.Cells.Count > 1 Then GoTo LetsContinue

'Change cell value on all sheets except for sheet "lists"
If Not Intersect(Target, ws1.Range("D4")) Is Nothing Then
    For Each ws In wb1.Worksheets
        If ws.Name <> "Lists" Then
            If Target.Value <> ws.Range(Target.Address).Value Then
                ws.Range(Target.Address).Value = Target.Value
            End If
        End If
    Next ws
Else
    GoTo LetsContinue
End If

LetsContinue:
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

这样,您的代码将适用于工作簿的任何工作表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多