2016-06-15 2 views
0

Я хочу, чтобы данные обрезания из A1: D10000 для определенного ключевого слова. Пример, если есть строка с «Дата выпуска: \ n», она будет вырезана & вставить соответствующую ячейку в столбец F. Я имею в виду, если любая строка имеет с «Дата выпуска: \ п» в С21, то он будет разрезать & пасту F21VBA for cut Данные для определенных ключевых слов

У меня есть код & он работает отлично. Но проблема в том, что для завершения требуется огромное время, чем я ожидал. Любой лучший код, как будто он работает быстро?

Мой код:

Sub Macro87()

For Repeat = 1 To 10000 
Dim found As Range 
Sheets("part15").Select 
Range("A1").Select 
Columns("A:D").EntireColumn.Select 
Set found = Selection.Find(What:="Release Date:\n ", After:=ActiveCell, LookIn:= _ 
    xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext _ 
    , MatchCase:=False, SearchFormat:=False) 

If Not found Is Nothing Then 
found.Select 
ActiveCell.Select 
Selection.Cut 
Range("F" & (ActiveCell.Row)).Select 
ActiveSheet.Paste 
Set found = Nothing 
End If 
Next 

End Sub 
+0

Попытка прекратить использование 'select', вы можете сказать' found.cut', например 'Range ("F" и (ActiveCell.Row)) значение = found.value'. также отключить расчет во время обработки. Также, возможно, используйте функцию сравнения строк, такую ​​как instr, чтобы делать то, что вы хотите. Вы также можете использовать SEARCH & FIND в формуле, поэтому вы можете добавить формулу следующим образом: = IF (ISERR (SEARCH («дата выпуска \ n», I1)), «», I1), а затем выполните поиск в столбце результатов в вашем loop ищет записи не "" –

+0

Я бы подумал, что InStr будет быстрее прокручиваться. [MSDN] (https://msdn.microsoft.com/en-us/library/8460tsh1 (v = vs.90) .aspx) – Liss

ответ

0

Как отметил Дэйв, большая часть вашего замедления будет поступать из повторяющихся операторов выбора в вашем коде. VBA обычно не нужно выбирать диапазон, чтобы работать с данными в нем. Следующее должно ускорить процесс для вас совсем немного. Она работает для меня мгновенно:

Sub Macro87() 
    Set Rng = Range("A1:D10000") 
    For Each cel In Rng 
     If InStr(1, cel.Value, "Release Date:\n ") > 0 Then 
      Cells(cel.Row(), 6) = cel.Value 
      cel.Value = Empty 
     End If 
    Next cel 
End Sub 
+0

Строка может быть найдена в любом месте диапазона A1: D10000. Я имею в виду, что он может быть найден в b12 или c15 или d11. Всегда нужно перейти в колонку F – Hafigur

+0

@Hafigur Yup. Просто видел это. Сделал изменения. Извини за это. –

+0

Другое важное значение, что строка не только «Дата выпуска: \ n» У строки могут быть другие данные с «Дата выпуска: \ n». Я имею в виду «Дата выпуска: \ n» - это ключевое слово в строке. – Hafigur

1

Во-первых, остановка происходит от 1 до 10000 - вам не нужно повторять действия так много, когда вы можете использовать вместо .FindNext. Во-вторых, избегайте, как чума, использования .Select.

Dim ws as Worksheet 
Set ws = ThisWorkbook.Worksheets("part15") 
Dim lastRow 
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row 

Dim found As Range 
With ws.Range("A:D") 
    Set found = .Find(What:="Release Date:\n ", After:=ActiveCell, LookIn:= _ 
    xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext _ 
    , MatchCase:=False, SearchFormat:=False) 

    If Not found Is Nothing Then 
     firstAddress = found.Address 
     Do 
      ws.Range("F" & found.Row).Value = found.Value 
      set found = .FindNext(found) 
     Loop While Not found Is Nothing And found.Address <> firstAddress 
    End If 
End With 

End Sub 
+0

Ошибка времени выполнения 91 для этой строки Loop While Not found Is Nothing and found.Address <> firstAddress – Hafigur

+0

RT91 означает, что переменная объекта не установлена. Вы пропустили оператор 'Set' в строке выше, где была вызвана ошибка? – Dave

+0

Я просто скопирую ваш код – Hafigur

Смежные вопросы