【问题标题】:Excel VBA macro to copy specific rows from workbook sheets into new summary sheet....almost worksExcel VBA 宏将特定行从工作簿表复制到新的摘要表中......几乎可以工作
【发布时间】:2015-01-28 05:10:52
【问题描述】:

我需要能够查看工作簿每个工作表中指定范围的单元格,如果它们符合条件,则将该行复制到摘要表中。下面的代码在大部分情况下都有效,除了在少数情况下它复制不符合条件的行和一个跳过它应该复制的行的情况。

有没有办法使用调试工具,以便在循环浏览代码时随时可以看到:什么是活动工作表?什么是活动细胞?什么是活动行?等等。

另外,我应该使用 -For Each Cell in Range- 而不是 -While Len- 来循环遍历每张纸上的指定范围吗?

Sub LoopThroughSheets()

Dim LSearchRow As Integer
Dim LCopyToRow As Integer
Dim ws As Worksheet

'Start copying data to row 2 in HH (row counter variable)
LCopyToRow = 2

For Each ws In ActiveWorkbook.Worksheets

'Start search in row 7
LSearchRow = 7

While Len(ws.Range("M" & CStr(LSearchRow)).Value) > 0

'If value in column M > 0.8, copy entire row to HH
If ws.Range("M" & CStr(LSearchRow)).Value > 0.8 Then

    'Select row in active Sheet to copy
    Rows(CStr(LSearchRow) & ":" & CStr(LSearchRow)).Select
    Selection.Copy

    'Paste row into HH in next row
    Sheets("HH").Select
    Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow)).Select
    ActiveSheet.Paste

    'Move counter to next row
    LCopyToRow = LCopyToRow + 1

    'Go back to active ws to continue searching
    ws.Activate

End If

LSearchRow = LSearchRow + 1

Wend


Next ws
'Position on cell A1 in sheet HH
Sheets("HH").Select

Application.CutCopyMode = False
Range("A1").Select
MsgBox "All matching data has been copied."

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    与上一个答案非常相似,只是措辞不同。但结果相同。

    Sub Button1_Click()
        Dim Rws As Long, Rng As Range, ws As Worksheet, sh As Worksheet, c As Range, x As Integer
        Set ws = Worksheets("HH")
        x = 2
        Application.ScreenUpdating = 0
        For Each sh In Sheets
            If sh.Name <> ws.Name Then
                With sh
                    Rws = .Cells(Rows.Count, "M").End(xlUp).Row
                    Set Rng = .Range(.Cells(7, "M"), .Cells(Rws, "M"))
                    For Each c In Rng.Cells
                        If c.Value > 0.8 Then
                            c.EntireRow.Copy Destination:=ws.Cells(x, "A")
                            x = x + 1
                        End If
                    Next c
                End With
            End If
        Next sh
    End Sub
    

    【讨论】:

      【解决方案2】:

      关于调试的第一个问题,您可以使用:

      Debug.Print "Worksheet: " & ActiveSheet.Name
      

      随时在您的代码中将您所在的工作表打印到 Visual Basic 编辑器的“立即”窗口中。这非常适合在所有情况下进行调试。

      其次,For Each 循环是循环任何事物的最快方法,但它也有缺点。也就是说,如果您要删除/插入任何内容,它将返回有趣的结果(复制/粘贴就可以了)。如果您不知道需要处理多少行,则最好使用任何形式的 While 循环。

      就您的代码而言,我会这样做(您仍然需要在 while 循环的上方和下方包含您的代码):

      Dim Items As Range
      Dim Item As Range
      
      'This will set the code to loop from M7 to the last row, if you
      'didn't want to go to the end there is probably a better way to do it.
      
      Set Items = ws.Range("M7:M26")
      
      For Each Item In Items
      
      'If value in column M > 0.8, copy entire row to HH
      If Item.Value > 0.8 Then
      
          'Select row in active Sheet to copy
          Item.EntireRow.Copy
      
          'Paste row into HH in next row
          Sheets("HH").Rows(LCopyToRow & ":" & LCopyToRow).PasteSpecial
      
          'Move counter to next row
          LCopyToRow = LCopyToRow + 1
      
      End If
      
      Next Item
      

      【讨论】:

      • 谢谢。实际上我正在搜索的范围是 M7 到 M26。使用计数器执行“直到”会更好吗?
      • 不,如果它总是 M7:M26,那么您只需将其编程到 For Each 的范围内。真的很简单,我更新了我的答案。
      • 嗨 D_Zab,非常感谢!最后一个跟进....我现在意识到我无法复制整行。相反,我需要从满足条件的行中复制一些单元格。我应该使用相对于 Item 的 Offset 函数吗?
      • 是的,您可以将偏移量与 For Each 一起使用,或者您可以使用另一个“For I = 7 to 26”并通过这种方式循环,然后您可以通过 I 变量引用循环中的当前行.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多