ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > 操作与技巧 > 如何用VBA求出两个区域的差集,交集,并集

如何用VBA求出两个区域的差集,交集,并集

作者:绿色风 分类: 时间:2022-08-18 浏览:212
楼主
芐雨
Q:如何用VBA求出两个区域的差集,交集,并集?
A:
差集:
一般地,记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,我们把集合{x∣x∈A,且x∉B}叫做A与B的差集
交集:
A 和 B 的交集是含有所有既属于 A 又属于 B 的元素,而没有其他元素的集合。
并集:
一般地,对于两个给定的集合A,B,把所有属于集合A或属于集合B的元素所组成的集合(两个集合全部元素加起来的全部元素所组成的集合)叫做并集,记作A∪B。


 


我们可以把集合看成一个区域,区域A,区域B,交集并集可以直接用VBA函数来实现
A与B的交集:Intersect(A, B)
A与B的并集:Union(A, B)

差集可以通过下面代码实现:(不过限于连续的区域)



  1. Sub 两个区域的差集_芐雨()
  2.     Dim A As Range, B As Range, J As Range
  3.     Dim arr As Range, arr1 As Range, arr2 As Range, arr3 As Range, arr4 As Range

  4.     On Error Resume Next
  5.     ActiveSheet.Cells.Clear

  6.     Set A = Application.InputBox(prompt:="选择区域", Type:=8)
  7.     A.Interior.ColorIndex = 44
  8.     Set B = Application.InputBox(prompt:="选择区域", Type:=8)
  9.     B.Interior.ColorIndex = 8

  10.     Set J = Intersect(A, B)        'J为A,B两个区域的交集
  11.     J.Interior.ColorIndex = 3

  12.     If J Is Nothing Then                        'A,B这两个区域不相交,A为差集
  13.         A.Borders.ColorIndex = 1
  14.         MsgBox "有边框的区域是差集"
  15.         Exit Sub
  16.     End If
  17.     If J.Address = A.Address Then             '交集J就是A,那么无差集
  18.         MsgBox "无差集"
  19.         Exit Sub
  20.     End If

  21.     Set l = Union(A, B)         'l为A,B两个区域的并集

  22.     Set arr1 = l(l.Count).Offset(0, 1)          '定义这四个区域,防止下面为nothing时,用union连接出错
  23.     Set arr2 = l(l.Count).Offset(0, 1)
  24.     Set arr3 = l(l.Count).Offset(0, 1)
  25.     Set arr4 = l(l.Count).Offset(0, 1)


  26.     If A(1).Column < J(1).Column Then Set arr1 = Range(A(1), J(1).Offset(0, -1)).EntireColumn  '如果A的首列小于交集J的首列,定义arr1为A首列到J首列前一列的所有列
  27.     If A(1).Row < J(1).Row Then Set arr2 = Range(A(1), J(1).Offset(-1, 0)).EntireRow           '如果A的首行小于交集J的首行,定义arr2为A首行到J首行前一行的所有行
  28.     If A(A.Count).Column > J(J.Count).Column Then Set arr3 = Range(A(A.Count), J(J.Count).Offset(0, 1)).EntireColumn    '如果A的尾列小于交集J的尾列,定义arr1为A尾列到J尾列前一列的所有列
  29.     If A(A.Count).Row > J(J.Count).Row Then Set arr4 = Range(A(A.Count), J(J.Count).Offset(1, 0)).EntireRow     '如果A的尾行小于交集J的尾行,定义arr2为A尾行到J尾行后一行的所有行

  30.     Set arr = Intersect(Union(arr1, arr2, arr3, arr4), A)
  31.     arr.Borders.ColorIndex = 1
  32.     MsgBox "有边框的区域是差集"
  33. End Sub

2楼
海洋之星
这个数学问题我还没有搞清,你VBA就出来了
3楼
芐雨
数学问题不是有解释吗,还有图啊
4楼
hustclm
果然是搞数据分析的,膜拜。
5楼
水星钓鱼
这个可以有,挺牛的。
6楼
wise
xuexue

免责声明

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

评论列表
sitemap