ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 15824962903a

[求助] 奖励100元辛苦费,请你做个软件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-23 16:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码供参考,楼主看着办:
  1. Type PostInfo
  2.     TopLeft_RowID As Long '左上角单元格行号
  3.     TopLeft_ColID As Long '左上角单元格列号
  4.     BottomRight_RowID As Long '右下角单元格行号
  5.     BottomRight_ColID As Long '右下角单元格列号
  6.     Offset_Left_Cols As Long '定位区域左边的列数
  7.     Offset_Right_Cols As Long '定位区域右边的列数
  8.     Count_Rows As Long '总行数
  9.     Count_Cols As Long '总列数
  10. End Type

  11. Dim rgStandard As Range '对照区域
  12. Dim rgSource As Range '比对区域
  13. Dim rgResult As Range '结果区域
  14. Dim rgPosition As Range '定位单元格
  15. Dim rgTemp As Range '临时单元格
  16. Dim myRgInfo As PostInfo '对照区域的信息
  17. Dim SourceInfo As PostInfo '比对区域的信息
  18. Dim objDic As Object '字典对象,存储非空单元格信息
  19. Dim blIsSelect As Boolean

  20. Sub myCheck()
  21.     Dim arr As Variant, strTemp As String
  22.     Dim lngRow As Long, lngCol As Long
  23.     Dim lngTemp As Long
  24.     Dim lngIndex_Row As Long
  25.     Dim lngIndex_Col As Long
  26.     Dim myShape As Shape
  27.     '取消原有背景色
  28.     'ActiveSheet.Cells.Interior.ColorIndex = 0
  29.     ' 删除原有圆圈
  30.    ' DelShapes
  31.    
  32.     'Step 1 选择对照区域
  33.     blIsSelect = False
  34.     Do Until blIsSelect = True
  35.         Set rgStandard = GetRange("请选择对照区域", "Step 1 - 对照区域选择")
  36.         If rgStandard Is Nothing Then Exit Sub
  37.         blIsSelect = True
  38.         If rgStandard.Count < 2 Then
  39.             MsgBox "请正确选择对照区域!"
  40.             blIsSelect = False
  41.         End If
  42.     Loop
  43.     '对照区域填色
  44.     'rgStandard.Interior.ColorIndex = 44
  45.    
  46.     myRgInfo.TopLeft_RowID = rgStandard.Row
  47.     myRgInfo.TopLeft_ColID = rgStandard.Column
  48.     myRgInfo.BottomRight_RowID = rgStandard.Row + rgStandard.Rows.Count - 1
  49.     myRgInfo.BottomRight_ColID = rgStandard.Column + rgStandard.Columns.Count - 1
  50.     myRgInfo.Count_Rows = rgStandard.Rows.Count
  51.     myRgInfo.Count_Cols = rgStandard.Columns.Count
  52.    
  53.     'Step 2 选择定位区域
  54.     Set rgTemp = Range(Cells(myRgInfo.BottomRight_RowID + 1, myRgInfo.TopLeft_ColID), Cells(myRgInfo.BottomRight_RowID + 1, myRgInfo.BottomRight_ColID))
  55.     blIsSelect = False
  56.     Do Until blIsSelect = True
  57.         Set rgPosition = GetRange("请选择定位区域", "Step 2 - 定位区域选择")
  58.         If rgPosition Is Nothing Then Exit Sub
  59.         blIsSelect = True
  60.         If rgPosition.Count > 1 Or (rgPosition.Row <> myRgInfo.BottomRight_RowID + 1) Or rgPosition.Column < myRgInfo.TopLeft_ColID Or rgPosition.Column > myRgInfo.BottomRight_ColID Then
  61.             MsgBox "定位区域只能在【" & rgTemp.Address(0, 0) & "】中选择,且只能是【1】个单元格"
  62.             blIsSelect = False
  63.         Else
  64.             If Trim(rgPosition.Value) = "" Then
  65.                 MsgBox "定位区域必须是 非空 单元格!"
  66.                 blIsSelect = False
  67.             End If
  68.         End If
  69.     Loop
  70.    
  71.     '定位区域填色
  72.     'rgPosition.Interior.ColorIndex = 3
  73.    
  74.     myRgInfo.Offset_Left_Cols = rgPosition.Column - myRgInfo.TopLeft_ColID
  75.     myRgInfo.Offset_Right_Cols = myRgInfo.BottomRight_ColID - rgPosition.Column
  76.    
  77.     'Step 3 选择比对区域
  78.     blIsSelect = False
  79.     Do Until blIsSelect = True
  80.         Set rgSource = GetRange("请选择比对区域", "Step 3 - 比对区域选择")
  81.         If rgSource Is Nothing Then Exit Sub
  82.         blIsSelect = True
  83.         If rgSource.Count < 2 Then
  84.             MsgBox "请正确选择比对区域!"
  85.             blIsSelect = False
  86.         End If
  87.     Loop
  88.    
  89.     '比对区域填色
  90.     'rgSource.Interior.ColorIndex = 6
  91.    
  92.     SourceInfo.TopLeft_RowID = rgSource.Row
  93.     SourceInfo.TopLeft_ColID = rgSource.Column
  94.     SourceInfo.BottomRight_RowID = rgSource.Row + rgSource.Rows.Count - 1
  95.     SourceInfo.BottomRight_ColID = rgSource.Column + rgSource.Columns.Count - 1
  96.     SourceInfo.Count_Rows = rgSource.Rows.Count
  97.     SourceInfo.Count_Cols = rgSource.Columns.Count
  98.    
  99.     '结果显示区域
  100.     Set rgResult = Range(Cells(SourceInfo.BottomRight_RowID + 1, SourceInfo.TopLeft_ColID), Cells(SourceInfo.BottomRight_RowID + 1, SourceInfo.BottomRight_ColID))
  101.    
  102.     '结果区域填色
  103.     'rgResult.Interior.ColorIndex = 3
  104.    
  105.     '将对照区域的非空单元格存入字典
  106.     Set objDic = CreateObject("Scripting.Dictionary")
  107.     arr = rgStandard
  108.     For lngRow = LBound(arr) To UBound(arr)
  109.         For lngCol = LBound(arr, 2) To UBound(arr, 2)
  110.             strTemp = arr(lngRow, lngCol)
  111.             If Trim(strTemp) <> "" Then
  112.                 strTemp = lngRow & "," & lngCol
  113.                 objDic(strTemp) = ""
  114.             End If
  115.         Next
  116.     Next
  117.    
  118.     '开始比对
  119.     If myRgInfo.Count_Rows < SourceInfo.Count_Rows Then
  120.         lngIndex_Row = 0
  121.     Else
  122.         lngIndex_Row = myRgInfo.Count_Rows - SourceInfo.Count_Rows
  123.     End If
  124.    
  125.     For Each rgTemp In rgResult
  126.         lngTemp = rgTemp.Column - SourceInfo.TopLeft_ColID
  127.         If lngTemp > myRgInfo.Offset_Left_Cols Then lngTemp = myRgInfo.Offset_Left_Cols
  128.         SourceInfo.Offset_Left_Cols = lngTemp
  129.         
  130.         lngTemp = SourceInfo.BottomRight_ColID - rgTemp.Column
  131.         If lngTemp > myRgInfo.Offset_Right_Cols Then lngTemp = myRgInfo.Offset_Right_Cols
  132.         SourceInfo.Offset_Right_Cols = lngTemp
  133.       
  134.         lngIndex_Col = myRgInfo.Offset_Left_Cols - SourceInfo.Offset_Left_Cols
  135.         
  136.         arr = rgTemp.Offset(SourceInfo.Count_Rows * -1, SourceInfo.Offset_Left_Cols * -1).Resize(myRgInfo.Count_Rows - lngIndex_Row, myRgInfo.Count_Cols - lngIndex_Col)
  137.         lngTemp = 0
  138.         For lngRow = LBound(arr) To UBound(arr)
  139.             For lngCol = LBound(arr, 2) To UBound(arr, 2)
  140.                 strTemp = arr(lngRow, lngCol)
  141.                 If Trim(strTemp) <> "" Then
  142.                     strTemp = lngRow + lngIndex_Row & "," & lngCol + lngIndex_Col
  143.                     If objDic.Exists(strTemp) Then lngTemp = lngTemp + 1
  144.                 End If
  145.             Next
  146.         Next
  147.         If lngTemp >= 2 Then
  148.             rgTemp.Value = lngTemp
  149.             Set myShape = ActiveSheet.Shapes.AddShape(msoShapeOval, rgTemp.Left, rgTemp.Top, rgTemp.Width, rgTemp.Height)
  150.             myShape.Fill.Visible = msoFalse
  151.             myShape.Line.Weight = 2
  152.             myShape.Line.ForeColor.ObjectThemeColor = msoThemeColorAccent4
  153.             Set myShape = Nothing
  154.         End If
  155.     Next
  156.    
  157.     MsgBox "比对OK"
  158. End Sub


  159. Function GetRange(strPrompt As String, Optional strTitle As String = "区域选择") As Range
  160.     On Error Resume Next
  161.     Set GetRange = Application.InputBox(Prompt:=strPrompt, Title:=strTitle, Type:=8)
  162.     On Error GoTo 0
  163. End Function

  164. Function DelShapes()
  165.     Dim sh As Shape
  166.     For Each sh In ActiveSheet.Shapes
  167.         If sh.Type = 1 Then sh.Delete
  168.     Next
  169. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2018-8-23 16:26 | 显示全部楼层
矩形区域 是挺很简单,能直接赋值给二维数组;
提高难度,设想为一个不规则连续的 蛇形区域。

TA的精华主题

TA的得分主题

发表于 2018-8-23 17:32 | 显示全部楼层
大神就是厉害啊,真的是什么都能解决,我有一个比这个简单的题目,如果我也给100元,是否也有人做的出来呢

TA的精华主题

TA的得分主题

发表于 2018-8-24 09:41 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 18:41 , Processed in 0.042343 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表