运行过程需要很长的时间

问题描述:

这里我的代码:运行过程需要很长的时间

Private Sub CopyRanges() 

Sheets("Test2").Activate 

Application.ScreenUpdating = False 

Application.DisplayAlerts = False 

Range(ActiveSheet.Columns("A"), ActiveSheet.Columns("A").End(xlDown)).Value = Range(Sheets("Test1").Columns(2), Sheets("Test1").Columns(2).End(xlDown)).Value 

Range(ActiveSheet.Columns("B"), ActiveSheet.Columns("B").End(xlDown)).Value = Range(Sheets("Test1").Columns(23), Sheets("Test1").Columns(23).End(xlDown)).Value 

Range(ActiveSheet.Columns("C:D"), ActiveSheet.Columns("C:D").End(xlDown)).Value = Range(Sheets("Test1").Columns(3), Sheets("Test1").Columns(3).End(xlDown)).Value 

Range(ActiveSheet.Columns("E:F"), ActiveSheet.Columns("E:F").End(xlDown)).Value = Range(Sheets("Test1").Columns(4), Sheets("Test1").Columns(4).End(xlDown)).Value 

Range(ActiveSheet.Columns("G:H"), ActiveSheet.Columns("G:H").End(xlDown)).Value = Range(Sheets("Test1").Columns(5), Sheets("Test1").Columns(5).End(xlDown)).Value 

Range(ActiveSheet.Columns("I:J"), ActiveSheet.Columns("I:J").End(xlDown)).Value = Range(Sheets("Test1").Columns(6), Sheets("Test1").Columns(6).End(xlDown)).Value 

Range(ActiveSheet.Columns("K:L"), ActiveSheet.Columns("K:L").End(xlDown)).Value = Range(Sheets("Test1").Columns(7), Sheets("Test1").Columns(7).End(xlDown)).Value 

Range(ActiveSheet.Columns("M:N"), ActiveSheet.Columns("M:N").End(xlDown)).Value = Range(Sheets("Test1").Columns(8), Sheets("Test1").Columns(8).End(xlDown)).Value 

Range(ActiveSheet.Columns("O:P"), ActiveSheet.Columns("O:P").End(xlDown)).Value = Range(Sheets("Test1").Columns(9), Sheets("Test1").Columns(9).End(xlDown)).Value 

Range(ActiveSheet.Columns("Q:R"), ActiveSheet.Columns("Q:R").End(xlDown)).Value = Range(Sheets("Test1").Columns(10), Sheets("Test1").Columns(10).End(xlDown)).Value 

Range(ActiveSheet.Columns("S:T"), ActiveSheet.Columns("S:T").End(xlDown)).Value = Range(Sheets("Test1").Columns(11), Sheets("Test1").Columns(11).End(xlDown)).Value 

Range(ActiveSheet.Columns("U:V"), ActiveSheet.Columns("U:V").End(xlDown)).Value = Range(Sheets("Test1").Columns(12), Sheets("Test1").Columns(12).End(xlDown)).Value 

Range(ActiveSheet.Columns("W:X"), ActiveSheet.Columns("W:X").End(xlDown)).Value = Range(Sheets("Test1").Columns(13), Sheets("Test1").Columns(13).End(xlDown)).Value 

Range(ActiveSheet.Columns("Y:Z"), ActiveSheet.Columns("Y:Z").End(xlDown)).Value = Range(Sheets("Test1").Columns(14), Sheets("Test1").Columns(14).End(xlDown)).Value 

Dim rCell As Range 

