自我排序表

时间:2016-05-24 18:21:05

标签: excel-formula

情况

我在图表上绘制了6个点,这些点必须按照X坐标的顺序出现。 X坐标中的4个将始终按升序排列。 X坐标中的2个将出现在任何位置,需要按正确顺序放置。

六分

  1. 路的左侧
  2. 左轮在路上
  3. 左支持
  4. 右支持
  5. 右轮
  6. 道路右侧
  7. 计算六点

    配置限制

    • 支持将永远在路上。
    • 目前车轮可能不在路上,跨在支架上,在支架之间,或在支架外侧(两侧支架的同一侧或外侧)。
    • 左轮始终等于或小于右轮坐标。 (设置车轮间距= 0是一个选项)
    • 道路的左侧将始终小于左侧支撑
    • 道路的右侧将始终大于右侧支撑。
    • 始终至少有两个支撑,最小间距大于0

    用户输入

    • 支持间距D2
    • 道路宽度D3
    • Centreline offset D4
    • 左侧延伸D5
    • 右侧延伸D6
    • 轴间距D8
    • 右边距离右边D9

    User inputs

    Support spacing | 2.452 | m
    Road width      | 4.268 | m
    Centre offset   |     0 | m
    Left extension  |     0 | m
    Right extension | 0.305 | m
    
    Axle spacing    |   1.8 | m
    Right edge to   |     2 | m  
    right wheel     |       |
    

    额外的额外信息

    在D14:H15范围内,我有一些计算给出了我用来确定图中Y值的坐标。它们可能使用也可能不使用。行14是各个组件长度的度量,行15是组件右侧的X坐标。列已标记为A到E,表示以下内容:

    • A是从道路左侧到左侧支撑的距离
    • B是支撑之间的距离
    • C是从右支撑到道路右侧的距离
    • D是从道路左侧到左轮的距离
    • E是从道路左侧到右轮的距离

    Extra extra info

       A   |    B   |    C   |    D   |    E
     0.908 |  2.452 |  1.213 |  0.773 |  2.573 
    -1.226 |  1.226 |  2.439 | -1.361 |  0.439
    

    数据表

    目前,我按组件名称组织了表格。下一列X坐标是基于支持为X = 0的中心计算的。下一列确定道路左侧等于零的X坐标。基本上是前一列的偏移量。它是Y值计算所必需的。他们的计算已经足够复杂,没有折腾X协调班次。

    接下来的三列是Y值。前两个Y值使用类似的公式,大约有18个嵌套的IF语句。由于它们与X的计算无关,我会提到它们在那里。我提到它们的长度/复杂性,以防公式需要放在另一个公式中用于排序目的,但我不认为这将是必需的,因为它们的值基于任何X值,对于它们所在的行。< / p>

    enter image description here

                  |        |   X   |   F1  |    F2  | Total F
    Left edge     | -2.134 |     0 |  0.00 |   0.00 |   0.00
    Left support  | -1.226 | 0.908 | 23.65 |   0.00 |  23.63
    Left wheel    | -1.361 | 0.773 |  0.00 |   0.00 |   0.00
    Right support |  1.226 | 3.360 |  0.00 |   0.00 |   0.00
    Right wheel   |  0.439 | 2.573 |  7.58 | -93.52 | -85.94
    Right edge    |  2.439 | 4.573 |  0.00 |   0.00 |   0.00
    

    C18至C23内的公式非常简单,如下:

    =-D3/2-D5+D4
    =-D2/2
    =D3/2+D6+D4-D9-D8
    =D2/2
    =D3/2+D6+D4-D9
    =D3/2+D6+D4
    

    上表最终绘制如下图表:

    enter image description here

    我尝试了什么

    我过去所做的是对车轮坐标进行计算并将其与行进行比较,如果不是,则显示车轮位置,否则显示行位置。对于B18,我会做类似的事情:

    =IF(D3/2+D6+D4-D9-D8<-D3/2-D5+D4,"Left Wheel","Left edge")
    

    由于我有两个轮子,我可以检查B18只是用于轮子,因为它总是在右轮之前。然而对于B19来说,检查变得有点复杂,因为潜在的结果是左边缘,左轮,右轮或梁:

    =IF(D3/2+D6+D4-D9<-D3/2-D5+D4,"Right wheel",IF(D3/2+D6+D4-D9-D8<-D3/2-D5+D4,"Left edge",IF(D3/2+D6+D4-D9-D8<-D2/2,"Left wheel","Left support")))
    

    现在我基本上重复一下,如果语句下去修改了列B的If条件和文本,我会基本上将它复制到C列,并用适当的公式替换文本结果。

    由于我目前只处理6分,所以这是一个可管理但难看的解决方案。

    问题

    我想知道的是,是否有更好的方法来布局数据,以便在不使用内置排序功能或VBA的情况下自行排序。桌子需要看起来像:

    enter image description here

    这将生成如下图:

    enter image description here

    更新

    我只是试着绕着第三排的if语句缠绕我的头,它真的变得丑陋。为了确定每行可能出现的情况,我写出了每种可能的配置,最后配置了15种可能的配置。

    enter image description here

    呃,如果第3行和第6行有不同可能的结果,我现在正在包围我。它比我想象的要便宜一些。

1 个答案:

答案 0 :(得分:0)

因此,在吃了一些午餐,然后尝试开始使用if语句,并且显然基本上遵循了Scott Craner的VBA建议进行分类时,我有一种顿悟。

我的解决方案是基本上创建一个重要坐标表:

enter image description here

然后生成我用于绘图和关联Y值的表格,我将以下内容用于我的X坐标:

=SMALL($C$18:$C$23,ROW()-ROW($C$30))

以升序显示坐标,ROW() - ROW($ C $ 30)作为计数器。

要将相关名称显示为X值,我使用了INDEX / MATCH组合:

=INDEX($B$18:$B$23,MATCH($C31,$C$18:$C$23,0))

我的桌子的其他4列不需要调整。这种方法的优点是,如果有需要,我可以在将来轻松添加支持,而不必乱用一系列IF语句。