使用宏将基于条件的主数据复制到不同(多个)工作表

时间:2015-03-19 13:27:38

标签: excel-vba vba excel

我正在为新建筑制作跟踪工作簿。我有一个宏集来为主表单添加更多的出价,但是我需要根据构建器(大约20个不同的构建器)的条件将主数据复制到它们各自的表单到下一个空行。我在本网站上使用了另一个问题来修改代码,但它并不令我满意。这是我正在查看的数据:

Job Builder
2015其他
2015 AdvancedBuilding
2015 BullardHomes
2015 CodyWest
2015年DublinHomes
2015 DurationBuilders
2015年EGGonzales
2015 JanFrentzen
2015年McFallBuilders
2015 NewGeneration
2015年ONeilConstruction
2015年PridgenHomes
2015 ProfessionalBuilders 2015年RERobinson
2015 Robinshore
2015年Rutenberg
2015西班牙&Cooper
2015年Tremattera
2015 VisionConstruction
2015 WarringHomes
2015其他

Application.CutCopyMode = False
Dim r As Long, c As Long
Dim ws As Worksheet
Dim sBuilder As String
Dim wsRow as Long
Worksheets("MasterData").Activate
r = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row 'find last row
c = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column 'find last column
Range("B1:B").AutoFilter
For Each ws In Worksheets
If ws.Name <> "MasterData" Then
'*edited to accommodate pre-existing data
ws.Activate '*activate sheet so you can use Cells() with it
wsRow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1 '*find first usable row in ws
sFruit = ws.Name 'criteria to look for    
Worksheets("MasterData").Activate 'bring focus back to main sheet    
Range("B1:B" & r).AutoFilter Field:=2, Criteria1:=sBuilder    
Range(Cells(2, 1), Cells(r, c)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A" & wsRow)    
End If    
Next ws
Range("B1").AutoFilter

1 个答案:

答案 0 :(得分:0)

我的猜测是您尝试过滤空白的Criteria1

sFruit = ws.Name 'criteria to look for    
Worksheets("MasterData").Activate 'bring focus back to main sheet    
Range("B1:B" & r).AutoFilter Field:=2, Criteria1:=sBuilder    

您将工作表的名称指定给代码中未声明的sFruit(请务必在所有代码模块的开头使用Option Explicit,以确保错别字“#1}}。 t蠕变为变量名称),然后使用sBuilder作为.AutoFilter的条件,但没有为其分配任何内容。

我怀疑这会导致您的MasterData工作表上的数据被删除,但会过滤掉所有值,因为没有一个会等于空白sBuilder

一些简化代码的建议,因为我的猜测是你开始使用Macro Recorder代码(这通常是一个很好的起点!)。通过将MasterData工作表分配给变量,您可以直接引用它,而不必经常切换可见的工作表。

Dim r As Long, c As Long
Dim ws As Worksheet
Dim sBuilder As String
Dim wsRow as Long
Dim wsMaster as Worksheet

Application.CutCopyMode = False
Set wsMaster = Worksheets("MasterData")
' .UsedRange is a simple, built in way to get the total
r = wsMaster.UsedRange.Rows.count
c = wsMaster.UsedRange.Columns.Count
'Range("B1:B").AutoFilter
For Each ws In Worksheets
  If ws.Name <> "MasterData" Then
  '*edited to accommodate pre-existing data
    'ws.Activate '*activate sheet so you can use Cells() with it
    '*find first usable row in ws
    wsRow = ws.UsedRange.Rows.Count
    sMaster = ws.Name 'criteria to look for    
    'Worksheets("MasterData").Activate 'bring focus back to main sheet    
    wsMaster.Range("B1:B" & r).AutoFilter Field:=2, Criteria1:=sBuilder    
    'add code here to ensure "builderName" is a valid worksheet 
    wsMaster.Range(Cells(2, 1), Cells(r,c)).SpecialCells(xlCellTypeVisible).Copy _
              ws.Range("A" & wsRow)    
  End If    
Next ws
'Range("B1").AutoFilter

Ygor有一个非常有效的观点,如果你有一个没有工作表的建造者名称,副本将会失败,但我相信它会给你一个不同于你的错误的错误。看到。我已经在代码中添加了一条注释,您可以在那里进行检查。