Dim rRng As Range 

    For Each rCell In Range("C1:D800") 

     If rCell.Value = "Maximum accomodation in room is" Then 

      If rRng Is Nothing Then 

       Set rRng = rCell 

      Else 

       Set rRng = Application.Union(rRng, rCell) 

      End If 

     End If 

    Next 

    rRng.Offset(, 0).Select 
    Selection.EntireRow.Unmerge 
    Selection.HorizontalAlignment = xlGeneral 

    Columns("A").Replace What:=",99", Replacement:="", LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
     ReplaceFormat:=False 

    Columns("A").Replace What:=",00", Replacement:="", LookAt:= _ 
     xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
     ReplaceFormat:=False 

    Range("B5").Select 

    Application.DisplayAlerts = True 

    Application.ScreenUpdating = True 

    Application.Run "ResizeAll" 

End Sub 

VBA的效果很好,除了时机。程序需要7-10分钟,并找不到解决方案来缩短时间。

在此先感谢

+2

可能是一个用于http://codereview.stackexchange.com/ –

+0

我想,所有的列需要扩大问题直到同一排右边?然后你可以先获得你的数据的最后一行,这样就避免了.End(xlDown)很多次 –

+0

是的,扩展到同一行的权利 – ZRS

由于我的建议的一个例子,我改编的第一行,你可以试试这个,我希望它会提高你的代码的性能。

Test2LastRow =Sheets("Test2").Cells(Rows.Count, 1).End(xlUp).Row 
Test1LastRow =Sheets("Test1").Cells(Rows.Count, 1).End(xlUp).Row 

Sheets("Test2").Range("A1:A" & Test2LastRow & "").Value = Sheets("Test1").Range("B1:B" & Test1LastRow & "").Value 
+0

我在这条线上应用但调试为“Object Variable or block variable not set” rRng.Offset(,0).Select – ZRS

有点难以遵循你的代码正在做什么 - 重新安排列和重复其中的一些?似乎Test2列C & D等于Test1列3?

