ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何依合格企业个数确认基准分并据以返回信息同时排序?

如何依合格企业个数确认基准分并据以返回信息同时排序?

作者:绿色风 分类: 时间:2022-08-17 浏览:139
楼主
liuguansky
Q:
求助一个算分代码,在此万分感激第一步是:先把不合格的公司删除;再按:如果5个<合格公司<=10个就去掉最高的一个公司,如果10个<合格公司<=20个就去掉最高和最底的一个公司,如果20个<合格公司<=30个就去掉最高和最底的二个公司,如果大于30个公司时去掉最高和最底的3个公司。
第二步是:算这个基准价=(有效平均价+有效最低价)/2;有效平均价是指合格厂家内再去掉的公司剩下的公司总价格再除以剩下的公司总数,有效最低价是指合格厂家内再去掉的公司剩下的最低价格的公司。
第三步是:价格分=100-100*N*abs(基准价-投标价格)/基准价;这里的N是一个系数,当投标价格高于基准价时系数为N=1.5,反之N=0.7,还有里面的ABS是指的绝对值。
第四步就是把合格厂家按价格分降序排列。
A:用如下代码可以实现:

  1. Sub justtest()
  2.     Dim ar1, ar2, i&, d As New Dictionary, Arr, Arrt(), j As Byte, JZJ As Single, ArrTmp, ArrResult()
  3.     '定义变量
  4.     ar1 = Range(Range("b6"), Range("c6").End(4)).Value
  5.     '获取投标信息,赋值给数组
  6.     ar2 = Range(Range("g6"), Range("g6").End(4)).Value
  7.     '获取合格公司
  8.     For i = 1 To UBound(ar2, 1) '合格公司添加入字典KEY
  9.         d(ar2(i, 1)) = 0
  10.     Next i
  11.     For i = 1 To UBound(ar1, 1) '对投标信息匹配合格公司
  12.         If d.Exists(ar1(i, 1)) Then
  13.             d(ar1(i, 1)) = ar1(i, 2)
  14.         End If
  15.     Next i
  16.     With Range("b5").End(4) '清空待处理区域,并生成表头
  17.         .Offset(1, 0).Resize(Rows.Count - .Row, 4).Clear
  18.         .Offset(3, 0).Resize(1, 4) = Array("投标公司", "投标价格", "", "价格分")
  19.     Arr = SortN(d.Items, d.Keys) '对合格信息进行排序,方便后续处理
  20.     Select Case d.Count '对合格个数进行判断,并相应进行数据取舍
  21.         Case Is < 6 '若<6,则退出程序,不进行后续判断,请把下面的代码修改为exit sub
  22.         '<6未进行相应处理
  23.         ReDim Arrt(1 To d.Count, 1 To 2)
  24.         For i = 1 To d.Count
  25.             For j = 1 To 2
  26.                 Arrt(i, j) = Arr(i - 1, j)
  27.         Next j, i
  28.         Case Is < 11
  29.         '去掉最大一个
  30.         ReDim Arrt(1 To d.Count - 1, 1 To 2)
  31.         For i = 1 To d.Count - 1
  32.             For j = 1 To 2
  33.                 Arrt(i, j) = Arr(i - 1, j)
  34.         Next j, i
  35.         Case Is < 21
  36.         '去掉最大小各一个
  37.         ReDim Arrt(1 To d.Count - 2, 1 To 2)
  38.         For i = 2 To d.Count - 1
  39.             For j = 1 To 2
  40.                 Arrt(i - 1, j) = Arr(i - 1, j)
  41.         Next j, i
  42.         Case Is < 31
  43.         '去掉最大小各两个
  44.         ReDim Arrt(1 To d.Count - 4, 1 To 2)
  45.         For i = 3 To d.Count - 2
  46.             For j = 1 To 2
  47.                 Arrt(i - 2, j) = Arr(i - 1, j)
  48.         Next j, i
  49.         Case Else
  50.         '去掉最大小各三个
  51.         ReDim Arrt(1 To d.Count - 6, 1 To 2)
  52.         For i = 4 To d.Count - 3
  53.             For j = 1 To 2
  54.                 Arrt(i - 3, j) = Arr(i - 1, j)
  55.         Next j, i
  56. 100
  57.     End Select
  58.     JZJ = (Arrt(1, 2) + Application.WorksheetFunction.Average(Application.Index(Arrt, 0, 2))) / 2
  59.     '生成基准分
  60.     '价格分=100-100*N*abs(基准价-投标价格)/基准价[N=1.5/0.7]
  61.     '当投标价格高于基准价时系数为N=1.5
  62.     For i = 0 To UBound(Arr, 1) '计算价格分
  63.         If d(Arr(i, 1)) >= JZJ Then
  64.             Arr(i, 2) = VBA.Round(100 - 100 * 1.5 * (d(Arr(i, 1)) - JZJ) / JZJ, 2)
  65.             Else
  66.             Arr(i, 2) = VBA.Round(100 + 100 * 0.7 * (d(Arr(i, 1)) - JZJ) / JZJ, 2)
  67.         End If
  68.     Next i
  69.     ArrTmp = SortN(Application.Transpose(Application.Index(Arr, 0, 2)), _
  70.         Application.Transpose(Application.Index(Arr, 0, 1)), False)
  71.         '排序价格分
  72.     ReDim ArrResult(1 To UBound(ArrTmp, 1), 1 To 4) '定义结果数组
  73.     For i = LBound(ArrTmp, 1) To UBound(ArrTmp, 1) '返回结果数组
  74.         ArrResult(i, 1) = ArrTmp(i, 1)
  75.         ArrResult(i, 2) = d(ArrTmp(i, 1))
  76.         ArrResult(i, 4) = ArrTmp(i, 2)
  77.     Next i
  78.         .Offset(4, 0).Resize(i - 1, 4) = ArrResult '返回结果
  79.     End With
  80.     Set d = Nothing
  81. End Sub
  82. Function SortN(ByRef ar1 As Variant, ByRef ar2 As Variant, Optional t As Boolean = True) As Variant
  83. '数组排序[冒泡排位法]
  84.     Dim i&, j&, k, Arrt()
  85.     ReDim Arrt(LBound(ar1) To UBound(ar1), 1 To 2)
  86.     For i = LBound(ar1) To UBound(ar1) - 1
  87.         For j = i + 1 To UBound(ar1)
  88.             If t Eqv ar1(i) > ar1(j) Then
  89.                 k = ar1(i)
  90.                 ar1(i) = ar1(j)
  91.                 ar1(j) = k
  92.                 k = ar2(i)
  93.                 ar2(i) = ar2(j)
  94.                 ar2(j) = k
  95.             End If
  96.     Next j, i
  97.     For i = LBound(ar1) To UBound(ar1)
  98.         Arrt(i, 1) = ar2(i): Arrt(i, 2) = ar1(i)
  99.     Next i
  100.     SortN = Arrt
  101. End Function



2楼
xyf2210
花花的VBA就是强

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap