ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 12个数字围成一个圆圈怎么做

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-28 08:17 | 显示全部楼层 |阅读模式
各位老师好,我想把1——12这12个数字围成一个圆圈,就好像钟表一样的,这12 个数字我是用文本框做的,但是怎么把12个数字按照12在圆的正北方,3放在东方,6在下方,9在西方。也就是象钟表那样的,象下面的图那样。手动移动不准确,能否用vba把他们排列成圆的。
麻烦各位老师,谢谢。
数字图.jpg

12个数字文本框围成圆.rar

7.56 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2020-4-28 08:54 | 显示全部楼层
定义好圆心位置以及半径,然后计算一下30度和60度的正弦余弦的距离,不就出来了XY值了吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 09:04 | 显示全部楼层
不好意思,我不会做啊,文本框已经做好了,在文件里,能否根据我的圆的半径,麻烦老师出手,谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 09:05 | 显示全部楼层
microyip 发表于 2020-4-28 08:54
定义好圆心位置以及半径,然后计算一下30度和60度的正弦余弦的距离,不就出来了XY值了吗?

不好意思,我不会做啊,文本框已经做好了,在文件里,能否根据我的圆心位置和半径,麻烦老师出手,谢谢。

TA的精华主题

TA的得分主题

发表于 2020-4-28 11:26 | 显示全部楼层
本帖最后由 microyip 于 2020-4-28 12:49 编辑
  1. Sub 图形排位()
  2.     Dim oCircle As Object, dicNum As Object, oShape As Object
  3.     Dim nR As Double, nPointX As Double, nPointY As Double
  4.     Dim nI As Long, nPai As Double, nX As Double, nY As Double
  5.    
  6.     nPai = Application.WorksheetFunction.Pi
  7.     'Write By:Micro,QQ:79833378
  8.     Set dicNum = CreateObject("Scripting.Dictionary")
  9.     For Each oShape In ActiveSheet.Shapes
  10.         With oShape
  11.             If .Name Like "Text Box*" Then
  12.                 .Delete
  13.             ElseIf .Name Like "文字*" Then
  14.                 Set dicNum(Val(Replace(oShape.Name, "文字", ""))) = oShape
  15.             ElseIf .Name Like "Oval 1" Then
  16.                 nR = .Width / 2
  17.                 nPointX = .Left + nR
  18.                 nPointY = .Top + nR
  19.                 nR = Int(nR) + 30
  20.             End If
  21.         End With
  22.     Next
  23.     dicNum(1).Left = nPointX
  24.     dicNum(1).Top = nPointY
  25.     For nI = 1 To 12
  26.         nX = nPointX + nR * Cos(nPai / 2 - nI * nPai / 6)
  27.         nY = nPointY - nR * Sin(nPai / 2 - nI * nPai / 6)
  28.         With dicNum(nI)
  29.             .Left = nX - .Width / 2
  30.             .Top = nY - .Height / 2
  31.         End With
  32.     Next
  33. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-4-28 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 microyip 于 2020-4-28 11:47 编辑

附上附件以供参考

12个数字文本框围成圆(by.micro).rar

27.33 KB, 下载次数: 26

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 12:11 | 显示全部楼层
microyip 发表于 2020-4-28 11:32
附上附件以供参考

