2015-01-28 2 views
0

Привет Я использую различные биты кода, чтобы помочь мне добраться туда, где мне нужно.Сделайте код более эффективным или быстрым

Электронная таблица обновляет количество элемента запаса в основной таблице (лист «Stock») со значением из листа «JDW».

Код VBA фильтрует основную таблицу, чтобы найти правильный номер детали на основе ввода на листе JDW.

Код затем петли, пока не найдет первую строку, которая НЕ «скрыта» фильтром. Это бит, который занимает много времени - смещение переместило его только в строку 2, а не строку «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 
+0

Почему вы используете автофильтр? Есть ли только одна соответствующая запись на листе 'Stock'? – user3561813

+1

Вопросы с рабочим кодом обычно не соответствуют теме и могут быть лучше подходят для CodeReview SE. – Chrismas007

+2

Если этот код работает так, как предполагалось, только очень болезненно медленным способом, действительно, люди, работающие на CodeReview.SE, будут рады помочь вам сделать это лучше, чище и эффективнее :) –

ответ

1

Две вещи ...

Во-первых, существует метод на диапазоне, чтобы сделать .SpecialCells(xlCellTypeVisible). Вы можете пройти через это и работать только с видимыми ячейками.

Во-вторых, избавиться от Select и Selection - это плохая практика и медленная практика. Например, обратитесь к вещам, как Sheets("JDW").Range("C20") и вместо того, чтобы использовать копировать/вставить буфер вы могли бы сделать что-то вроде Sheets("Stock").Cells(1,2).Value = Sheets("JDW").Range("C20").value поставить значение непосредственно ...

+0

Хорошая идея использовать xlCellTypeVisible. Лучше всего использовать его с «Листами» («Фондовая»). Диапазон («$ A $ 2: $ X $ 5000»). SpecialCells (xlCellTypeVisible) .Rows (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) 
... 
Смежные вопросы