我正在为新建筑制作跟踪工作簿。我有一个宏集来为主表单添加更多的出价,但是我需要根据构建器(大约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
答案 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有一个非常有效的观点,如果你有一个没有工作表的建造者名称,副本将会失败,但我相信它会给你一个不同于你的错误的错误。看到。我已经在代码中添加了一条注释,您可以在那里进行检查。