基于单元格值将行从一个Excel工作表复制到另一个工作表

kx5bkwkv  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(233)

我正在寻找一个简单的excel宏,可以复制一行从一个工作表到另一个excel内的基础上有一个特定的数字/值在单元格中。我有两个工作表。一个称为“主”和工作表称为“top10”。
下面是一个数据示例。

下面是我尝试使用的宏:

Sub MyMacro()
Dim i As Long, iMatches As Long
Dim aTokens() As String: aTokens = Split("10", ",")
For Each cell In Sheets("master").Range("A:A")
    If (Len(cell.Value) = 0) Then Exit For
        For i = 0 To UBound(aTokens)
            If InStr(1, cell.Value, aTokens(i), vbTextCompare) Then
                iMatches = (iMatches + 1)
                Sheets("master").Rows(cell.Row).Copy Sheets("top10").Rows(iMatches)
            End If
        Next
Next
End Sub

我确信我做了一些非常愚蠢的事情,导致这个程序无法运行。我可以运行宏本身而不会出现任何错误,但是没有任何东西被复制到我希望编译的工作表中。

wqsoz72f

wqsoz72f1#

If (Len(cell.Value) = 0) Then Exit For是无意义的。更改如下:

Sub MyMacro()
Dim i As Long, iMatches As Long
Dim aTokens() As String: aTokens = Split("10", ",")
For Each cell In Sheets("master").Range("A:A")
    If Len(cell.Value) <> 0 Then
        For i = 0 To UBound(aTokens)
            If InStr(1, cell.Value, aTokens(i), vbTextCompare) Then
                iMatches = (iMatches + 1)
                Sheets("master").Rows(cell.Row).Copy Sheets("top10").Rows(iMatches)
            End If
        Next
    End If
Next
End Sub
bwntbbo3

bwntbbo32#

我认为代码在第一行数据后停止的原因是因为下一行测试的单元格为空(在示例电子表格中),因此退出循环(因为Len(cell.Value) = 0)。一个高级筛选器可以完全满足您的需要,而且速度更快。在示例电子表格中,您需要插入一个空行2,并在单元格A2中输入公式“=10”。然后下面的代码将完成您的需要(假设master是ActiveSheet):

Sub CopyData()
    Dim rngData As Range, lastRow As Long, rngCriteria As Range
    With ActiveSheet
        ' This finds the last used row of column A
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        ' Defines the criteria range - you can amend it with more criteria, 
        ' it will still work
        ' 22 is the number of the last column in your example spreadsheet
        Set rngCriteria = .Range(.Cells(1, 1), .Cells(2, 22))

        ' row 2 has the filter criteria, but we will delete it after copying
        Set rngData = .Range(.Cells(1, 1), .Cells(lastRow, 22))

        ' Make sure the destination sheet is clear
        ' You can replace sheet2 with Sheets("top10"), 
        ' but if you change the sheet name your code will not work any more. 
        ' Using the vba sheet name is usually more stable
        Sheet2.UsedRange.ClearContents

        ' Here we select the rows we need based on the filter 
        ' and copy it to the other sheet
        Call rngData.AdvancedFilter(xlFilterCopy, rngCriteria, Sheet2.Cells(1, 1))

        ' Again, replacing Sheet2 with Sheets("top10").. 
        ' Row 2 holds the filter criteria so must be deleted
        Sheet2.Rows(2).Delete
    End With
End Sub

有关高级过滤器的参考,请查看以下链接:http://chandoo.org/wp/2012/11/27/extract-subset-of-data/

cnwbcb6i

cnwbcb6i3#

正如@Ioannis提到的,您的问题是主A3中的空单元格与您的If (Len(cell.Value) = 0) Then Exit For相结合
我没有使用if来检测范围的结束,而是使用了以下代码:

LastRow= Sheets("master").Cells(Cells.Rows.Count, "A").End(xlUp).Row
Set MyRange = Sheets("master").Range("A1:A" & LastRow)

结果代码如下:

Sub MyMacro()
Dim i As Long, iMatches As Long
Dim aTokens() As String: aTokens = Split("10", ",")
Dim LastRow
Dim MyRange 

LastRow = Sheets("master").Cells(Cells.Rows.Count, "A").End(xlUp).Row
Set MyRange = Sheets("master").Range("A1:A" & LastRow)

For Each cell In MyRange
        For i = 0 To UBound(aTokens)
            If InStr(1, cell.Value, aTokens(i), vbTextCompare) Then
                iMatches = (iMatches + 1)
                Sheets("master").Rows(cell.Row).Copy Sheets("top10").Rows(iMatches)
            End If
        Next
Next
End Sub

我用你的练习册测试了这个,效果很好

相关问题