2013-02-27 3 views
2

Итак, я нашел и изменил макрос, который соответствует моим потребностям, однако есть одно ограничение. Я создаю макрос для поиска медицинских платежных данных для конкретных кодов диагностики и кодов процедур. В проекте, в котором я сейчас работаю, есть только 14 кодов диагностики, поэтому я смог установить это прямо в VBA. Тем не менее, существует более 800 кодов процедур, которые я не могу вписаться в VBA. Я смог сделать отдельный шаг VBA, чтобы привести таблицу с этими данными, но я не могу настроить ее для поиска по таблице. Но, как говорится, что лучший способ запустить этот поиск VBA для такого большого количества предметов?Excel VBA Search w/Large Array

Sub PROCEDURE_1_search() 
Dim FirstAddress As String 
Dim MySearch As Variant 
Dim myColor As Variant 
Dim Rng As range 
Dim I As Long 

MySearch = Array("412", "4100", "4101", "4102", "4103",...) <-- have over 800 

    With Sheets("All Claims by Date of Service").range("G5:G55000") 
    For I = LBound(MySearch) To UBound(MySearch) 
     Set Rng = .Find(What:=MySearch(I), _ 
         After:=.Cells(.Cells.Count), _ 
         LookIn:=xlValues, _ 
         LookAt:=xlPart, _ 
         SearchOrder:=xlByRows, _ 
         SearchDirection:=xlNext, _ 
         MatchCase:=False) 
     If Not Rng Is Nothing Then 
      FirstAddress = Rng.Address 
      Do 
       With ActiveSheet.range("B" & Rng.Row & ":O" & Rng.Row) 
        .Font.ColorIndex = 1 
        .Interior.ColorIndex = 4 
       End With 
       Set Rng = .FindNext(Rng) 
      Loop While Not Rng Is Nothing And Rng.Address <> FirstAddress 
     End If 
    Next I 
End With 
End Sub 

Возможно, я придумал ответ и не задал правильных вопросов. Пожалуйста, дайте мне знать, если я могу прояснить и заранее поблагодарить вас за любую помощь.

-Ryan

+2

Итак, в чем проблема, с которой вы сталкиваетесь? Работает ли ваш код, но он медленнее, чем вы хотите, или какие конкретные ошибки вы получаете? –

+0

Ваша проблема не в размере массива, 800 в порядке, это огромное количество строк (55000), что вы выполняете один поиск против 800 раз. – Sam

+0

На самом деле это больше похоже на общую сумму результатов, а не на площадь. Вы форматируете каждое соответствие для 800 кодов в каждом отдельном матче - так что, скажем, 10 находок на код, вы произвольно форматируете 8000 строк. И некоторые строки, вероятно, будут перекрываться. Я бы использовал либо a) 'Union', либо сделать один формат в конце b) Использовать автофильтр на вашем диапазоне – brettdj

ответ

2

Для поиска массива, я бы рекомендовал вам сбросить данные в вариантный массив вместо переборе диапазонов. Таким образом, он уменьшает трафик, возвращающийся вперед на код и лист - специально форматирование. Форматирование в любом случае дороговато, в вашем случае вам кажется, что вам нужна луна.

Так вот как это делается по шагам: (а не код - if you need a code take a look at these samples.).

  1. Транспонирование данных в вариант массива
  2. Поиск, как вы хотите в VBA код
  3. Свалка databack в месте (диапазон)
  4. Формат (диапазон)
1

В вашей Например, вы можете использовать AutoFilter, чтобы выделить строки из столбцов B в O, где G падает между 4101-4103 за один снимок (т.е. четыре критерия соответствуют одному условию). Незначительная адаптация заключалась бы в том, чтобы называть этот кодовый блок для разных критериев, таких как standaline 412 и т. Д.

Sub Smaller() 
Dim rng1 As Range 
Set rng1 = Sheets("All Claims by Date of Service").Range("$G$5:$G$55000") 
With rng1 
    .AutoFilter Field:=1, Criteria1:=">=4100", Operator:=xlAnd, Criteria2:="<=4103" 
     .Offset(0, -6).Resize(rng1.Rows.Count, 14).Font.ColorIndex = 1 
     .Offset(0, -6).Resize(rng1.Rows.Count, 14).Interior.ColorIndex = 4 
End With 
Sheets(rng1.Parent.Name).AutoFilterMode = False 
End Sub