2017-01-26 80 views
-1

所以我有這樣的問題:[VBA] [EXCEL]查找附近小區的所有事件和和值

我已經表指定的數據庫,並在那裏是我需要在我的主表查找記錄(Sheet1中) ,然後接近(向左)單元格號並總結它們然後將它放在我搜索的項目後面的數據庫表中。 (截圖中的參考)這是我的數據庫表的樣子:

Database sheet

這需要循環在數據庫表中的每個記錄下來。

我試圖通過範圍循環,但我決定如何找到值而不知道範圍,因爲它可能在任何地方。你可以看到在屏幕截圖結構

這是表如何主要的樣子:算法的

enter image description here

所以簡短描述:

它需要數量從數據庫表中,找到的所有事件在Main sheet中並將所有數字彙總在一起,然後將它放在我們首先搜索的記錄旁邊的單元格中

任何建議傢伙?

請原諒我的英語它不是我的母語。 :)

+0

當你看它時,你如何識別範圍?你可以在公式或宏中做同樣的事情。 –

+0

告訴我更多。我把公式看作SUMIF和SUMIFS,但是現在它們不能達到我所需要的 –

+0

**當你看它時,你如何識別範圍?** –

回答

0

這是我不清楚你怎麼確定你正在尋找的值。如果它們可能位於MAIN工作表的任何位置,則可以使用簡單的SUMIF

假設您的Range的值「可能」不會大於,例如A1:Z1000。您只需搜索整個範圍,然後返回相鄰列中的匹配數據。所以,如果你search_termA1

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) 
    

一列偏移如果您必須限制僅在具有Detale在行40列尋找那些代碼,然後嘗試以下方法:

此公式必須陣列輸入的

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

陣列輸入公式,進入 式進入細胞或公式欄後,按住 CTRL + SHIFT同時擊中輸入。如果您正確地使用了這個 ,則Excel將放置大括號{...}圍繞公式。

+0

不,我需要搜索的值在數據庫表中,需要搜索和總結的記錄位於主表單中......並且這些記錄可以像整個文檔一樣在此圖片中 http:// prntscr .com/e0lusy –

+0

@CunamiRokas如果你把我在數據庫表上建議的公式,它會在主頁上搜索。只需調整單元格和工作表引用即可。 –

+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