我发现一些代码,看起来像它可以加快速度(https://www.mrexcel.com/forum/excel-questions/606890-reorder-columns-using-macro.html

用这种方法你列进行排序按所需的顺序,并使用FIND,而不是通过每个单元循环:

Private Sub CopyRanges() 

    Dim NewColOrder As Variant 
    Dim x As Long 
    Dim rLastCell As Range 
    Dim rFound As Range 
    Dim FirstFound As String 
    Dim rRng As Range 

    'This is the order you want the columns in. 
    'So the 26th column should be in position 2. 
    'Column 3 is repeated twice: Columns("C:D") = Columns(3) in your code. 
    NewColOrder = Array(1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15, 17, 17, 19, 19, 21, 21, 23, 23, 25, 25, 2) 

    With ThisWorkbook 
     With .Worksheets("Test1") 

      'Create copies of repeated columns. 
      For x = LBound(NewColOrder) + 1 To UBound(NewColOrder) 
       If NewColOrder(x) = NewColOrder(x - 1) Then 
        .Columns(NewColOrder(x)).EntireColumn.Insert Shift:=xlToRight 
        .Columns(NewColOrder(x) - 1).Copy Destination:=.Columns(NewColOrder(x)) 
       End If 
      Next x 

      'Add a new row and put desired column order in row. 
      .Range("A1").EntireRow.Insert 
      .Range("A1").Resize(1, UBound(NewColOrder) + 1) = NewColOrder 

      'Find the last cell containing data. 
      Set rLastCell = .Cells.Find("*", , , , xlByRows, xlPrevious) 

      'Sort the data into the correct column order. 
      .Range(.Cells(1, 1), rLastCell).Sort .Cells(1), 1, Orientation:=xlLeftToRight 

      'Copy the data over to Test1. 
      .Range(.Cells(2, 1), rLastCell).Copy Destination:=ThisWorkbook.Worksheets("Test2").Range("A1") 
     End With 

     'Now to find "Maximum accomodation in room is" 
     With .Worksheets("Test2") 

      'Find the last cell containing data. 
      Set rLastCell = .Cells.Find("*", , , , xlByRows, xlPrevious) 

      With .Range(.Cells(3, 1), rLastCell) 
       Set rFound = .Find("Maximum accomodation in room is", LookIn:=xlValues) 
       If Not rFound Is Nothing Then 
        FirstFound = rFound.Address 
        Do 
         If rRng Is Nothing Then 
          Set rRng = rFound 
         Else 
          Set rRng = Union(rRng, rFound) 
         End If 
         Set rFound = .FindNext(rFound) 
        Loop While rFound.Address <> FirstFound 
       End If 

       'Not quite sure what you're trying to do here. 
       If Not rRng Is Nothing Then 
        rRng.EntireRow.UnMerge 
        rRng.HorizontalAlignment = xlGeneral 
       End If 
      End With 

      .Columns(1).Replace What:=",99", Replacement:="", LookAt:=xlPart 
      .Columns(1).Replace What:=",00", Replacement:="", LookAt:=xlPart 

     End With 
    End With 

End Sub 
+0

不幸的是你的代码创建了dublicates。 Test1包含我的行数据,但没有订单,因此vba会将test1数据重组为test2。我把test1,test2(我的代码)和test2(你的代码)的链接放在下面以阐明: https://www.imageupload.co.uk/image/BjE3 https://www.imageupload.co。 uk/image/BjEL https://www.imageupload.co.uk/image/BjEW – ZRS

+0

我以为这就是你的代码所做的。 'Range(ActiveSheet.Columns(“C:D”),ActiveSheet.Columns(“C:D”)。End(xlDown))。Value = Range(Sheets(“Test1”)。Columns(3),Sheets(“ Test1“)。Columns(3).End(xlDown))。Value'这是否将第3列放在C:D列中? –

+0

我的代码将test1 column3值复制到test2工作表中的C:D(合并)列中。我的第三方机构计划只能通过这种方式读取数据。 Test1是我的合同设计,但我必须在test2中重新排列它以供代理软件阅读 – ZRS

我改变了我的代码第1部分和现在的工作要比以前快多了:

私人小组CopyRanges()

昏暗wsTest2作为工作表,wsTest1作为工作表

昏暗LR只要

集wsTest2 = ActiveWorkbook.Sheets( “Test2的”)

集wsTest1 = ActiveWorkbook.Sheets( “测试1”)

随着应用

.ScreenUpdating = False 

.DisplayAlerts = False 

末随着

wsTest2.Activate

LR = wsTest1.UsedRange.Rows(wsTest1.UsedRange.Rows.Count).Row

wsTest2.Range( “A1:A” & LR)。价值= wsTest1.Range(” B1:B” & LR)。价值

wsTest2.Range( “B1:B” & LR)。价值= wsTest1.Range( “W1:W” & LR)。价值

wsTest2.Range( “C1:D”& lr).Value = wsTest1.Range(“C1:C”& lr)。值

wsTest2.Range( “E1:F” & LR)。价值= wsTest1.Range( “D1:d” & LR)。价值

wsTest2.Range( “G1:H” & LR)。值= wsTest1.Range( “E1:E” & LR)。价值

wsTest2.Range( “I1:J” & LR)。价值= wsTest1.Range( “F1:F” & LR)。值

wsTest2.Range( “K1:L” & LR)。价值= wsTest1.Range( “G1:G” & LR)。价值

wsTest2.Range( “M1:N” & LR) .value的= wsTest1.Range( “H1:H” & LR)。价值

wsTest2.Range( “01:P” & LR)。价值= wsTest1.Range( “I1:I” & LR)。价值

wsTest2.Range(“Q1:R”& lr).Value = wsTest1.Range(“J1:J”& LR)。价值

wsTest2.Range( “S1:T” & LR)。价值= wsTest1.Range( “K1:K” & LR)。价值

wsTest2.Range(“U1:V “& LR)。价值= wsTest1.Range(” L1:L” & LR)。价值

wsTest2.Range( “W1:X” & LR)。价值= wsTest1.Range( “M1:M” & lr).Value

wsTest2.Range(“Y1:Z”& lr).Value = wsTest1.Range(“N1:N”& LR).value的

“等等......

末次