怎样使用矩阵数据在工作表中绘制线条?
发布时间:2022-06-30 13:49:56
Q:如下图1所示,左侧是一个4行4列的数值矩阵,要使用VBA根据这些数值绘制右侧的图形。
图1
绘制规则是这样的:找到最小的数值(忽略0),将其与第2小的数值用点划线连接,再将第2小的数值与第3小的数值用点划线连接,依此类推,直到连接到最大的数值。在连接的过程中,遇到0不连接,如果两个要连接的数值之间有其他数,则从这些数值上直接跨过。如图1所示,连接的顺序是1-2-3-4-5-6-7-8-9-10-11-12-13。
A:VBA代码如下:
‘在Excel中使用VBA连接单元格中的整数
‘输入: 根据实际修改rangeIN和rangeOUT变量
‘ rangeIN – 包括数字矩阵的单元格区域
‘ rangeOUT – 输出区域左上角单元格
Sub ConnectNumbers()
Dim rangeINAs Range, rangeOUT As Range
Dim cellPrev As Range
Dim cellNext As Range
Dim cell AsRange
Dim i AsInteger
Dim arrRange() As Variant
Set rangeIN= Range(“B3:E6”)
Set rangeOUT = Range(“H3”)
‘删除工作表中已绘制的形状
DeleteArrows
ReDim arrRange(0)
‘在一维数组中存储单元格区域中所有大于0的整数
For Each cell In rangeIN
Ifcell.Value > 0 And _
IsNumeric(cell.Value) And _
cell.Value = Int(cell.Value) Then
‘仅存储整数
ReDim Preserve arrRange(i)
arrRange(i) = cell.Value
i =i + 1
End If
Next cell
‘排序数组(使用冒泡排序)
Call BubbleSort(arrRange)
‘遍历数组,找到单元格区域相应单元格
For i =LBound(arrRange) To UBound(arrRange) – 1
Set cellPrev = rangeIN.Find(arrRange(i), _
LookIn:=xlValues, LookAt:=xlWhole)
Set cellNext = rangeIN.Find(arrRange(i + 1), _
LookIn:=xlValues, LookAt:=xlWhole)
‘rangeOUT相对于rangeIN合适的偏离来绘制形状
Call DrawArrows(cellPrev.Offset( _
rangeOUT(1, 1).Row – rangeIN(1, 1).Row, _
rangeOUT(1, 1).Column – rangeIN(1, 1).Column), _
cellNext.Offset(rangeOUT(1, 1).Row – rangeIN(1, 1).Row, _
rangeOUT(1, 1).Column – rangeIN(1, 1).Column))
Next i
End Sub
‘冒泡排序法
Sub BubbleSort(MyArray() As Variant)
‘从小到大排序
Dim i As Long, j As Long
Dim Temp As Variant
For i =LBound(MyArray) To UBound(MyArray) – 1
For j =i + 1 To UBound(MyArray)
If MyArray(i) > MyArray(j) Then
Temp = MyArray(j)
MyArray(j) = MyArray(i)
MyArray(i) = Temp
End If
Next j
Next i
End Sub
‘从一个单元格中心绘制到另一个单元格中心的线条
Private Sub DrawArrows(FromRange As Range, ToRange As Range)
Dim dleft1 As Double, dleft2 As Double
Dim dtop1 As Double, dtop2 As Double
Dim dheight1 As Double, dheight2 As Double
Dim dwidth1As Double, dwidth2 As Double
dleft1 =FromRange.Left
dleft2 =ToRange.Left
dtop1 =FromRange.Top
dtop2 =ToRange.Top
dheight1 =FromRange.Height
dheight2 =ToRange.Height
dwidth1 =FromRange.Width
dwidth2 =ToRange.Width
ActiveSheet.Shapes.AddConnector(msoConnectorStraight, _
dleft1+ dwidth1 / 2, dtop1 + dheight1 / 2, _
dleft2+ dwidth2 / 2, dtop2 + dheight2 / 2).Select
‘格式化线条
With Selection.ShapeRange.Line
.BeginArrowheadStyle = msoArrowheadOval
.EndArrowheadStyle = msoArrowheadOval
.DashStyle = msoLineDash
.Weight= 1.75
.ForeColor.RGB = RGB(0, 0, 0)
End With
End Sub
‘删除所有形状
Sub DeleteArrows()
Dim shp AsShape
For Each shp In ActiveSheet.Shapes
If shp.Connector = msoTrue Then
shp.Delete
End If
Next shp
End Sub
代码的图片版如下:


