【发布时间】:2018-06-11 13:39:31
【问题描述】:
寻求一些帮助,以便仅将已从各种工作表“填充”的行导入同一工作簿中的集中“导入”工作表。工作簿中的每个选项卡都是一个模板,并非所有行都已填写,但仍作为模板的一部分。见下例:
Organic Fruit Color Quantity
Yes Grapes Purple 10
Yes Banana Yellow 15
Yes Apple Red 4
Yes Orange
No Kiwi
假设在上面的示例中,“有机”和“水果”列是预先确定的,但“颜色”和“数量”行是由各个利益相关者填写的 - 有些行没有在此数据中填写收集周期,但将在未来。在这种情况下,我只对导入前 3 行感兴趣,因为“Orange”和“Kiwi”行当前没有填写。我有兴趣在集中的“导入”选项卡中编译的行数因工作簿中的每个选项卡而异(即它不是标准的“前 3 行”)。
我可以在下面的代码中哪里修改,以便只导入已“填写”的行? “导入”选项卡中有标题。如果您也有任何改进整体代码的建议,非常感谢
Sub CombineDataSheets()
Dim wksSrc As Worksheet
Dim wksDst As Worksheet
Dim rngSrc As Range
Dim rngDst As Range
Dim lngSrcLastRow As Long 'Src is source
Dim lngDstLastRow As Long 'Dst is destination
'Set references
Set wksDst = ThisWorkbook.Worksheets("Import")
lngDstLastRow = LastOccupiedRowNum(wksDst)
'Set the initial destination range
Set rngDst = wksDst.Cells(lngDstLastRow + 1, 1) 'edit the cells +/- forimportation into central tab in database
'Loop through all sheets
For Each wksSrc In ThisWorkbook.Worksheets
'Make sure we skip the "Import" destination sheet!
If wksSrc.Name <> "Import" And wksSrc.Name <> "Cover page" And wksSrc.Name <> "Introduction" Then
'Identify the last occupied row on this sheet
lngSrcLastRow = LastOccupiedRowNum(wksSrc)
'Store the source data (start of copy area is calibrated to table insheet) then copy it to the destination range
With wksSrc
Set rngSrc = .Range(.Cells(11, 2), .Cells(lngSrcLastRow, 21))
rngSrc.Copy Destination:=rngDst
End With
'Redefine the destination range now that new data has been added
lngDstLastRow = LastOccupiedRowNum(wksDst)
Set rngDst = wksDst.Cells(lngDstLastRow + 1, 1)
End If
Next wksSrc
End Sub
Public Function LastOccupiedRowNum(Sheet As Worksheet) As Long
Dim lng As Long
If Application.WorksheetFunction.CountA(Sheet.Cells) <> 0 Then
With Sheet
lng = .Cells.Find(What:="*", _
After:=.Range("S1"), _
Lookat:=xlPart, _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
Else
lng = 1
End If
LastOccupiedRowNum = lng
End Function
【问题讨论】:
-
如果数据以颜色或数量为主键排序,则底部应为空白。将 lngSrcLastRow 分配给最后占用的颜色或数量行。
-
数据是否总是像示例一样显示,其中第 1 列和第 2 列通常填写,然后第 3 列和第 4 列有问题?如果是这样,您可以按最不可能填写的行对数据进行排序,然后按单元格(rows.count,LeastLikelyColumn).end(xlup).row 将范围复制到主表中。
-
@Jeeped jinx 你欠我一杯啤酒……显然我们是在同一秒提交的。
-
抱歉,我忘了添加最后一行功能-