【问题标题】:Automate a macro based on a change within a range from another sheet根据另一个工作表的范围内的更改自动执行宏
【发布时间】:2015-07-12 11:01:34
【问题描述】:

每当 sheet1 范围内的单元格发生更改时,我都会尝试自动运行一个宏以在 sheet2 上运行。我已经尝试了很多东西,但我没有 vba 经验来知道它们有什么问题。基本上,sheet1 有我的输入,我为每个项目分配了 1-5 的优先级。 Sheet2 仅显示排名为 1、3 或 4 的项目。我使用 if 语句执行此操作,但这会在我的表中留下一堆空白行,因此我可以使用过滤器功能对空白行进行排序。如果我更改 sheet1 上的排名,我希望 sheet2 表自动更新。我编写了一个排序函数,可以适当地使用我的 sheet2 数据,但我正在努力使其自动化,以便当 sheet1 中的任何内容发生更改时它会自动更新。到目前为止,我一直在使用 worksheet_change 并且可以在 sheet1 更改时让 sheet1 重新过滤,这不是我想要的。有什么想法吗?

这是我目前的排序功能:

Sub ReSort() 
With Worksheets("Sheet2")
    .Range("$A$2:$D$34").AutoFilter Field:=2 
    .Range("$A$2:$D$34").AutoFilter Field:=2, Criteria1:="<>" 
End With 
End Sub

【问题讨论】:

  • 请贴出你目前尝试过的代码。
  • “我写了一个函数” - 什么函数?现在如何运行?
  • 请不要将macros tag 用于 MS Office / VBA。

标签: vba excel


【解决方案1】:

这个:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A:A")) Is Nothing Then 
        ' Do something
    End If 
End Sub 

应该做的伎俩

【讨论】:

  • 欢迎来到 StackOverflow!你能解释一下为什么它会起作用吗?
  • 谢谢!代码以 Intersect 方法为中心,该方法返回一个表示两个范围交集的对象。在这种情况下,它返回一些对象,表示目标(单元格更改)和指定范围的交集。如果通过 Intersect 方法“Is Nothing”创建的对象(也就是两者不相交),那么代码将不会做任何事情。但是,如果它“不是什么都没有”(呵呵),它会触发'做某事。这段代码最初来自this 2003 帖子。
【解决方案2】:

我终于让它工作了!对于那些阅读本文并遇到类似问题的人,我将此代码保存在 sheet1 中:

Sub ReSort() 
'This function filters my table spanning A2:D34 by the second column and sorts out the blanks

With Worksheets("Sheet2")
    .Range("$A$2:$D$34").AutoFilter Field:=2
    .Range("$A$2:$D$34").AutoFilter Field:=2, Criteria1:="<>"
End With 
End Sub

Private Sub Worksheet_Change(ByVal Target As Range) 
'This function runs my ReSort function if any cell on sheet1 in E3:E34 or G3:G34 is changed
    If Not Intersect(Target, Range("$E$3:$E$34,$G$3:$G$34")) Is Nothing Then
        ReSort
End If
End Sub

感谢大家的帮助!我对此感到沮丧,正认真地拔头发。

【讨论】:

    【解决方案3】:

    听起来您走在正确的道路上,worksheet_change 是解决此问题的正确方法,因为您确实希望宏在 sheet1 更改时运行,因此您需要检测到这一点。

    我怀疑您只是缺少一件事,即在 sheet2 上运行的宏,将其明确放入模块引用 sheet2 中

    例如,

    Worksheets("Sheet1").Range("A1")
    

    而不仅仅是

    Range("A1")
    

    然后你可以调用函数从任何工作表运行,只需使用函数名

    如果您需要更多详细信息,请发布所有您目前拥有的代码,我会很乐意对其进行修改以适应

    【讨论】:

    • 我应该在哪里保存我的函数?它们需要保存在同一个地方吗?
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多