Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5193 / 13644 ツリー ←次へ | 前へ→

【52102】Addlineで作った図形の塗りつぶしについて ちゃや 07/10/21(日) 9:35 質問[未読]
【52104】Re:Addlineで作った図形の塗りつぶしについ... ichinose 07/10/21(日) 11:15 発言[未読]
【52105】Re:Addlineで作った図形の塗りつぶしについ... ichinose 07/10/21(日) 11:25 発言[未読]
【52106】Re:Addlineで作った図形の塗りつぶしについ... ちゃや 07/10/21(日) 13:22 質問[未読]
【52111】Re:Addlineで作った図形の塗りつぶしについ... りん 07/10/21(日) 15:16 発言[未読]
【52115】Re:Addlineで作った図形の塗りつぶしについ... ちゃや 07/10/21(日) 20:21 質問[未読]
【52114】Re:Addlineで作った図形の塗りつぶしについ... ichinose 07/10/21(日) 19:50 発言[未読]
【52159】Re:Addlineで作った図形の塗りつぶしについ... ちゃや 07/10/25(木) 18:31 質問[未読]
【52160】Re:Addlineで作った図形の塗りつぶしについ... ichinose 07/10/25(木) 21:19 発言[未読]

【52102】Addlineで作った図形の塗りつぶしについて
質問  ちゃや  - 07/10/21(日) 9:35 -

引用なし
パスワード
   エクセル上に表1と表2があります。表1には三角形の番号とその各三角形の節点1,節点2,節点3が記してあり、表2には、節点番号とその各節点番号のX座標,Y座標が記してあります。
(例1)表1の節点1,節点2,節点3は節点番号のことなので、三角形の番号が1の場合、表2を見ると節点番号が1,7,8のときの各X座標・Y座標は、それぞれ(X座標,Y座標)=(0,0),(0,6),(10,6)となっています。
下記のプログラムではまず表2から、各節点のX座標、Y座標を順次取得していき、MinX,MinY,MaxX,MaxYを求めます。それらから図を描画するときに使うRatio,Base左,Base下を求めます。次に表1と表2から節点1、節点2、節点3の書くX座標、Y座標を取得し(例1のように)Shapes.Addlineを使って、三角形を表1にあるように50個描画していきます。
これで下記のプログラムは終了するのですが、50個描画したうちのいくつかの三角形を青で塗りつぶしたいと考えています。たとえば表1の番号2,3,4の三個の三角形を塗りつぶすなどです。Shapes.Addlineを使った描画ではやはり塗りつぶすことはできないのでしょうか??50個描画したうちのいくつかの三角形を塗りつぶす方法を探しています。よろしくお願いします。

     表1
番号    節点1    節点2    節点3
1    1    7    8
2    1    2    8
3    2    8    9
4    2    3    9
5    3    9    10
6    3    4    10
7    4    10    11
8    4    5    11
9    5    11    12
10    5    6    12
11    7    13    14
12    7    8    14
13    8    14    15
14    8    9    15
15    9    15    16
16    9    10    16
17    10    16    17
18    10    11    17
19    11    17    18
20    11    12    18
21    13    19    20
22    13    14    20
23    14    20    21
24    14    15    21
25    15    21    22
26    15    16    22
27    16    22    23
28    16    17    23
29    17    23    24
30    17    18    24
31    19    25    26
32    19    20    26
33    20    26    27
34    20    21    27
35    21    27    28
36    21    22    28
37    22    28    29
38    22    23    29
39    23    29    30
40    23    24    30
41    25    31    32
42    25    26    32
43    26    32    33
44    26    27    33
45    27    33    34
46    27    28    34
47    28    34    35
48    28    29    35
49    29    35    36
50    29    30    36

    表2
番号    座標X    座標Y
1    0    0
2    10    0
3    20    0
4    30    0
5    40    0
6    50    0
7    0    6
8    10    6
9    20    6
10    30    6
11    40    6
12    50    6
13    0    12
14    10    12
15    20    12
16    30    12
17    40    12
18    50    12
19    0    18
20    10    18
21    20    18
22    30    18
23    40    18
24    50    18
25    0    24
26    10    24
27    20    24
28    30    24
29    40    24
30    50    24
31    0    30
32    10    30
33    20    30
34    30    30
35    40    30
36    50    30


