2015-05-27 7 views
2

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

Если человек появляется более одного раза в колонке J означает, что человек изменил расположение и значение местоположения находится в колонке L. Для этого у меня есть следующий код:

=IF(J18=J19;IF(COUNTIF(J:J;J18)>1; "From "&L18 &" to "& IF(J18=J19;L19;"");"");"") 

Проблема заключается в том если человек меняет место более двух раз. В столбце O до столбца AA у меня есть месяцы года, определяющие местоположение человека.

Как я могу изменить этот код, чтобы сделать выше:

=IF(J18=J19;IF(COUNTIF(J:J;J18)>1; "From "&L18 &" to "& IF(J18=J19;L19;"");"");"") 

Example

+0

@Byron вот изображение [link] (http://tinypic.com/r/2cyhsm/8) –

+0

Пример и изображение кажутся непоследовательными. – pnuts

ответ

3

Вот User Defined Function (ака UDF) для выполнения этой задачи.

Function my_Travels(nm As Range, loc As Range, cal As Range) 
    Dim n As Long, cnt As Long, v As Long, vLOCs As Variant, vTMPs As Variant 
    Dim iLOC As Long, sTMP As String 

    my_Travels = vbNullString '"no travels" 
    cnt = Application.CountIf(nm.EntireColumn, nm(1)) 

    If Application.CountIf(nm, nm(1)) = cnt And cnt > 1 Then 
     Set loc = loc.Rows(1).Resize(nm.Rows.Count, loc.Columns.Count) 
     Set cal = cal.Rows(1).Resize(nm.Rows.Count, cal.Columns.Count) 

     'seed the array 
     ReDim vLOCs(1 To cnt, 1 To cnt) 
     For v = LBound(vLOCs, 1) To UBound(vLOCs, 1) 
      vLOCs(v, 1) = cal.Columns.Count + 1 
      vLOCs(v, 2) = cal.Columns.Count + 1 
     Next v 

     'collect the values into the array 
     For n = 1 To nm.Rows.Count 
      If nm.Cells(n, 1).Value2 = nm.Cells(1, 1).Value2 Then 
       iLOC = Application.Match(1, Application.Index(cal, n, 0), 0) 
       For v = LBound(vLOCs, 1) To UBound(vLOCs, 1) 
        If vLOCs(v, 1) = cal.Columns.Count + 1 Then 
         vLOCs(v, 1) = iLOC 
         vLOCs(v, 2) = n 
         Exit For 
        End If 
       Next v 
      End If 
     Next n 

     'sort the values in the array 
     For v = LBound(vLOCs, 1) To (UBound(vLOCs, 1) - 1) 
      For n = (v + 1) To UBound(vLOCs, 1) 
       If vLOCs(v, 1) > vLOCs(n, 1) Then 
        vTMPs = Array(vLOCs(v, 1), vLOCs(v, 2)) 
        vLOCs(v, 1) = vLOCs(n, 1) 
        vLOCs(v, 2) = vLOCs(n, 2) 
        vLOCs(n, 1) = vTMPs(0) 
        vLOCs(n, 2) = vTMPs(1) 
        Exit For 
       End If 
      Next n 
     Next v 

     'concatenate the locations from the array 
     For v = LBound(vLOCs) To (UBound(vLOCs) - 1) 
      sTMP = sTMP & "From " & loc.Cells(vLOCs(v, 2), 1) & " to " & loc.Cells(vLOCs(v + 1, 2), 1) & "; " 
     Next v 

     'truncate the string and return it 
     sTMP = Left(sTMP, Len(sTMP) - 2) 
     my_Travels = sTMP 

    End If 

End Function 

В МЕСТОПОЛОЖЕНИЕ и Календарь клетки должны только быть определены в первом ряду. Каждый из них имеет свою высоту (то есть строк) переопределен для поддержания согласованности со списком имен.

Concatenate Locations

В АВ2 (как указано выше) формула,

=my_Travels(J2:J$8, L2, O2:AA2) 

Заполните вниз по мере необходимости.

+0

Уважаемый @ Jeeped, спасибо вам большое! Это отлично работает :) У меня есть два вопроса: 1. Можно ли обойтись без VBA? 2. В ячейках календаря значение может быть от 0,1 до 1, так что можно изменить код на «подсчет» всех ячеек больше 0,1? Еще раз спасибо :) –

+0

1) Возможно, возможно, но расчетная нагрузка будет огромной. Итерирование неизвестного количества строк для конкатенации строки означает, что вы должны «покрыть все возможности». VBA может определять размер своих петель на лету. 2) Это похоже на то, что изменит исходные условия до такой степени, что это уже не правильный ответ. Если это так, то это должен быть другой вопрос. Короче говоря, трудно ударить по движущейся цели. – Jeeped

+0

Хорошо, звучит достаточно справедливо. Еще одно: иногда человек имеет одно и то же место, даже если имя появляется более одного раза. Возможно ли в столбце AB не указывать местоположение, если место одинаково в каждой строке, где отображается имя человека? Спасибо :) –

Смежные вопросы