2017-01-26 3 views
-1

Так у меня есть эта проблема:[VBA] [Excel] Найти все вхождения и значение суммы соседней ячейки

Я лист с именем базы данных и есть записи, которые мне нужно найти в моем главном листе (sheet1) , затем возьмите рядом (слева) номер ячейки и суммируйте их все. Затем отбросьте его в лист базы данных сразу после элемента, который я ищу. (Ссылка на скриншоте) Это, как мой лист базы данных выглядит следующим образом:

Database sheet

Это должно петля для каждой записи в листе базы данных вниз.

Я попытался пройти через диапазон, но я застрял в решении, как найти значения, не зная диапазона, потому что это может быть где угодно. Вы можете увидеть структуру в скриншоте

Это как основной лист выглядит следующим образом:

enter image description here

Так краткое описание алгоритма:

Он принимает номер из листа базы данных, найти все вхождения, что в Основном листе и суммирует все номера вместе с этим событием, затем просто помещает его в ячейку рядом с записью, которую мы искали, в первую очередь

Любые предложения?

прошу простить за мой английский, это не мой родной язык. :)

+0

Как вы определяете диапазон, когда смотрите на него? Вы можете сделать то же самое в своей формуле или макросе. –

+0

Расскажи мне больше. Я искал формулы как SUMIF и SUMIFS, но пока они не могут достичь того, что мне нужно –

+0

** Как вы определяете диапазон, когда смотрите на него? ** –

ответ

0

Это не для меня ясно, как определить ценности, которые вы ищете. Если они могут быть в любом месте на листе MAIN, вы можете использовать простой SUMIF.

Предположим, что ваш диапазон, где значения «возможно» были бы не большими, например, A1: Z1000. Вы просто будете искать весь диапазон и возвращать соответствующие данные в соседнем столбце. Так что, если ваш search_term в A1:

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

Если бы запутанная запись в некоторых из столбцов, вы должны быть более конкретными о том, как определить, какие столбцы для поиска.

EDIT После просмотра последних скриншотов я предлагаю одну из следующих формул.

Если заголовок столбца не имеет никакого значения, и

  • вашей базы данных листа имеет код Detale, начиная с А1 и простирающуюся вниз колонны
  • В формулах ниже изменения 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 
Смежные вопросы