Private Sub CommandButton1_Click()

Dim i As Integer
  Dim 枠左 As Single, 枠上 As Single
  Dim 枠幅 As Single, 枠高 As Single
  Dim 節点の数, 要素の数, 変位倍率, 座標X(), 座標Y()
  Dim 節点1, 節点2, 節点3
  Dim MinX As Single, MinY As Single
  Dim MaxX As Single, MaxY As Single
  Dim Base左 As Single, Base下 As Single, Ratio As Double

  枠左 = Range("f10:l32").Left + 余白
  枠上 = Range("f10:l32").Top + 余白
  枠幅 = Range("f10:l32").Width - 余白 * 2
  枠高 = Range("f10:l32").Height - 余白 * 2

  
    節点の数 = Range("m3")
    Dim 座標Xi, 座標Yi
    For i = 1 To 節点の数
      座標Xi = Range("n5").Offset(i, 0)
      座標Yi = Range("o5").Offset(i, 0)
    Next i
    座標X1 = Range("n6")
    
    座標Y1 = Range("o6").Value
    
    
    MinX = 座標X1
    MinY = 座標Y1
    MaxX = 座標X1
    MaxY = 座標Y1
    For i = 2 To 節点の数
      If MinX > 座標Xi Then MinX = 座標Xi
      If MinY > 座標Yi Then MinY = 座標Yi
      If MaxX < 座標Xi Then MaxX = 座標Xi
      If MaxY < 座標Yi Then MaxY = 座標Yi
    Next i
    If MaxX - MinX > MaxY - MinY Then
      Ratio = 枠幅 / (MaxX - MinX)
      Base左 = 枠左 - MinX * Ratio
      Base下 = 枠上 + 枠高 - MinY * Ratio _
            - (枠高 - (MaxY - MinY) * Ratio) / 2
    Else
      Ratio = 枠高 / (MaxY - MinY)
      Base左 = 枠左 - MinX * Ratio _
            + (枠幅 - (MaxX - MinX) * Ratio) / 2
      Base下 = 枠上 + MaxY * Ratio
    End If
    
        Dim 表1 As Range
  Dim 表2 As Range
  Dim v As Variant

  
  Set 表1 = Range("Q5:T35")
  Set 表2 = Range("M5:O41")
  With 表1
    For i = 2 To .Rows.Count ' 実データである2行目から
     
        v = Application.Match(.Cells(i, 2), 表2.Columns(1), 0)
        vv = Application.Match(.Cells(i, 3), 表2.Columns(1), 0)
        vvv = Application.Match(.Cells(i, 4), 表2.Columns(1), 0)
                    座標X節点1 = 表2.Cells(v, 2)
          座標Y節点1 = 表2.Cells(v, 3)
          座標X節点2 = 表2.Cells(vv, 2)
          座標Y節点2 = 表2.Cells(vv, 3)
          座標X節点3 = 表2.Cells(vvv, 2)
          座標Y節点3 = 表2.Cells(vvv, 3)


        Shapes.AddLine Base左 + 座標X節点1 * Ratio _
              , Base下 - 座標Y節点1 * Ratio _
              , Base左 + 座標X節点2 * Ratio _
              , Base下 - 座標Y節点2 * Ratio
        Shapes.AddLine Base左 + 座標X節点2 * Ratio _
              , Base下 - 座標Y節点2 * Ratio _
              , Base左 + 座標X節点3 * Ratio _
              , Base下 - 座標Y節点3 * Ratio
        Shapes.AddLine Base左 + 座標X節点3 * Ratio _
              , Base下 - 座標Y節点3 * Ratio _
              , Base左 + 座標X節点1 * Ratio _
              , Base下 - 座標Y節点1 * Ratio
      
    Next i
End With
  END SUB

【52104】Re:Addlineで作った図形の塗りつぶしにつ...
発言  ichinose  - 07/10/21(日) 11:15 -

引用なし
パスワード
   おはようございます。

>これで下記のプログラムは終了するのですが、50個描画したうちのいくつかの三角形を青で塗りつぶしたいと考えています。たとえば表1の番号2,3,4の三個の三角形を塗りつぶすなどです。Shapes.Addlineを使った描画ではやはり塗りつぶすことはできないのでしょうか??50個描画したうちのいくつかの三角形を塗りつぶす方法を探しています。よろしくお願いします。
詳細な記述で非常にわかりやすい説明ですね。
(掲載プロシジャーの記述場所「シートモジュール」と余白という変数の値とセルm3の値も例題から、既定してくだされば、個人的には言うことなしです)

