【Word VBA】サークル模様描画マクロ▽ソースコード

記事
IT・テクノロジー
HC220914A.png

Option Explicit
Option Base 0
'
Public Sub サークル模様描画マクロ()
    Const CIRCLEFT = 100        '描画開始位置X
    Const CIRCTOPP = 100         '      Y
    Const CIRCCOLS = 8                         '横/描画数
    Const CIRCROWS = 7                        '縦/描画数
    Const CIRCCONT = (CIRCCOLS * CIRCROWS)
    '
    Const CIRCSRAD = 5                         '中心円半径
    Const CIRCCSPC = 3                         '半径刻み幅
    Const CIRCCCNT = 5                         '描画円数
    '
    Const CIRCLNWT = 1.5                     '線の太さ
    '円と円の間隔
    Const CIRCVSPC = (CIRCSRAD * 2  _
                           + CIRCCSPC * (CIRCCCNT))
    Const CIRCHSPC = CIRCVSPC
    '---------------------------------------------------------------------------
    Dim Ip As Integer, Jp As Integer
    Dim intCxp As Integer, intCyp As Integer
    Dim intRad As Integer, lngCol As Long
    Dim intNtb(CIRCCONT - 1, 1) As Integer
    Dim intNTm(1) As Integer
    '
    '*描画順番テーブル設定
    Randomize                        '乱数初期化
    For Ip = LBound(intNtb, 1) To UBound(intNtb, 1)
        '0:順番 1:乱数
        intNtb(Ip, 0) = Ip: intNtb(Ip, 1) = CInt(Rnd * 1000 + 1)
    Next Ip
    '*描画順番テーブル、順番を乱数でシャッフル(乱数順にソート)
    Do
       Jp = 0
       For Ip = LBound(intNtb, 1) + 1 To UBound(intNtb, 1)
           If intNtb(Ip - 1, 1) > intNtb(Ip, 1) Then
              intNTm(0) = intNtb(Ip, 0)    '入れ替え
              intNTm(1) = intNtb(Ip, 1)
              intNtb(Ip, 0) = intNtb(Ip - 1, 0)
              intNtb(Ip, 1) = intNtb(Ip - 1, 1)
              intNtb(Ip - 1, 0) = intNTm(0)
              intNtb(Ip - 1, 1) = intNTm(1): Jp = Jp + 1
           End If
       Next Ip
    Loop While Jp > 0                                '入れ替え無し?
    '
   lngCol = RGB(46, 139, 87) '←線色
   For Ip = LBound(intNtb, 1) To UBound(intNtb, 1)
       '中心位置算出
       intCyp = CIRCTOPP + (intNtb(Ip, 0) \ CIRCCOLS) _
                         * CIRCHSPC
       intCxp = CIRCLEFT + (intNtb(Ip, 0) Mod CIRCCOLS) _
                         * CIRCVSPC _
                         + ((intNtb(Ip, 0) \ CIRCCOLS) Mod 2) _
                         * (CIRCVSPC \ 2)
       '
       For Jp = CIRCCCNT - 1 To 0 Step -1
           '*円を描画
           intRad = CIRCSRAD + CIRCCSPC * Jp
           With ActiveDocument.Shapes.AddShape(msoShapeOval, _
                intCxp - intRad, intCyp - intRad, _
                intRad * 2, intRad * 2)
                .Fill.Visible = msoTrue '←塗りつぶし有無
                .Fill.ForeColor = vbWhite '←塗りつぶし色
                .Line.Visible = msoTrue '←輪郭線有無
                .Line.ForeColor.RGB = lngCol '←輪郭線の色
                .Line.Weight = CIRCLNWT '←輪郭線の太さ
           End With
       Next Jp
   Next Ip
End Sub

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す