Excel 如何摆脱选择、复制和编写更好的代码?
你能解释一下我如何在这段代码中避免使用select和copy吗?我想让它尽可能高效地运行,而无需屏幕更新。我知道我可以设置screenupdating=false,但我更愿意让代码写得更好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
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中取得进展,这太好了,继续!