更改范围中的单元格时运行多个宏

时间:2015-03-14 14:52:07

标签: excel vba excel-vba

请耐心等待我,因为我是完整的 vba新手并且围绕着我已经拥有的东西已经把我带走的时间比我承认的要长得多。

我有一个工作簿,其中包含一个主列表“ITEMS”和几个(最多15个)子选项卡,用于从ITEMS表中获取信息。我已经能够使用调用此代码的每个子表上的按钮来实现这一点:

Private Sub getNELL_Click()
Sheets("ITEMS").Range("A1:K400").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("ITEMS").Range("O1:O2"), CopyToRange:=Range("A1:K1") _
, Unique:=False
End Sub

每次单击按钮时,此代码都会成功地将每个相关行抓取到工作表中,其中每个getX都有不同的名称/条件范围(getRILEY,getELLE等)。

但我接下来要做的是在ITEMS表格的G栏中的任何单元格发生更改时自动运行这些宏。在纯文本中,我需要的是:

When [Any Cell in Column G] in Sheet("ITEMS") is changed
Run getNELL, getRiley, getELLE (x15 different macros)

here's my file包含所有表格( sic )。

编辑:

并且已完成

将宏移动到模块而不是每个单独的工作表中,将它们公开并删除_Click,以及下面的代码实现了我需要的魔力。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim KeyCells As Range
 Set KeyCells = Range("G2:G400")

 If Not Application.Intersect(KeyCells, Range(Target.Address)) _
 Is Nothing Then

  getNELL
  getMIKA
  getRILEY
  getJANNA
  getWOO
  getELLE
  getMK
  getLAURA
  getFLIPSE
  getJENN
  getCRIS

End If
End Sub

2 个答案:

答案 0 :(得分:0)

首先,使用this link作为在单元格更改时触发事件的资源。这通常只是在子程序声明中。

对于代码,将“private”替换为“public”,将所有私有sub更改为public subs。然后在子程序列表中调用子程序:

>

  

Subx

     
    

Suby

  
     

Subz

     
    

结束子

  

很抱歉,当我从手机输入时,答案并不是非常详细。此外,这些子示例应各自独立。我似乎无法改变这一点。

答案 1 :(得分:0)

您已在ITEM表中创建过滤条件(灰色突出显示) 因此,为INDP表中需要什么标准范围的工作表创建一个映射 e.g。

SheetName   Criteria Mapping
nell        O1:O2
mika        P1:P2
riley       Q1:Q2
janna       R1:R2
woo         S1:S2
elle        O3:O4
mk          P3:P4
laura       Q3:Q4
flipse      R3:R4
jenn        S3:S4
cris        O5:O6

在模块中添加此代码

Public Sub pGet_Data(ByVal SheetName As Worksheet, ByVal CriteriaRng As Range)

    ThisWorkbook.Worksheets("ITEMS").Range("A1:K400").AdvancedFilter _
                    Action:=xlFilterCopy, _
                    CriteriaRange:=CriteriaRng, _
                    CopyToRange:=SheetName.Range("A1:K1"), _
                    Unique:=False

End Sub

在Thisworkbook Module中添加给定代码:

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

    Dim rngCriteriaRange    As Range
    Dim rngOneMap           As Range
    Dim wksSheet            As Worksheet

    If Sh.Name = "ITEMS" And Target.Column = 7 Then
        Set rngCriteriaRange = Sh.Range("W6:X16") '<--you can make it dynamic

        For Each rngOneMap In rngCriteriaRange.Rows
            Set wksSheet = ThisWorkbook.Worksheets(rngOneMap.Cells(1, 1).Value)
            Application.StatusBar = "Updating [" & wksSheet & "] Sheet"
            Call pGet_Data(wksSheet, wksSheet.Range(rngOneMap.Cells(1, 2).Value))
        Next rngOneMap
    End If

    MsgBox "Sheets has been updated.", vbOKOnly, "Be Happy..."

ClearMemory:
    Set rngCriteriaRange = Nothing
    Set rngOneMap = Nothing
    Set wksSheet = Nothing

End Sub

我认为这将解决你所寻找的......:)