谢谢老师,辛苦了。
我找了论坛,好像有人做了个像的,但是位置顺序有问题。
  1. Private Type vPoint
  2.     X As Single
  3.     Y As Single
  4. End Type

  5. Sub test() '添加文本框
  6.     For i = 1 To 12
  7.         Set shp = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 20, 20, 20, 20)
  8.         With shp
  9.             
  10.         End With
  11.         With shp.TextFrame.Characters
  12.             .Text = i
  13.             .Font.Size = 12
  14.             .Font.FontStyle = "加粗"
  15.         End With
  16.         With shp
  17.             .Left = i * 20
  18.             .Top = 20
  19.             .Line.Visible = msoFalse
  20.             .Name = "文字" & i
  21.         End With
  22.     Next
  23. End Sub

  24. Sub vDrawjx() '围成圆圈
  25.     Dim vArr() As vPoint
  26.     Dim vPI!, vJ!, R!, vLength!
  27.     Dim i&, vNum&
  28.     vLength = 50
  29.     vNum = 12
  30.     ReDim vArr(vNum - 1)
  31.     vJ = 1.74532925199433E-02   '=π/180
  32.     R = vLength / 2 / Sin(180 / vNum * vJ)
  33.     For i = 0 To vNum - 1
  34.         vArr(i).X = R * Cos(i * 360 / vNum * vJ) + 220
  35.         vArr(i).Y = R * Sin(i * 360 / vNum * vJ) + 220
  36.     Next
  37.     For i = 1 To vNum - 1
  38.         ActiveSheet.Shapes("文字" & i).Select
  39.         With Selection.ShapeRange
  40.             .Left = vArr(i).X
  41.             .Top = vArr(i).Y
  42.         End With
  43.     Next
  44.         i = 0: ActiveSheet.Shapes("文字12").Select
  45.         With Selection.ShapeRange
  46.             .Left = vArr(i).X
  47.             .Top = vArr(i).Y
  48.             .Rotation = 90 + i * 360 / vNum
  49.         End With
  50.         'Selection.Unselect
  51. End Sub
复制代码

所以,我正苦恼呢,感谢老师。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 13:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做成完整文件,请老师指正
  1. Sub test()
  2.     '添加文本框
  3.     For i = 1 To 12
  4.         Set shp = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 20, 20, 20, 20)
  5.         With shp
  6.             
  7.         End With
  8.         With shp.TextFrame.Characters
  9.             .Text = i
  10.             .Font.Size = 12
  11.             .Font.FontStyle = "加粗"
  12.         End With
  13.         With shp
  14.             .Left = i * 20
  15.             .Top = 20
  16.             .Line.Visible = msoFalse
  17.             .Name = "文字" & i
  18.         End With
  19.     Next
  20.      '添加圆
  21.     Set shp = ActiveSheet.Shapes.AddShape(msoShapeOval, 210, 100, 147#, 147#)
  22.     With shp
  23.         .Fill.ForeColor.SchemeColor = 10
  24.         .Line.Visible = msoFalse
  25.     End With
  26.     With shp
  27.         .Name = "Oval 1"
  28.     End With
  29. End Sub

  30. Sub 图形排位()
  31.     'Write By:Micro,QQ:79833378
  32.     Dim dicNum As Object, oShape As Object
  33.     Dim nR As Double, nPointX As Double, nPointY As Double
  34.     Dim nI As Long, nPai As Double, nX As Double, nY As Double
  35.    
  36.     nPai = Application.WorksheetFunction.Pi
  37.     Set dicNum = CreateObject("Scripting.Dictionary")
  38.     For Each oShape In ActiveSheet.Shapes
  39.         With oShape
  40.             If .Name Like "Text Box*" Then
  41.                 .Delete
  42.             ElseIf .Name Like "文字*" Then
  43.                 Set dicNum(Val(Replace(oShape.Name, "文字", ""))) = oShape
  44.             ElseIf .Name Like "Oval 1" Then
  45.                 nR = .Width / 2
  46.                 nPointX = .Left + nR
  47.                 nPointY = .Top + nR
  48.                 nR = Int(nR) + 30
  49.             End If
  50.         End With
  51.     Next
  52.     For nI = 1 To 12
  53.         nX = nPointX + nR * Cos(nPai / 2 - nI * nPai / 6)
  54.         nY = nPointY - nR * Sin(nPai / 2 - nI * nPai / 6)
  55.         With dicNum(nI)
  56.             .Left = nX - .Width / 2
  57.             .Top = nY - .Height / 2
  58.         End With
  59.     Next
  60. End Sub
复制代码
附件:

12个数字围圈.rar

10 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2020-4-28 14:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dongdonggege 发表于 2020-4-28 13:07
做成完整文件,请老师指正附件:

既然图形是你自创的,何必直接去定义结果?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-28 14:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
microyip 发表于 2020-4-28 14:11
既然图形是你自创的,何必直接去定义结果?

害怕文件丢失了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 01:46 , Processed in 0.036917 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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