Vba 根据另一工作表范围内的更改自动执行宏

Vba 根据另一工作表范围内的更改自动执行宏,vba,excel,Vba,Excel,我试图在sheet1上某个范围内的单元格发生更改时,自动在sheet2上运行宏。我已经尝试了很多事情,但我没有vba的经验来知道它们有什么问题。基本上,sheet1有我的输入,我为每个项目分配了优先级1-5。表2仅显示排名为1、3或4的项目。我用if语句完成了这个操作,但是在我的表中留下了一行空白行,所以我可以使用过滤函数对空白行进行排序。如果我更改sheet1上的排名,我希望sheet2表自动更新。我编写了一个排序函数,可以适当地引用sheet2数据,但我正在努力使其自动化,以便在sheet1

我试图在sheet1上某个范围内的单元格发生更改时,自动在sheet2上运行宏。我已经尝试了很多事情,但我没有vba的经验来知道它们有什么问题。基本上,sheet1有我的输入,我为每个项目分配了优先级1-5。表2仅显示排名为1、3或4的项目。我用if语句完成了这个操作,但是在我的表中留下了一行空白行,所以我可以使用过滤函数对空白行进行排序。如果我更改sheet1上的排名,我希望sheet2表自动更新。我编写了一个排序函数,可以适当地引用sheet2数据,但我正在努力使其自动化,以便在sheet1中的任何内容发生更改时自动更新。到目前为止,我一直在使用工作表_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
Sub度假村()
带工作表(“表2”)
.Range(“$A$2:$D$34”)。自动筛选字段:=2
.Range(“$A$2:$D$34”)。自动筛选字段:=2,标准1:=“”
以
端接头

听起来您走的是正确的道路,工作表\u更改是正确的方法,因为您确实希望在sheet1更改时运行宏,因此需要检测到这一点

我怀疑您只是遗漏了一件事,在sheet2上运行的宏,将其明确地放在模块引用sheet2中

比如说,

Worksheets("Sheet1").Range("A1")
而不仅仅是

Range("A1")
然后,只需使用函数名,就可以从任何工作表调用函数运行


如果您需要更多详细信息,请发布到目前为止的所有代码,我将很高兴地对其进行修改以适应

听起来您走的是正确的道路,工作表更改是正确的方法,因为您确实希望宏在sheet1更改时运行,因此您需要检测它

我怀疑您只是遗漏了一件事,在sheet2上运行的宏,将其明确地放在模块引用sheet2中

比如说,

Worksheets("Sheet1").Range("A1")
而不仅仅是

Range("A1")
然后,只需使用函数名,就可以从任何工作表调用函数运行

如果您需要更多详细信息,请发布到目前为止的所有代码,我将很高兴地对其进行修改以适应以下情况:

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

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

我终于让它起作用了!对于阅读本文并有类似问题的读者,我将此代码保存在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
Sub度假村()
'此函数通过第二列过滤跨越A2:D34的表,并对空白进行排序
带工作表(“表2”)
.Range(“$A$2:$D$34”)。自动筛选字段:=2
.Range(“$A$2:$D$34”)。自动筛选字段:=2,标准1:=“”
以
端接头
私有子工作表_更改(ByVal目标作为范围)
'如果E3:E34或G3:G34中sheet1上的任何单元格发生更改,此功能将运行my ReSort功能
如果不相交(目标,范围($E$3:$E$34,$G$3:$G$34”))则不算什么
求助
如果结束
端接头

谢谢大家的帮助!我对这件事感到很沮丧,真是大发雷霆。

我终于让它起作用了!对于阅读本文并有类似问题的读者,我将此代码保存在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
Sub度假村()
'此函数通过第二列过滤跨越A2:D34的表,并对空白进行排序
带工作表(“表2”)
.Range(“$A$2:$D$34”)。自动筛选字段:=2
.Range(“$A$2:$D$34”)。自动筛选字段:=2,标准1:=“”
以
端接头
私有子工作表_更改(ByVal目标作为范围)
'如果E3:E34或G3:G34中sheet1上的任何单元格发生更改,此功能将运行my ReSort功能
如果不相交(目标,范围($E$3:$E$34,$G$3:$G$34”))则不算什么
求助
如果结束
端接头

谢谢大家的帮助!我对此感到非常沮丧。

请发布您迄今为止尝试过的代码。“我编写了一种函数”-什么函数?它现在是如何运行的?请不要使用MS Office/VBA。请发布您迄今为止尝试过的代码。“我编写了一种函数”-什么函数?现在如何运行?请不要使用MS Office/VBA。欢迎使用StackOverflow!你能解释一下为什么它会起作用吗?谢谢!代码以Intersect方法为中心,该方法返回一个表示两个范围相交的对象。在这种情况下,它返回一些表示目标(单元格更改)与指定范围相交的对象。如果使用Intersect方法创建的对象“不存在任何内容”(也称为两个不相交),那么代码将不会执行任何操作。然而,如果它“不是什么”(呵呵),它会触发“做点什么”。这段代码最初是2003年发布的。欢迎使用StackOverflow!你能解释一下为什么它会起作用吗?谢谢!代码以Intersect方法为中心,该方法返回一个表示两个范围相交的对象。在这种情况下,它返回一些表示目标(单元格更改)与指定范围相交的对象。如果使用Intersect方法创建的对象“不存在任何内容”(也称为两个不相交),那么代码将不会执行任何操作。然而,如果它“不是什么”(呵呵),它会触发“做点什么”。这段代码最初来自2003年的文章。我应该在哪里保存我的函数?它们是否需要保存在同一个位置?我应该在哪里保存我的函数?它们需要保存在同一个地方吗?