ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何根据求和条件合并单元格

如何根据求和条件合并单元格

作者:绿色风 分类: 时间:2022-08-17 浏览:145
楼主
芐雨
Q:通过B列的数字和值合并A列对应的单元格,并进行编号和分类出颜色
    条件1:        B列按编号求和,[0.9,1]之间合并A列单元格,填充为绿色;(1,1.1]之间合并A列单元格,填充为黄色
    条件2:        同一编号,>1.1时,前面的单元格需合并A列单元格,填充为绿色。如:sum(B1:B2)<0.9 and sum(B1:B3)>1.1,合并A1:A2,填充为绿色
    条件3:        剩余不符合的单元格合并,并填写相应的,如:A2:A4,A26:A28,A61等
        

 



A:代码如下:
  1. Sub 条件求和合并_芐雨()
  2.     Dim d, t, adr()
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     On Error Resume Next
  5.      Application.ScreenUpdating = False
  6.     [A:A].Clear  '清除D列
  7.     Arr = [B1].CurrentRegion
  8.     [A1].Resize(UBound(Arr), 1).Borders.LineStyle = 1    '加上边框
  9.    
  10.     ReDim adr(1 To UBound(Arr), 1 To 1)
  11.     For i = 2 To UBound(Arr)
  12.         If Arr(i, 4) <> Arr(i - 1, 4) Then     '不等于上一个单元格时
  13.             If m <> 0 And Not rng.MergeCells Then      'm不为0,且rng不为合并单元格
  14.                 With Range(Range(adr(m, 1)), Cells(i - 1, 1))
  15.                     .Merge
  16.                     .Value = Range(Range(adr(m, 1)), Cells(i - 1, 1)).Address(0, 0)
  17.                 End With
  18.             End If
  19.             m = m + 1                                   '每次到新的编号时,记录m,初始化n
  20.             n = 1
  21.             adr(m, 1) = Cells(i, 1).Address(0, 0)    ' 记录单元格地址
  22.         End If
  23.         
  24.         Set rng = Range(Range(adr(m, 1)), Cells(i, 1))     '记rng单元格区域
  25.         
  26.         If Not d.exists(Arr(i, 4)) Then
  27.             d(Arr(i, 4)) = Arr(i, 1)            '不存在arr(i,4)时
  28.         Else
  29.             d(Arr(i, 4)) = d(Arr(i, 4)) + Arr(i, 1)    '已存在求和
  30.         End If
  31.         
  32.         If i = UBound(Arr) Then                 '到最后一个时
  33.             k = 0
  34.             rng.Merge                       '合并单元格
  35.             rng.Value = rng.Address(0, 0)   '输出单元格地址
  36.         Else
  37.             k = Arr(i + 1, 1)                'k=下一个数组的值
  38.         End If
  39.         
  40.         If (d(Arr(i, 4)) < 0.9 And d(Arr(i, 4)) + k _
  41.           > 1.1) Or (d(Arr(i, 4)) >= 0.9 And d(Arr(i, 4)) <= 1) Then  '(<0.9且加上k值大于1.1时)或(在[.9,1]内) 偏负
  42.             rng.Merge                     '合并单元格
  43.             rng.Interior.ColorIndex = 4   '显示为绿色
  44.             rng(1) = Arr(i, 4) & Format(n, "00")    '显示编号
  45.             d(Arr(i, 4)) = 0                     '初始化,字典重新计算求和值
  46.             m = m + 1
  47.             n = n + 1
  48.             adr(m, 1) = Cells(i + 1, 1).Address(0, 0)   '记录地址
  49.         End If
  50.         
  51.         If d(Arr(i, 4)) > 1 And d(Arr(i, 4)) <= 1.1 Then    '在(1,1.1]范围内,偏正值
  52.             rng.Merge                   '合并单元格
  53.             rng.Interior.ColorIndex = 6  '显示为黄色
  54.             rng(1) = Arr(i, 4) & Format(n, "00")    '显示编号
  55.             d(Arr(i, 4)) = 0         '初始化,字典重新计算求和值
  56.             m = m + 1
  57.             n = n + 1
  58.             adr(m, 1) = Cells(i + 1, 1).Address(0, 0)   '记录地址
  59.         End If
  60.     Next
  61.    
  62.     [A:A].HorizontalAlignment = xlCenter  '设置格式居中
  63.     [A:A].VerticalAlignment = xlCenter
  64.     Application.ScreenUpdating = True
  65. End Sub





根据求和条件合并单元格.rar
2楼
天南地北
  1. B列求和的标准和值为1,偏差为±0.1,如果满超出这两个条件优先偏负

这句话很费解,应该是优先保证刚好1,但是出现0.99直接跳到1.01的时候选0.99
举例前3个和为0.9,后面20个0.01应该怎么切分?
举例前3个和为0.97,后面1个0.02,再一个0.5应该怎么切分?
3楼
芐雨
呵呵,一开始我也不明白,附件内容没更新,看原文
4楼
rongjun
感谢分享!
5楼
老糊涂
感谢分享!

免责声明

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

评论列表
sitemap