Lineのみだと難しいすから、別図形で三角形を作成し、塗りつぶし設定を行うのは
いかがですか?

検討してください。


>Private Sub CommandButton1_Click()
>
> Dim i As Integer
>  Dim 枠左 As Single, 枠上 As Single
>  Dim 枠幅 As Single, 枠高 As Single
>  Dim 節点の数, 要素の数, 変位倍率, 座標X(), 座標Y()
>  Dim 節点1, 節点2, 節点3
>  Dim MinX As Single, MinY As Single
>  Dim MaxX As Single, MaxY As Single
>  Dim Base左 As Single, Base下 As Single, Ratio As Double
>
>  枠左 = Range("f10:l32").Left + 余白
>  枠上 = Range("f10:l32").Top + 余白
>  枠幅 = Range("f10:l32").Width - 余白 * 2
>  枠高 = Range("f10:l32").Height - 余白 * 2
>
>  
>    節点の数 = Range("m3")
>    Dim 座標Xi, 座標Yi
>    For i = 1 To 節点の数
>      座標Xi = Range("n5").Offset(i, 0)
>      座標Yi = Range("o5").Offset(i, 0)
>    Next i
>    座標X1 = Range("n6")
>    
>    座標Y1 = Range("o6").Value
>    
>    
>    MinX = 座標X1
>    MinY = 座標Y1
>    MaxX = 座標X1
>    MaxY = 座標Y1
>    For i = 2 To 節点の数
>      If MinX > 座標Xi Then MinX = 座標Xi
>      If MinY > 座標Yi Then MinY = 座標Yi
>      If MaxX < 座標Xi Then MaxX = 座標Xi
>      If MaxY < 座標Yi Then MaxY = 座標Yi
>    Next i
>    If MaxX - MinX > MaxY - MinY Then
>      Ratio = 枠幅 / (MaxX - MinX)
>      Base左 = 枠左 - MinX * Ratio
>      Base下 = 枠上 + 枠高 - MinY * Ratio _
>            - (枠高 - (MaxY - MinY) * Ratio) / 2
>    Else
>      Ratio = 枠高 / (MaxY - MinY)
>      Base左 = 枠左 - MinX * Ratio _
>            + (枠幅 - (MaxX - MinX) * Ratio) / 2
>      Base下 = 枠上 + MaxY * Ratio
>    End If
>    
>        Dim 表1 As Range
>  Dim 表2 As Range
>  Dim v As Variant
>
>  
>  Set 表1 = Range("Q5:T35")
>  Set 表2 = Range("M5:O41")
>  With 表1
>    For i = 2 To .Rows.Count ' 実データである2行目から
>     
>        v = Application.Match(.Cells(i, 2), 表2.Columns(1), 0)
>        vv = Application.Match(.Cells(i, 3), 表2.Columns(1), 0)
>        vvv = Application.Match(.Cells(i, 4), 表2.Columns(1), 0)
>                    座標X節点1 = 表2.Cells(v, 2)
>          座標Y節点1 = 表2.Cells(v, 3)
>          座標X節点2 = 表2.Cells(vv, 2)
>          座標Y節点2 = 表2.Cells(vv, 3)
>          座標X節点3 = 表2.Cells(vvv, 2)
>          座標Y節点3 = 表2.Cells(vvv, 3)
        If i Mod 2 = 0 Then
          Call mk_triangle(Base左 + 座標X節点1 * Ratio _
                 , Base下 - 座標Y節点1 * Ratio _
                 , Base左 + 座標X節点2 * Ratio _
                 , Base下 - 座標Y節点2 * Ratio _
                 , Base左 + 座標X節点3 * Ratio _
                 , Base下 - 座標Y節点3 * Ratio)
          End If
