2013-02-27 63 views
2

所以我找到并修改了一个适合我需求的宏,但是有一个限制。我正在构建一个宏查找特定诊断代码和程序代码的医疗支付数据。在我目前正在研究的项目中,只有14个诊断代码,因此我可以直接将其放入VBA中。但是,有超过800个程序代码是我无法装入VBA的。 我能够做一个单独的VBA步骤来引入一个包含这些数据的表格,但是我似乎无法将它设置为在桌子上搜索。但是,话虽如此,运行这种VBA搜索如此多的项目的最佳方式是什么?Excel VBA搜索瓦特/大阵列

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

所以现在你们遇到了什么问题?你的代码是否工作,但比你想要的要慢,或者你得到了哪些特定的错误? – 2013-02-27 00:28:43

+0

你的问题不是数组的大小,800是好的,它是大量的行(55000),你正在执行一次搜索800次。 – Sam 2013-02-27 03:21:02

+0

事实上,它更像是成为问题的结果总量而不是面积。您正在为每个匹配的800个代码格式化每个匹配的代码 - 因此对于每个代码发现10个代码,您将单独格式化8000行。有些行可能会重叠。我会使用a)'Union'并在最后做一种格式b)在你的范围内使用自动过滤器 – brettdj 2013-02-27 03:46:34

回答

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之间(即四个标准匹配单个条件)。稍微适应一下就是将这个代码块称为不同的标准,例如标准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