怎樣使用矩陣數據在工作表中繪制線條?

      網友投稿 681 2025-03-31

      怎樣使用矩陣數據在工作表中繪制線條?

      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

      代碼的圖片版如下:

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel2010中人民幣貨幣符號怎么打?
      下一篇:如何裁剪圖片?(如何裁剪圖片不降低清晰度)
      相關文章
      亚洲a∨无码精品色午夜| 亚洲日本一区二区三区| 精品亚洲成a人在线观看| 亚洲AV无码不卡无码| 亚洲欧美乱色情图片| 亚洲国产日韩一区高清在线| 国产AⅤ无码专区亚洲AV | 亚洲美女aⅴ久久久91| 韩国亚洲伊人久久综合影院| 亚洲欧美日韩国产成人| 亚洲av永久无码精品秋霞电影秋| 亚洲无人区码一二三码区别图片| 亚洲天天做日日做天天欢毛片| 国产成人99久久亚洲综合精品| 中文字幕乱码亚洲无线三区| 中中文字幕亚洲无线码| 亚洲一区二区三区首页| 久久亚洲熟女cc98cm| 亚洲人成无码网站| 国产天堂亚洲国产碰碰| 亚洲午夜一区二区三区| 亚洲福利电影一区二区?| 亚洲制服丝袜一区二区三区| 亚洲av日韩av天堂影片精品| 中文字幕亚洲第一| 国产亚洲一区二区三区在线| 亚洲国产香蕉人人爽成AV片久久 | 亚洲成aⅴ人片在线观| 亚洲AV无码专区电影在线观看| 久久精品国产96精品亚洲 | 西西人体44rt高清亚洲 | 亚洲av手机在线观看| 亚洲色偷精品一区二区三区| 亚洲av最新在线观看网址| 国产偷国产偷亚洲高清在线| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲欧洲日产国码av系列天堂| 亚洲人成国产精品无码| 亚洲成a人在线看天堂无码| 国产成人麻豆亚洲综合无码精品 | 亚洲人成未满十八禁网站|