使代码更高效或更快

嗨,我一直在使用各种代码来帮助我到我需要的地方。

电子表格使用“JDW”工作表中的值更新主表(工作表“库存”)中库存项目的数量。

VBA代码根据JDW工作表上的input过滤主表以find正确的零件号。

代码然后循环,直到find不被filter“隐藏”的第一行。 这是需要年龄的位 – 偏移量只将它移动到第2行而不是“x”行 – 这可能是从第2行到第5000行的任何内容。

代码然后偏移到正确的单元格,复制粘贴,然后再次偏移并复制date并将date值粘贴到下一个单元格(将date添加到标题为“上次更新”的列)

代码然后清除数据的inputforms作为一个基本的“重置”。

有什么build议么?

Range("C4").Select Selection.Copy Sheets("Stock").Select ActiveSheet.Range("$A$1:$X$5000").AutoFilter field:=1, Criteria1:=Worksheets("JDW").Range("C4").Value Range("A1").Select ActiveCell.Offset(1, 0).Activate Do Until Selection.EntireRow.Hidden = False If Selection.EntireRow.Hidden = True Then ActiveCell.Offset(1, 0).Activate End If Loop Selection.Offset(0, 16).Select Sheets("JDW").Select Range("C20").Select Selection.Copy Sheets("Stock").Select ActiveSheet.Paste Selection.Offset(0, 2).Select Sheets("JDW").Select Range("A1").Select Selection.Copy Sheets("Stock").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveSheet.Range("$A$1:$X$5000").AutoFilter field:=1 Sheets("JDW").Select Range("C20").Select Selection.ClearContents 

两件事情…

首先,有一个方法可以做.SpecialCells(xlCellTypeVisible) 。 你可以通过这个循环,只使用可见的单元格。

其次,摆脱SelectSelection – 这是不好的做法和缓慢。 例如,请参阅Sheets("JDW").Range("C20") ,而不是使用复制/粘贴缓冲区,您可以使用Sheets("Stock").Cells(1,2).Value = Sheets("JDW").Range("C20").value to put a value in directly …

  • 不要一直select其他范围:您可以获取值,复制或粘贴,而无需更改select。
  • 循环遍历行而不是遍历单元格,您是否不必应用EntireRow函数
  • 避免先取错地址,然后用.Offset去正确的地址
  • 如果你只需要复制一个值,不要复制单元格。 从源读取值并将其写入目标。

这减less了代码

 Sheets("Stock").Range("$A$1:$X$5000").AutoFilter _ field:=1, Criteria1:=Worksheets("JDW").Range("C4").Value Dim StockRow as range Set StockRow = Sheets("Stock").Rows(2) Do Until StockRow.Hidden = False Set StockRow = StockRow.Offset(RowOffset:=1) Loop StockRow.Cells(1,17).Value = Sheets("JDW").Range("C20").Value StockRow.Cells(1,19).Value = Sheets("JDW").Range("A1").Value Sheet("Stock").Range("$A$1:$X$5000").AutoFilter field:=1 Sheets("JDW").Range("C20").ClearContents 

(没有testing,因为我没有上下文)

但实际上你可以做得更好

 Dim StockRow as range, stockKey as variant stockKey = Sheets("JDW").Range("C4").Value Set StockRow = Sheets("Stock").Columns(1).Find(stockKey, LookAt:=xlWhole) ...