Excel 如何摆脱选择、复制和编写更好的代码?

Excel 如何摆脱选择、复制和编写更好的代码?,excel,vba,Excel,Vba,你能解释一下我如何在这段代码中避免使用select和copy吗?我想让它尽可能高效地运行,而无需屏幕更新。我知道我可以设置screenupdating=false,但我更愿意让代码写得更好 Dim i As Integer For i = 4 To 501 Sheets("Repository").Range("B" & i).Copy Sheets("Input").Activate Sheet

你能解释一下我如何在这段代码中避免使用select和copy吗?我想让它尽可能高效地运行,而无需屏幕更新。我知道我可以设置screenupdating=false,但我更愿意让代码写得更好

Dim i As Integer

        For i = 4 To 501

            Sheets("Repository").Range("B" & i).Copy
            Sheets("Input").Activate
            Sheets("Input").Range("M13").Select
            Selection.PasteSpecial Paste:=xlPasteValues

            Sheets("Input").Range("M21").Copy
            Sheets("Repository").Activate
            Sheets("Repository").Range("E" & i).Select
            Selection.PasteSpecial Paste:=xlPasteValues


            Sheets("Input").Range("U12").Copy
            Sheets("Repository").Activate
            Sheets("Repository").Range("C" & i).Select
            Selection.PasteSpecial Paste:=xlPasteValues

            Sheets("Input").Range("V12").Copy
            Sheets("Repository").Activate
            Sheets("Repository").Range("D" & i).Select
            Selection.PasteSpecial Paste:=xlPasteValues

        Next i

非常感谢。

您可以消除许多激活和选择操作。我会这样写:

        Application.ScreenUpdating = False
        For i = 4 To 501

            Sheets("Repository").Range("B" & i).Copy
            Sheets("Input").Range("M13").PasteSpecial Paste:=xlPasteValues

            Sheets("Input").Range("M21").Copy
            Sheets("Repository").Range("E" & i).PasteSpecial Paste:=xlPasteValues


            Sheets("Input").Range("U12").Copy
            Sheets("Repository").Range("C" & i).PasteSpecial Paste:=xlPasteValues

            Sheets("Input").Range("V12").Copy
            Sheets("Repository").Range("D" & i).PasteSpecial Paste:=xlPasteValues

        Next i
        Application.ScreenUpdating = True

我仍然建议将screenupdate设置为false。如果它不需要向用户显示它正在执行的每个操作,那么它将运行得更快

首先,您不需要选择/激活/复制。。。您可以简单地使用变量/不使用变量将值从一个单元格分配到另一个单元格。我会这样做:

Sub test()

Dim i As Long 'Integer has a strict limit
Dim j As Integer
Dim RepositoryWs As Worksheet
Dim InputWs As Worksheet
Dim destinationCell(1 To 4) As Range
Dim sourceCell(1 To 4) As Range

Set RepositoryWs = Worksheets("Repository")
Set InputWs = Worksheets("Input")

'Static ranges
With InputWs

    Set destinationCell(1) = .Range("M13")
    Set sourceCell(2) = .Range("M21")
    Set sourceCell(3) = .Range("U12")
    Set sourceCell(4) = .Range("V12")

End With

For i = 4 To RepositoryWs.Range("B4").End(xlDown).Row 'Not hardcoded -> it works if you'll have more data on Repository sheet

    'Dynamic ranges
    With RepositoryWs

        Set sourceCell(1) = .Range("B" & i)
        Set destinationCell(2) = .Range("E" & i)
        Set destinationCell(3) = .Range("C" & i)
        Set destinationCell(4) = .Range("D" & i)

    End With

    For j = 1 To 4

        destinationCell(j).Value = sourceCell(j).Value

    Next j

Next i

End Sub

如果只将值从一个单元格移动到另一个单元格,则无需复制/粘贴。如果您必须复制大量格式,那么可能需要它。这应该完成同样的事情,在我看来这是最简单的方法-

Dim wsRepository as Worksheet
Set wsRepository = ThisWorkbook.Sheets("Repository")

Dim wsInput as Worksheet
Set wsInput = ThisWorkbook.Sheets("Input")

Dim i As Integer
For i = 4 To 501

    wsInput.Range("M13") = wsRepository.Range("B" & i)

    wsRepository.Range("E" & i) = wsInput.Range("M21")

    wsRepository.Range("C" & i) = wsInput.Range("U12")

    wsRepository.Range("D" & i) = wsInput.Range("V12")

Next i

定义wsRepository集合的好处是什么?您是否加快了计算时间?还是仅仅是良好的实践?为什么我不应该每次在我的代码中定义它?@user1813558这是一个很好的实践,有几个原因-它比较短,看起来更干净,如果你需要更改工作表名称,你只需要在一个地方做,最重要的是它会准确地告诉VBA你要处理哪个工作表。因此,在您的情况下,如果打开了两个工作簿,并且都有工作表名称Respository和Input,并且在代码运行时单击或激活了错误的工作簿,那么它将开始在错误的工作簿上运行代码。尽可能尝试指定excel实例、工作簿和工作表-e700k关于使用.endxldown.row技巧而不是硬编码501行数的提示肯定也是您想知道的-感谢您的接受,看到有人试图在vba中取得进展,这太好了,继续!