|
- Public Function YILOUHH(rgSource As Range, Optional varConditions As Variant)
- Application.Volatile True
- Dim strConditions(1 To 3) As String, intStart As Integer, intEnd As Integer
- Dim intIndex As Integer, intCurId As Integer, intType As Integer
- Dim arrSource As Variant, arrResult As Variant
- Dim objFind As Object
-
- Dim lngRow As Long
-
- arrSource = rgSource
- ReDim arrResult(LBound(arrSource) To UBound(arrSource), 1 To 1)
- Set objFind = CreateObject("Scripting.Dictionary")
-
- '''''''''''''''''''''''''''''''''''''''''''''''''''''''
- '条件规整
- If Not IsMissing(varConditions) Then
- '判断条件是否为数组
- If IsArray(varConditions) Then
- Select Case TypeName(varConditions)
- Case "Range"
- intEnd = varConditions.Count
- If intEnd > 3 Then intEnd = 3
- For intIndex = 1 To 3
- strConditions(intIndex) = Trim(varConditions(intIndex).Value)
- Next
- Case "Variant()"
- intStart = LBound(varConditions)
- intEnd = UBound(varConditions)
- If intStart + 2 > intEnd Then intEnd = intStart + 2
- intCurId = 1
- For intIndex = intStart To intEnd
- strConditions(intCurId) = Trim(varConditions(intIndex))
- intCurId = intCurId + 1
- Next
- End Select
- Else
- strConditions(1) = varConditions
- End If
- End If
-
- '判断条件情况
- If strConditions(1) <> "" And strConditions(2) = "" And strConditions(3) = "" Then
- intType = 1 '只有一个条件单元格
- ElseIf strConditions(1) <> "" And strConditions(2) <> "" And strConditions(3) = "" Then
- intType = 2 '前两个单元格有值,或者的关系
- ElseIf strConditions(1) <> "" And strConditions(2) <> "" And strConditions(3) <> "" Then
- intType = 3 '三个单元格都有值,或者的关系
- ElseIf strConditions(1) <> "" And strConditions(2) = "" And strConditions(3) <> "" Then
- intType = 4 '一、三单元格有值,按>=1 且 <=3 规整
- ElseIf strConditions(1) = "" And strConditions(2) = "" And strConditions(3) = "" Then
- intType = 5 '无条件
- End If
-
- ''''''''''''''''''''''''''''''''''''''''''''''''''''''
- '数据规整
- For lngRow = LBound(arrSource) To UBound(arrSource)
- Select Case intType
- Case 1
- If arrSource(lngRow, 1) <> strConditions(1) Then
- arrSource(lngRow, 1) = ""
- End If
- Case 2
- If arrSource(lngRow, 1) = strConditions(1) Or arrSource(lngRow, 1) = strConditions(2) Then
- arrSource(lngRow, 1) = "A"
- Else
- arrSource(lngRow, 1) = ""
- End If
- Case 3
- If arrSource(lngRow, 1) = strConditions(1) Or arrSource(lngRow, 1) = strConditions(2) Or arrSource(lngRow, 1) = strConditions(3) Then
- arrSource(lngRow, 1) = "A"
- Else
- arrSource(lngRow, 1) = ""
- End If
- Case 4
- If arrSource(lngRow, 1) >= Val(strConditions(1)) And arrSource(lngRow, 1) <= Val(strConditions(3)) Then
- arrSource(lngRow, 1) = "A"
- Else
- arrSource(lngRow, 1) = ""
- End If
- End Select
- Next
-
- '''''''''''''''''''''''''''''''''''''''''''''''
- '数据查找计算
-
- For lngRow = LBound(arrSource) To UBound(arrSource)
- arrResult(lngRow, 1) = ""
- If arrSource(lngRow, 1) <> "" Then
- If objFind.Exists(arrSource(lngRow, 1)) = True Then
- arrResult(lngRow, 1) = lngRow - objFind(arrSource(lngRow, 1))
- End If
- objFind(arrSource(lngRow, 1)) = lngRow
- End If
- Next
-
- Set objFind = Nothing
- YILOUHH = arrResult
-
- End Function
复制代码 |
评分
-
1
查看全部评分
-
|