>        Shapes.AddLine Base左 + 座標X節点1 * Ratio _
>              , Base下 - 座標Y節点1 * Ratio _
>              , Base左 + 座標X節点2 * Ratio _
>              , Base下 - 座標Y節点2 * Ratio
>        Shapes.AddLine Base左 + 座標X節点2 * Ratio _
>              , Base下 - 座標Y節点2 * Ratio _
>              , Base左 + 座標X節点3 * Ratio _
>              , Base下 - 座標Y節点3 * Ratio
>        Shapes.AddLine Base左 + 座標X節点3 * Ratio _
>              , Base下 - 座標Y節点3 * Ratio _
>              , Base左 + 座標X節点1 * Ratio _
>              , Base下 - 座標Y節点1 * Ratio
>      
>    Next i
>End With
>  END SUB
'====================================================================
Function mk_triangle(ByVal x1 As Double, ByVal y1 As Double, _
           ByVal x2 As Double, ByVal y2 As Double, _
           ByVal x3 As Double, ByVal y3 As Double) As Shape
  With Shapes.BuildFreeform(msoEditingAuto, x1, y1)
    .AddNodes msoSegmentLine, msoEditingAuto, x2, y2
    .AddNodes msoSegmentLine, msoEditingAuto, x3, y3
    .AddNodes msoSegmentLine, msoEditingAuto, x1, y1
    Set mk_triangle = .ConvertToShape
    With mk_triangle
      .Fill.Visible = msoTrue
      .Fill.Solid
      .Fill.ForeColor.SchemeColor = 2
      End With
  End With
End Function


上記の例だと、CommandButton1_Click内の 三角形作成ループ内での
iが偶数の場合、赤で塗りつぶしています。

試してみてください。

【52105】Re:Addlineで作った図形の塗りつぶしにつ...
発言  ichinose  - 07/10/21(日) 11:25 -

引用なし
パスワード
   >'====================================================================
>Function mk_triangle(ByVal x1 As Double, ByVal y1 As Double, _
>           ByVal x2 As Double, ByVal y2 As Double, _
>           ByVal x3 As Double, ByVal y3 As Double) As Shape
'作成する三角形の面積が小さい(境界は不明)とエラーになる場合もあります。
'その場合は、拡大して作成し、縮小すると言う手順をとらなければなりませんが。


>  With Shapes.BuildFreeform(msoEditingAuto, x1, y1)
>    .AddNodes msoSegmentLine, msoEditingAuto, x2, y2
>    .AddNodes msoSegmentLine, msoEditingAuto, x3, y3
>    .AddNodes msoSegmentLine, msoEditingAuto, x1, y1
>    Set mk_triangle = .ConvertToShape
>    With mk_triangle
>      .Fill.Visible = msoTrue
>      .Fill.Solid
>      .Fill.ForeColor.SchemeColor = 2
>      End With
>  End With
>End Function

【52106】Re:Addlineで作った図形の塗りつぶしにつ...
質問  ちゃや  - 07/10/21(日) 13:22 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。実行したときにとても感動しました!!

掲載プロシジャーの記述場所「シートモジュール」が知識がなくてよくわからないのですが、プログラムはエクセル上にコマンドボタンを作って、それをダブルクリックして表示されたところにかいています。
余白という変数は、Const 余白=10となっていて、セルm3には36という節点数の値が入ります。

今回のプログラムは要素数(三角形の合計の個数)が50、節点数が36という値でやっているのですが、先ほど教えてくださったプログラムの

 If i Mod 2 = 0 Then

 If i = Range("P6").Offset(P, 0).Value Then

にしたところ(Pの列に塗りつぶしたい三角形の要素番号をならべました)("P6")に書いた値しかぬりつぶしてくれません。
どうしてでしょうか??
塗りつぶしたい要素番号を読み取り、塗りつぶす方法がわかれば教えてください。よろしくお願いします。

【52111】Re:Addlineで作った図形の塗りつぶしにつ...
発言  りん E-MAIL  - 07/10/21(日) 15:16 -

引用なし
パスワード
   ちゃや さん、こんにちわ。

>今回のプログラムは要素数(三角形の合計の個数)が50、節点数が36という値でやっているのですが、先ほど教えてくださったプログラムの
>
> If i Mod 2 = 0 Then
>を
> If i = Range("P6").Offset(P, 0).Value Then
>
>にしたところ(Pの列に塗りつぶしたい三角形の要素番号をならべました)("P6")に書いた値しかぬりつぶしてくれません。

