使代码更高效或更快捷

时间:2015-01-28 19:53:37

标签: excel vba excel-vba

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

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

VBA代码根据JDW工作表上的输入过滤主表以查找正确的部件号。

然后代码循环,直到找到过滤器未“隐藏”的第一行。这是需要很长时间的一点 - 一个偏移只将它移动到第二行而不是行“x” - 这可能是从第2行到第5000行的任何内容。

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

然后代码将数据的输入形式清除为基本的“重置”。

有什么建议吗?

 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

2 个答案:

答案 0 :(得分:1)

两件事......

首先,有一个范围要做.SpecialCells(xlCellTypeVisible)的方法。您可以遍历此操作并仅使用可见单元格。

其次,摆脱SelectSelection - 这是不好的做法而且很慢。例如,请参考Sheets("JDW").Range("C20")之类的内容,而不是使用复制/粘贴缓冲区,您可以执行Sheets("Stock").Cells(1,2).Value = Sheets("JDW").Range("C20").value之类的操作直接输入值...

答案 1 :(得分:1)

  • 不要一直选择其他范围:您可以在不更改选择的情况下获取值,复制或粘贴。
  • 循环遍历行而不是通过单元格,您是否必须应用EntireRow函数
  • 首先避免使用错误的地址,然后使用.Offset转到右侧
  • 如果您只需要复制值,请不要复制单元格。从源读取值并将其写入目标。

这会将代码缩减为

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

(未经测试,因为我没有上下文)

但实际上你可以用

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