[VBA] [Excel]查找附近单元格的所有出现次数和总和值

时间:2017-01-26 12:59:32

标签: excel vba excel-vba

所以我有这个问题:

我有一张名为Database的表格,并且我需要在我的主页(sheet1)中找到记录,然后在附近(向左)单元格编号并将它们总结为全部然后将其放在数据库表格中我搜索。 (截图中的参考)这是我的数据库表格的样子:

Database sheet

这需要循环数据库表中的每条记录。

我试图循环通过范围,但我决定如何在不知道范围的情况下找到值,因为它可能在任何地方。你可以在截图中看到结构

这就是主要工作表的样子:

enter image description here

算法的简短描述:

从数据库工作表中获取数字,在主工作表中查找所有出现的数字,并将该事件的所有数字汇总在一起,然后将其放在我们首先搜索到的记录旁边的单元格中

有什么建议吗?

请原谅我的英语,这不是我的母语。 :)

2 个答案:

答案 0 :(得分:0)

您可以使用以下FindAll函数在主工作表中查找相关值。

从那里使用Range.Offset(0,1).Value来访问值并求它们

Function FindAll(What, _
    Optional SearchWhat As Variant, _
    Optional LookIn, _
    Optional LookAt, _
    Optional SearchOrder, _
    Optional SearchDirection As XlSearchDirection = xlNext, _
    Optional MatchCase As Boolean = False, _
    Optional MatchByte, _
    Optional SearchFormat) As Range

    'LookIn can be xlValues or xlFormulas, _
     LookAt can be xlWhole or xlPart, _
     SearchOrder can be xlByRows or xlByColumns, _
     SearchDirection can be xlNext, xlPrevious, _
     MatchCase, MatchByte, and SearchFormat can be True or False. _
     Before using SearchFormat = True, specify the appropriate settings for the Application.FindFormat _
     object; e.g. Application.FindFormat.NumberFormat = "General;-General;""-"""

    Dim SrcRange As Range
    If IsMissing(SearchWhat) Then
        Set SrcRange = ActiveSheet.UsedRange
    ElseIf TypeOf SearchWhat Is Range Then
        Set SrcRange = IIf(SearchWhat.Cells.Count = 1, SearchWhat.Parent.UsedRange, SearchWhat)
    ElseIf TypeOf SearchWhat Is Worksheet Then
        Set SrcRange = SearchWhat.UsedRange
    Else: SrcRange = ActiveSheet.UsedRange
    End If
    If SrcRange Is Nothing Then Exit Function

    'get the first matching cell in the range first
    With SrcRange.Areas(SrcRange.Areas.Count)
        Dim FirstCell As Range: Set FirstCell = .Cells(.Cells.Count)
    End With

    Dim CurrRange As Range: Set CurrRange = SrcRange.Find(What:=What, After:=FirstCell, LookIn:=LookIn, LookAt:=LookAt, _
        SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat)

    If Not CurrRange Is Nothing Then
        Set FindAll = CurrRange
        Do
            Set CurrRange = SrcRange.Find(What:=What, After:=CurrRange, LookIn:=LookIn, LookAt:=LookAt, _
            SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat)
            If CurrRange Is Nothing Then Exit Do
            If Application.Intersect(FindAll, CurrRange) Is Nothing Then
                Set FindAll = Application.Union(FindAll, CurrRange)
            Else: Exit Do
            End If
        Loop
    End If
End Function

答案 1 :(得分:0)

我不清楚您如何识别您正在寻找的值。如果它们可能位于MAIN表单上的任何位置,那么您可以使用简单的SUMIF

假设值“可能”的范围不大于例如A1:Z1000。您只需搜索整个范围,然后返回相邻列中的匹配数据。因此,如果您的search_term位于A1

B1: =SUMIF(MAIN!$A$1:$Z$1000,A1,MAIN!$B$1:$ZZ$1000)

如果某些列中可能存在令人困惑的条目,则需要更具体地说明如何确定要搜索的列。

编辑在看到您的最新屏幕截图后,我建议使用以下公式之一。

如果列标题没有区别,那么

  • 您的数据库工作表的Detale代码以A1开头并向下延伸
  • 在下面的公式中,将1000更改为包含您可能使用的所有行,即使某些行现在为空。
  • 请注意,sum_range的大小与criteria ranges

    相同,但偏移了一列
    B1: =SUMIF(Presu_planas!$A$40:$Z$1000,A1,Presu_planas!$B$40:$AA$1000)
    

如果您必须限制仅在第40行中包含Detale的列中查找这些代码,请尝试以下操作:

此公式必须数组输入

B1: =SUM((Presu_planas!$A$40:$Z$40="Detale")*(Presu_planas!$A$40:$Z$1000=A1)*IFERROR(--Presu_planas!$B$40:$AA$1000,0))
输入后,

array-enter 一个公式 公式进入单元格或公式栏,按住 ctrl + shift ,同时按输入。如果你这样做了 正确地说,Excel会在公式周围放置大括号 {...}