猜你喜欢
- 酷狗音乐是一款非常好用的音乐播放器。有着最全的曲库以及独树一帜的界面风格深受年轻一族的喜爱,特别是其中的节奏闪光功能到哪都能让你变成最靓的仔
- 相信很多用户在重装系统时都会选择U盘,方便快捷,但是也有一些用户不知道怎么操作,最近有用户反映不知道联想电脑怎么装win7系统,针对这一问题
- 有时候,我们写论文并不需要在第1页、或者不需要第1、2页显示页码,往往从第3页开始显示页码。下面让小编为你带来word页码第3页开始的方法。
- 新手如何做ppt详细步骤有哪些,新手就应该先模仿借鉴大神的PPT作品,甚至是其他领域的优秀作品,才是快速提高PPT制作水平的重要方法。但实际
- Photoshop是一款我们常用的图片处理软件,在Mac版的Photoshop中如何制作出在雨天的玻璃上文字的效果呢?下面我们分享在Mac版
- 我们可以在Mac上通过设置来一键打开常用App这样来提高工作效率。下面分享如何在Mac上一键打开常用的应用程序。1.首先点击Dock栏上的启
- Mac安装Win7报错AppleSSD.sys怎么办?如何解决?针对此类问题,本文小编就为大家带来了最简单有效的解决方案,由专人实践过的,有
- 我们在使用安装win10操作系统电脑的时候,在某些使用的过程中可能就会出现win10电脑忽然蓝屏并且显示错误代码stop 0x000007b
- wps使用书签的方法:我们把我们的光标定位到你修改到的位置也就是下一次从这里开始的。 这个时候我们在插入的选项卡里
- js怎么截取字符串?如果需要在js中截取字符串,可以使用String类提供的方法,如subsring、indexOf等等。本文就以这两种函数
- Win7/Win8.1系统中桌面右键"新建文件夹"不见了怎么办呢?没有新建导致我们无法创建文件夹,怎么解决呢?下面脚本之
- 数字风格(小键盘)详细说明(红色字的重要请记住):隐藏、显示、中英切换:/上一页、退格:-下一页、进入选字:+编码: 1 ~ 5选字: 1
- Excel文件打不开,在我的电脑上可以打开,在我同事的电脑上也可以打开,但是在客户的电脑上打不开? 很明显,这个E
- 如果Excel工作表中行比较多,我们可以利用条件格式来每隔多行填充颜色,使表格数据看起来更加醒目。下面以Excel 2007为例,介绍如下:
- Win11系统是当下最为火热的电脑操作系统,很多用户都纷纷升级体验了,但是在后续的使用中,有可能出现安装系统补丁出现BUG,或者遇到系统文件
- VLOOKUP与IFERROR是好搭档问题来源朋友留言:“第一个表有物料代码,没有表面处理,第二个表有物料代码,有表面处理,但物料代码只是第
- 今天是我们学校一位学生,统计班级有多少人报名参加运动会比赛。有的学生报了一个项目,有的报了两个,还有报了三个,这么多学生这么多项目,他数也数
- 本文介绍Microsoft Excel中DEC2HEX函数的语法和用法。函数说明将十进制数转换为十六进制数。如果该函数不可用,并返回错误值
- PPT达人们也在分享不做的PPT模板资源,却只是分享模板而已。本人不才,分享一点自己的思路和方法,从最简单的PPT母版入手教你如何从一本宣传
- 现在不少用户都在使用Win10系统的电脑来玩红警这款游戏,但是很多的用户们发现在玩红警的时候,游戏特别的卡顿,那么这个问题我们应该怎么办呢,