ichinoseさんのコードをそのまま使用しているとすると、
  Pという変数は使われてないので、
 → Pはずっと0
 → If i = Range("P6").Offset(0, 0).Value Then
 → If i = Range("P6").Value Then
なので、P6に書いた値のみの塗りつぶしになります。

【52114】Re:Addlineで作った図形の塗りつぶしにつ...
発言  ichinose  - 07/10/21(日) 19:50 -

引用なし
パスワード
   >今回のプログラムは要素数(三角形の合計の個数)が50、節点数が36という値でやっているのですが、先ほど教えてくださったプログラムの
>
> If i Mod 2 = 0 Then
>を
> If i = Range("P6").Offset(P, 0).Value Then
>
>にしたところ(Pの列に塗りつぶしたい三角形の要素番号をならべました)("P6")に書いた値しかぬりつぶしてくれません。
>どうしてでしょうか??
>塗りつぶしたい要素番号を読み取り、塗りつぶす方法がわかれば教えてください。よろしくお願いします。

理由は、りんさんの記述どおりです。
P列のどこからどこまでにどのように塗りつぶしたい番号が記載されているのですか?
Match関数を使えば可能だと思います。

掲載されたコードでも使われていますよね?

それと掲載されたコードは、ちゃやさんが作成したコードではないのですか?
だとしたら、元コードの理解が必要ですよ!!

【52115】Re:Addlineで作った図形の塗りつぶしにつ...
質問  ちゃや  - 07/10/21(日) 20:21 -

引用なし
パスワード
   ▼りん さん、ichinoseさん
返信ありがとうございます。
If i = Range("P6").Offset(P, 0).Value Then
ではなく
If i = Range("P6").Offset(i, 0).Value Then
というコードの間違いでした。
しかし、これでも塗りつぶしは実行されません。なぜでしょうか??

【52159】Re:Addlineで作った図形の塗りつぶしにつ...
質問  ちゃや  - 07/10/25(木) 18:31 -

引用なし
パスワード
      Set 表3 = Range("p6:p9")  
    For I = 2 To .Rows.Count ' 実データである2行目から
        If Application.Match(I, 表3, 0) Then
          Call mk_triangle(Base左 + 座標X節点1 * Ratio _
                 , Base下 - 座標Y節点1 * Ratio _
                 , Base左 + 座標X節点2 * Ratio _
                 , Base下 - 座標Y節点2 * Ratio _
                 , Base左 + 座標X節点3 * Ratio _
                 , Base下 - 座標Y節点3 * Ratio)
          End If

にしてやってみました。
しかしPの列には2,3,12,13と書いてあるのに、実際には1,2の要素番号の三角形が塗りつぶされます。それから、型が一致しませんとエラーもでます。

どうしたら、Iの番号とPの列にある数値が一致したらというIF文がつくれるでしょうか??何回もすみません。よろしくおねがいします。

【52160】Re:Addlineで作った図形の塗りつぶしにつ...
発言  ichinose  - 07/10/25(木) 21:19 -

引用なし
パスワード
   ▼ちゃや さん:
こんばんは。

>   Set 表3 = Range("p6:p9")  
>    For I = 2 To .Rows.Count ' 実データである2行目から
'まず、Application.Match(I, 表3, 0) この式
' 検索値のIは本当に正しいのか?検討してみてください。
' このままだとP列に1があっても1には、色は付きませんよ!!
        If Not iserror(Application.Match(I, 表3, 0)) Then
'直接原因は、IがP列の要素ではなかった場合にエラーが発生しています。
'エラー値はTrueでもFalseでもないから、型が一致しない となります
'上記のようにしてみてください。
>          Call mk_triangle(Base左 + 座標X節点1 * Ratio _
>                 , Base下 - 座標Y節点1 * Ratio _
>                 , Base左 + 座標X節点2 * Ratio _
>                 , Base下 - 座標Y節点2 * Ratio _
>                 , Base左 + 座標X節点3 * Ratio _
>                 , Base下 - 座標Y節点3 * Ratio)
>          End If
>
>にしてやってみました。
>しかしPの列には2,3,12,13と書いてあるのに、実際には1,2の要素番号の三角形が塗りつぶされます。それから、型が一致しませんとエラーもでます。

あとは、検索値としてIが本当に適当なのか? よく考えてみてください。

5193 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free