|
嗯,按你思路重编了一下。其中把BC列的比对作了个函数。- Dim d
- Sub grf1()
- Cells.Interior.ColorIndex = 0
- [d3:d10000,e13:e1000].ClearContents
- brr = Range("b3:b" & [b65536].End(3).Row)
- crr = Range("c3:d" & [c65536].End(3).Row)
- ReDim drr(1 To UBound(crr), 1 To 1)
- ReDim err(1 To 1000, 1 To 2)
- Set d = CreateObject("scripting.dictionary")
- For i = 1 To UBound(crr) Step 21 '得到各组第一行满足条件的Brr行
- c = crr(i, 1) '本行条件
- For ii = 1 To UBound(brr)
- b = brr(ii, 1)
- If ISOK(b, c) Then drr(i, 1) = drr(i, 1) & "," & ii
- Next
-
- For p = i To i + 20 '下20行,每一行从符合上一行条件的brr中筛选
- If p > UBound(crr) Then Exit For
- If p > i Then
- c = crr(p, 1) '本行条件
- xrr = Split(drr(p - 1, 1), ",") '满足上一行条件的Brr
- For Each x In xrr
- b = brr(Val(x), 1)
- If ISOK(b, c) Then drr(p, 1) = drr(p, 1) & "," & x: q = b: qq = x
- Next
- End If
- drr(p, 1) = Mid(drr(p, 1), 2)
- If Len(drr(p, 1)) > 0 And InStr(drr(p, 1), ",") = 0 Then '满足条件的行数中不含“,”,说明只有一行
- n = n + 1
- err(n, 1) = q '"数据第" & ii & "行:" & brr(xstr, 1)
- err(n, 2) = "条件区间:第" & i & "行至第" & p & "行"
- Cells(qq + 2, 2).Interior.ColorIndex = n Mod 6 + 2
- Range(Cells(i + 2, 3), Cells(p + 2, 3)).Interior.ColorIndex = n Mod 6 + 2
- Exit For
- End If
- Next
- Next
-
- [d3].Resize(UBound(crr)) = drr '第一步:得到drr,为crr中每个条件相符的brr中行号
- If n > 0 Then [e13].Resize(n, 2) = err
- End Sub
- Function ISOK(b, c) As Boolean 'B列某行是否符合C列某行条件
- ' Set d = CreateObject("scripting.dictionary")
- d.RemoveAll
- tj1 = Split(c, "=")(0) 'c列条件
- xmin = Val(Split(tj1, "-")(0))
- xmax = Val(Split(tj1, "-")(1))
- tj2 = Split(c, "=")(1)
- xrr = Split(tj2, " ")
- For Each x In xrr
- d(x) = d(x) + 1
- Next
-
- xrr = Split(b, " ")
- For Each x In xrr
- If d.exists(x) Then s = s + 1
- Next
- If s >= xmin And s <= xmax Then ISOK = True
- End Function
复制代码 |
|