工作表之间的VBA复杂vlookup可以获得相对单元格的平均值

时间:2014-08-07 10:11:55

标签: excel vba excel-vba vlookup

我有一个包含2个工作表的工作簿。在Sheet1上是ColC中的名称列表,而在C列中的Sheet2上是相同的名称列表,但是与列D中的数据间隔开,每个名称几乎都与标题相关。即

Ben         678

            700

            450

            200

Janet       9

            23

所以我需要一个vlookup函数来查找ColC Sheet1中的名称,然后在ColC Sheet2中找到相应的名称,并在ColD中对该名称的值进行平均值,直到ColC中的值发生变化(以及下一个)名称出现)。每个名称的ColD中的值的数量在1到100之间变化,因此没有设置范围。

(我正在寻找一个解决方案来计算下一个出现之前每个名字的最后6个值的平均值 - 但是我可以尝试在我有一个结构后自己修改它。)

我熟悉VBA,但没有专家,这超出了我的能力 - 我已经尝试了几个小时但没有运气。我也有这个代码做类似的事情(我在论坛上发现它)但只粘贴一个值,我无法修改它以满足我的需要 - 它使用VBA将公式放在特定的单元格中。 (这很没用,但我认为这是一个开始)

Sub MCInternet()
 'CODE OFF WEB FOR RETURNING VALUE IN COL ... AFTER A LOOKUP OF VALUE IN RANGE - DOESNT ADDRESS  RANGE JUST SINGLE CELL

Dim Cll As Range
 Dim lngLastRow As Long
 lngLastRow = Cells(rows.count, "C:C").End(xlUp).Row
    'Sheets("Unpaid List").Range("H2:H" & lngLastRow).ClearContents

For Each Cll In Sheets("Sheet2").Range("C1:C" & Sheets("Sheet2").Range("C1").End(xlDown).Row)
     'Cll.Offset(, 6).Formula = "=Vlookup(" & Cll.Address & ", " & Sheets("Sheet1").Name & "!A:C,1,False)"
     Cll.Offset(, 6).Formula = "=Vlookup(" & Cll.Address & ", " & Sheets(Sheets.count).Name & "!A:C,1,False)"

Next Cll

End Sub

1 个答案:

答案 0 :(得分:0)

我认为在新模块中定义一个公共函数更好:

Public Function FindP(xx As Range) As Long
    Application.Volatile
    Dim FoundIndex
    Dim SumFound, i As Long

    Set FoundIndex = Sheets("Sheet2").Range("C:C").Find(xx.Value)
    If (FoundIndex Is Nothing) = True Then
        FindP = 0
        Exit Function
    Else
        SumFound = 0
        For i = 0 To 100
            If (FoundIndex.Offset(i, 0) = "") Or (FoundIndex.Offset(i, 0) = xx.Value) Then
                SumFound = SumFound + FoundIndex.Offset(i, 1).Value
            Else
                Exit For
            End If
        Next
        FindP = SumFound
    End If
End Function

并在sheet1的每个单元格中:

D1 -> =FindP(C1) 

并自动完成。
函数在sheet2的C列中搜索名称,如果C列中的名称相等(第1行)或空(第2行...... n行),则循环后对每个值求和。