请耐心等待我,因为我是完整的 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
答案 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
我认为这将解决你所寻找的......:)