2016-09-02 5 views
2

Я пытаюсь проанализировать скидку, предлагаемую различными компаниями для определенного путешествия на поезде, и соответственно указать название компании и скидку.Передать значения из строки, где выполняются критерии.

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

Dataset with Discounts

То, что я хочу сделать, это существенно транспонировать набор данных и создать следующий вывод, где скидка составляет> 0 и вернуть компанию/имя столбца , (См ниже)

enter image description here

Я попытался использовать формулы ниже:

{=INDEX(A1:F7,SMALL(IF(AND(A2:A7=H2,B2:F2>0),COLUMNS(B1:F1)),COLUMNS(1:1))-1,3)} 

- Это, кажется, всегда дают #NUM! Ошибка

=INDEX(A1:F7, MATCH(H2,A2:A7,0),MATCH(I2,B1:F1,0)) 
  • это работает только, если я перечислил все возможные маршруты и имеют один маршрут для каждой компании, даже если скидка равна 0. Учитывая, что у меня есть 40 компаний и более 15000 маршрутов, я не «действительно хочу создать длинный список LONPAR с каждой компанией в колонке B, за которой следует LONFRA и т. д.

Есть ли что-либо, что мне не хватает или какие-либо рекомендации или функции, которые вы могли бы предложить, чтобы помочь мне получить решение?

ответ

1

Следующий код, по-видимому, довольно эффективно отделяет таблицу скидок на поезд.

Option Explicit 

Sub qwewretq() 
    Dim a As Long, b As Long, h As Long, aDISs As Variant 

    With Worksheets("Sheet10") 
     With .Cells(1, 1).CurrentRegion 
      aDISs = .Cells.Value2 
      h = .Columns.Count + 2 
     End With 
     .Cells(1, h).CurrentRegion.ClearContents 
     .Cells(1, h).Resize(1, 3) = Array("route", "company", "discount") 
     For a = 2 To UBound(aDISs, 1) 
      For b = 2 To UBound(aDISs, 2) 
       If aDISs(a, b) > 0 Then 
        If IsError(Application.Match(aDISs(a, 1), .Columns(h), 0)) Then 
         .Cells(Rows.Count, h + 1).End(xlUp).Offset(1, -1) = aDISs(a, 1) 
        End If 
        .Cells(Rows.Count, h + 1).End(xlUp).Offset(1, 0).Resize(1, 2) = _ 
         Array(aDISs(1, b), aDISs(a, b)) 
       End If 
      Next b 
     Next a 
    End With 
End Sub 

Есть области, которые могут быть переделаны для дополнительной эффективности, в частности параметров среды приложений, таких как .ScreenUpdating property и .EnableEvents property. Для чрезвычайно больших блоков данных, построения целевого массива и сброса разрешенных данных на рабочий лист en masse также может помочь. Вы должны иметь возможность довольно легко форматировать целевую таблицу для процентных значений и любого визуального beutification.

transpose_trains

+0

Спасибо так много, что этот код феноменальный. Просто построив это, если бы я хотел заполнить столбец маршрута сейчас, чтобы удалить пробелы, я бы спустился по столбцу маршрута, если строка не пустая, а затем переходим к следующей строке, если строка пуста , скопируйте значение из строки выше. Является ли это правильной логикой для продолжения? Я не могу найти встроенную функцию (кроме flash-заполнения), чтобы выполнить ее до последней строки. –

+0

См. [Это] (http://stackoverflow.com/questions/31382682/fill-blank-cells-variation/31383101#31383101) для быстрого метода заполнения пробелов. Конечно, вы могли бы просто изменить приведенный выше код, чтобы заполнить их, поскольку исходная таблица построена. – Jeeped

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

  • Нет связанных вопросов^_^