2016-07-22 6 views
0

Я начинаю пользоваться визуальным базовым, и у меня возникла небольшая проблема. То, что я хочу сделать, это взять таблицу Excel и выполнить поиск по определенному столбцу, чтобы найти имя, а затем захватить все в этой строке, чтобы перенести его на другой лист. У меня все работает, за исключением того, что я столкнулся с бесконечным циклом по той причине, которую я не понимаю.Поиск через заполненные ячейки в визуальном базовом

'set up a for loop that increments through all sheets in the workbook 
For i = 1 To ThisWorkbook.Sheets.Count 
'set up a temp page to work with the current page 
    Set tem = ThisWorkbook.Sheets(i) 
    'increment through all the rows that have data in them 
     For Each rng In tem.Rows 
     'if the data matches what was searched for, copy it into another worksheet 
      If tem.Cells(ct, 4) = SForm.Text Then 
       sr.Cells(spot, 1) = tem.Cells(ct, 1) 
       sr.Cells(spot, 2) = tem.Cells(ct, 2) 
       sr.Cells(spot, 3) = tem.Cells(ct, 3) 
       sr.Cells(spot, 4) = tem.Cells(ct, 4) 
       sr.Cells(spot, 5) = tem.Cells(ct, 5) 
       sr.Cells(spot, 6) = tem.Cells(ct, 6) 
       sr.Cells(spot, 7) = tem.Cells(ct, 7) 
       sr.Cells(spot, 8) = tem.Cells(ct, 8) 
       sr.Cells(spot, 9) = tem.Cells(ct, 9) 
       sr.Cells(spot, 10) = tem.Cells(ct, 10) 
       sr.Cells(spot, 11) = tem.Cells(ct, 11) 
       sr.Cells(spot, 12) = tem.Cells(ct, 12) 

       'increment the placeholder for the new sheet 
       spot = spot + 1 
      End If 
      'increase ct to keep track of where in the worksheet it is 
      ct = ct + 1 
     Next rng 
     'reset ct for the next worksheet 
     ct = 1 
Next i 

Конкретная проблема, с которой я сталкиваюсь, является переполнением, поскольку ct является int и maxes out. который говорит мне, что у меня бесконечная петля на руках.

Спасибо за помощь заранее.

+0

Вы повторяете более 1 миллиона раз за лист, это займет некоторое время. Кроме того, вам не нужно 'ct'. вместо этого используйте 'rng.row' на своем месте. –

+0

[ссылка] (http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=112:find-method-in-excel-vba-find-multiple-occurrences-find-method -to-vlookup-find-date & catid = 79 & Itemid = 475) посмотреть на ** Пример - найти несколько вхождений значения в диапазоне. **. Здесь вам будет очень полезно. Кроме того, у вас нет бесконечного цикла. Код написан для проверки ** каждой строки ** на листе, независимо от того, имеются ли там данные. Поэтому, когда строка становится больше, чем ~ 38 562 (не имеют точного количества рук), переменная 'Integer' больше не может ее удерживать. –

ответ

0

Вы повторяете более 1 миллиона раз за лист, это займет некоторое время. Найдите последнюю ячейку в столбце D и пропустите только эти строки.

Плюс вам не нужен ct. вместо этого используйте rng.row на своем месте.

Затем объедините всю привязку значений в одну строку.

For i = 1 To ThisWorkbook.Sheets.Count 
'set up a temp page to work with the current page 
Set tem = ThisWorkbook.Sheets(i) 
'increment through all the rows that have data in them 

    For Each rng In tem.Range("D1", tem.Cells(tem.Rows.Count, 4).End(xlUp)) 
    'if the data matches what was searched for, copy it into another worksheet 
     If rng.Value = SForm.Text Then 
      sr.Range(sr.Cells(spot, 1), sr.Cells(spot, 12)).Value = tem.Range(tem.Cells(rng.Row, 1), tem.Cells(rng.Row, 12)).Value 
      'increment the placeholder for the new sheet 
      spot = spot + 1 
     End If 
    Next rng 
Next i 

Чтобы сделать его еще быстрее заглянуть в сбросив весь диапазон в массив и вывод в другой массив, чтобы свести к минимуму взаимодействие между листами и VBA.

+0

Я снова пробежал программу, используя ваши предложения, и похоже, что у нее есть проблема с копированием данных. Будет ли метод, который вы используете, иметь какие-либо проблемы, если одна из ячеек в любом диапазоне была пуста? и если да, есть ли на это работа? Я получаю ошибку «метод диапазона объектов» _workheet «failed». Я предполагаю, что это означает, что он находит что-то, что он либо не может скопировать, либо не может скопировать в определенное место. – Rejera

+0

@Rejera nope извините, моя ошибка. Я забыл квалифицировать Cells() на соответствующее происхождение. См. Редактирование, вам может потребоваться обновить экран. –

+0

Справа, справа. Я должен был это видеть. Сейчас работает как шарм. Спасибо. – Rejera

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