使用excel宏重复结果

时间:2017-04-12 21:44:47

标签: excel excel-vba vba

我在excel文件上有一个工作表(COLLABT),显示来自其他3个工作表(COLLAB1,COLLAB2和COLLAB3)的一些信息。我的问题是我有重复的结果。 有谁知道如何解决这个问题?

这是我宏的代码

    Sub COLLABT()
With Sheets("COLLABT")
.Range("A2:O65536").Delete
      For Each sh In Sheets
Select Case sh.Name
  Case "COLLAB1", "COLLAB2", "COLLAB3"
    For lg = 2 To sh.Range("A65536").End(xlUp).Row
      LgS = .UsedRange.Rows.Count + 1
      .Cells(LgS, 1) = sh.Cells(lg, 1)
      .Cells(LgS, 2) = sh.Cells(lg, 2)
      .Cells(LgS, 3) = sh.Cells(lg, 3)
      .Cells(LgS, 4) = sh.Cells(lg, 4)
      .Cells(LgS, 5) = sh.Cells(lg, 5)
      .Cells(LgS, 6) = sh.Cells(lg, 6)
      .Cells(LgS, 7) = sh.Cells(lg, 7)
      .Cells(LgS, 8) = sh.Cells(lg, 8)
      .Cells(LgS, 9) = sh.Cells(lg, 9)
      .Cells(LgS, 10) = sh.Cells(lg, 10)
      .Cells(LgS, 11) = sh.Cells(lg, 11)
      .Cells(LgS, 12) = sh.Cells(lg, 12)
      .Cells(LgS, 13) = sh.Cells(lg, 13)
      .Cells(LgS, 14) = sh.Cells(lg, 14)
      .Cells(LgS, 15) = sh.Cells(lg, 15)

    Next


End Select
Next
End With
End Sub

这是当前结果

enter image description here

这应该是什么

[enter image description here 2

1 个答案:

答案 0 :(得分:0)

这段代码中有一些我本能地不喜欢的东西。如,

  1. 它会调用很多不想使用的工作表。
  2. 它使用.End(xlUp).Row作为For ... Next声明中的最后一个数字。如果在我对工作表进行更改的每个循环中重新计算,我会不相信这个数字。
  3. 该代码还使用.UsedRange.Rows.Count + 1来引入不稳定性。我喜欢在循环开始之前控制我的数字,然后在循环时控制它们。
  4. 以下代码可以做到这一点。

    Sub COLLABT()
    
        Dim ShNames() As String
        Dim i As Integer
        Dim Rng As Range
        Dim Sh As Worksheet
        Dim Rsl As Long                             ' Last row: Source
        Dim Rs As Long, Rt                          ' Row: Source / Target
    
        ShNames = Split("COLLAB1,COLLAB2,COLLAB3", ",")
        With Worksheets("COLLABT")
            Set Rng = .Range(.Rows(2), .Rows(.UsedRange.Row + .UsedRange.Rows.Count))
            Rng.ClearContents
    
            For i = 0 To UBound(ShNames)
                Set Sh = Worksheets(ShNames(i))
                Rt = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                Rsl = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
                For Rs = 2 To Rsl
                    Set Rng = Sh.Range(Sh.Cells(Rs, 1), Sh.Cells(Rs, 15))
                    Rng.Copy Destination:=.Cells(Rt, 1)
                    Rt = Rt + 1
                Next Rs
            Next i
        End With
    End Sub
    

    我并不是说上述任何因素都必须受到责备,但他们可能会这样做,而且如果我的代码产生的结果与我的观点相同,那么就不会产生相同的结果。

    坦率地说,当被问及问题的真正根源是什么时,我会首先看一下程序的调用。在后台的某个地方是否有一个事件过程可以对代码所做的任何事情作出反应并有效地调用它两次?或者,更简单的是,这是一个只能在测试期间发生的错误,例如数据实际上是在其中一个源表中复制的?这就是我先检查的内容,但由于我无法访问事实,我编写了代码。请试一试。