将符合标准的行中的值转置

我试图分析各个公司为某个火车旅程提供的折扣,并相应地列出公司名称和折扣。

input数据集如下图所示:

数据集与折扣

我想要做的事情基本上是转置数据集,并在折扣大于0时创build以下输出并返回公司/列名称。 (见下文)

在这里输入图像描述

我试图使用下面的公式:

{=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多条路线,我并不想创build一个长列表LONPAR与B列中的每个公司,其次是LONFRA等。

有什么我失踪,或任何指导,或function,你可以提供帮助我得到解决scheme?

下面的代码似乎相当有效地分解你的火车折扣表。

 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属性和.EnableEvents属性这样的应用程序环境设置。 对于非常大的数据块,构build一个目标数组并将parsing的数据全部转储回工作表也可能有所帮助。 你应该能够很容易地为百分比和任何视觉保证格式化目标表。

transpose_trains