Excel VBA質問箱 IV

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

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


10337 / 13646 ツリー ←次へ | 前へ→

【22204】三角形の頂点の座標は? ponpon 05/2/11(金) 12:46 質問[未読]
【22205】Re:三角形の頂点の座標は? V 05/2/11(金) 13:26 発言[未読]
【22206】Re:三角形の頂点の座標は? bykin 05/2/11(金) 14:31 回答[未読]
【22207】Re:三角形の頂点の座標は? bykin 05/2/11(金) 14:40 発言[未読]
【22213】Re:三角形の頂点の座標は? ponpon 05/2/11(金) 20:05 お礼[未読]
【22248】Re:三角形の頂点の座標は? ponpon 05/2/13(日) 13:01 質問[未読]
【22249】Re:三角形の頂点の座標は? bykin 05/2/13(日) 14:01 回答[未読]
【22250】Re:三角形の頂点の座標は? ponpon 05/2/13(日) 15:19 発言[未読]
【22251】Re:三角形の頂点の座標は? bykin 05/2/13(日) 17:38 回答[未読]
【22252】Re:三角形の頂点の座標は? ponpon 05/2/13(日) 18:28 お礼[未読]
【22253】Re:三角形の頂点の座標は? bykin 05/2/13(日) 18:36 回答[未読]
【22254】Re:三角形の頂点の座標は? ponpon 05/2/13(日) 19:07 お礼[未読]
【22256】Re:三角形の頂点の座標は? bykin 05/2/13(日) 21:52 発言[未読]
【22425】Re:三角形の頂点の座標は? ponpon 05/2/19(土) 10:02 お礼[未読]

【22204】三角形の頂点の座標は?
質問  ponpon  - 05/2/11(金) 12:46 -

引用なし
パスワード
   ponponです。こんにちは。
 三角形の頂点を平行移動して等積変形をビジュアルに行おうと考えています。
 過去ログを調べたのですが、三角形の頂点の座標を取得する方法がわからなかったので、lineで作っていきました。
 しかし、変形最後のラインを取得して実線化、グループ化してforecolorで塗りつぶしを行おうとしましたができません。

 質問1 三角形の頂点の取得ができるのなら、教えてください。
 質問2 line(今やっている方法)で最後とその一つ前に描画したlineのnameの     取得の仕方を教えてください。
 質問3 本当は2本消して2本描画2本消して2本描画というように、頂点が移     動しているように見せたいのですが、できますか?

以下今まで作成したコードです。

Sub 三角形の描画()

  
  With Sheets("sheet1").Shapes
    .AddLine 200, 200, 400, 200
    .AddLine 200, 200, 340, 100
    .AddLine 340, 100, 400, 200
    DoEvents
    Application.Wait (Now + TimeValue("0:00:01"))
    .AddLine(50, 200, 600, 200).Line.DashStyle = msoLineDashDot
    .AddLine(50, 100, 600, 100).Line.DashStyle = msoLineDashDot
  End With
End Sub

Sub 頂点の移動()
  With Sheets("sheet1").Shapes
    For i = 5 To 250 Step 10
    With .AddLine(200, 200, 340 + i, 100).Line
      .DashStyle = msoLineDash
      .ForeColor.RGB = RGB(255 - i, 100, 100)
    End With
    With .AddLine(340 + i, 100, 400, 200).Line
      .DashStyle = msoLineDash
      .ForeColor.RGB = RGB(255 - i, 100, 100)
    End With
    Application.Wait (Now + TimeValue("0:00:01"))
    Next
'  A = Sheets("sheet1").Shapes.Count
'  Sheets("sheet1").Shapes.Range(Array(A - 1, A)).DashStyle = msoLineSolid
   '↑シェイプの数を取得して最後とその一つ前を実線にしようとしましたが、
   'うまくいきませんでした。 
 
  End With
End Sub

Sub 図の削除()

ActiveSheet.Lines.Delete

End Sub

【22205】Re:三角形の頂点の座標は?
発言  V  - 05/2/11(金) 13:26 -

引用なし
パスワード
   三角形の頂点ってなんのことですか
黄色い◇のこといっているのでしょうか?
マクロで記録するとわかりますが・・・

  Selection.ShapeRange.Adjustments.Item(1) = 1# ' 右
  Selection.ShapeRange.Adjustments.Item(1) = 0# ' 左
  Selection.ShapeRange.Adjustments.Item(1) = 0.5 ' 真ん中
  
' 左端
 Cells(1, 1) = Selection.ShapeRange.Left
 Cells(1, 2) = Selection.ShapeRange.Top + Selection.ShapeRange.Height
' 右端
 Cells(2, 1) = Selection.ShapeRange.Left + Selection.ShapeRange.Width
 Cells(2, 2) = Selection.ShapeRange.Top + Selection.ShapeRange.Height
 
 ' 上の座標
 Cells(3, 2) = Selection.ShapeRange.Top
 Cells(3, 1) = Selection.ShapeRange.Left + Selection.ShapeRange.Width _
   * Selection.ShapeRange.Adjustments.Item(1)

【22206】Re:三角形の頂点の座標は?
回答  bykin  - 05/2/11(金) 14:31 -

引用なし
パスワード
   こんにちわ。

きれいなグラフィックやねー
面白そうやったんで、作ってみました。直線やのうてフリーフォーム使ってます。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Triangle As Shape

Sub 三角形の描画()
  With ActiveSheet.Shapes
    .AddLine 200, 200, 400, 200
    With .BuildFreeform(msoEditingAuto, 200, 200)
      .AddNodes msoSegmentLine, msoEditingAuto, 340, 100
      .AddNodes msoSegmentLine, msoEditingAuto, 400, 200
      .AddNodes msoSegmentLine, msoEditingAuto, 200, 200
      Set Triangle = .ConvertToShape
    End With
    With Triangle
      .Fill.Visible = msoFalse
      .Fill.ForeColor.RGB = vbRed
      .Line.DashStyle = msoLineDash
    End With
    DoEvents
    Sleep 1000
    .AddLine(50, 200, 600, 200).Line.DashStyle = msoLineDashDot
    .AddLine(50, 100, 600, 100).Line.DashStyle = msoLineDashDot
  End With
End Sub

Sub 頂点の移動()
  Dim i As Long
  With Triangle
    With .Nodes
    For i = 5 To 250 Step 2
      .SetPosition 2, 340 + i, 100
      DoEvents
      Sleep 100
    Next
    End With
    .Fill.Visible = msoTrue
    .Line.DashStyle = msoLineSolid
  End With
End Sub

Sub 頂点を元に戻す()
  With Triangle
    .Nodes.SetPosition 2, 340, 100
    .Fill.Visible = msoFalse
    .Line.DashStyle = msoLineDash
  End With
  DoEvents
End Sub

Sub 図の削除()
  On Error Resume Next
  ActiveSheet.Lines.Delete
  Triangle.Delete
  Set Triangle = Nothing
End Sub

APIのSleep使って、動きを滑らかにしてます。
三角形の状態を元に戻すコードも追加しました。

試してみてな。
ほな。

【22207】Re:三角形の頂点の座標は?
発言  bykin  - 05/2/11(金) 14:40 -

引用なし
パスワード
   ちょっと1行追加(^^;;

Sub 三角形の描画()
  With ActiveSheet.Shapes

   ↓

Sub 三角形の描画()
  図の削除
  With ActiveSheet.Shapes

すんまへーん。
ほな。

【22213】Re:三角形の頂点の座標は?
お礼  ponpon  - 05/2/11(金) 20:05 -

引用なし
パスワード
   ▼bykin さん:
ponponです。こんばんは。bykin さんは、あちこちの掲示板で回答していらっしゃいますね。いつもすごいなと思っています。
とりあえず動かしてみました。思っていたとおりです。
コードの解析はまだです。また、わからなくなったら質問します。ありがとうございました。まずは、お礼です。

【22248】Re:三角形の頂点の座標は?
質問  ponpon  - 05/2/13(日) 13:01 -

引用なし
パスワード
   bykinさん:
 ponponです。こんにちは。
 
 コードの解析終わりました。
 フリーフォームで作るのがポイントですね。
 オートシェイプの三角形でもやってみましたが、
頂点は底辺の範囲を超えませんでした。
 ついでに、平行四辺形でもやってみましたが、思い通りに作ることができました。
 ありがとうございました。
 すみませんが、ついでにもう一つ質問を。
 頂点の移動の際に任意の場所で止めたり、再開したりしたいのですが、
できますでしょうか?
 任意の場所で止めるのは、
 applicatinon.waitでできたのですが、再開の方法がわかりません。

 よろしくお願いします。

【22249】Re:三角形の頂点の座標は?
回答  bykin  - 05/2/13(日) 14:01 -

引用なし
パスワード
   こんにちわ。

>頂点の移動の際に任意の場所で止めたり、再開したりしたい

Waitでは特定のプロシージャ内で実行が一時停止されるだけです。
任意に停止/再開を繰り替えすんやったら、一旦プロシージャを抜けるようにして、
フラグで判定すればええんとちゃいまっか?

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Triangle As Shape
Private CurrentPos As Single
Private Flg As Boolean

Sub 三角形の描画()
  If Not Flg Then
    図の削除
    With ActiveSheet.Shapes
      With .BuildFreeform(msoEditingAuto, 200, 200)
        .AddNodes msoSegmentLine, msoEditingAuto, 340, 100
        .AddNodes msoSegmentLine, msoEditingAuto, 400, 200
        .AddNodes msoSegmentLine, msoEditingAuto, 200, 200
        Set Triangle = .ConvertToShape
      End With
      With Triangle
        .Fill.Visible = msoFalse
        .Fill.ForeColor.RGB = vbRed
        .Line.DashStyle = msoLineDash
      End With
      DoEvents
      Sleep 1000
      .AddLine(50, 200, 600, 200).Line.DashStyle = msoLineDashDot
      .AddLine(50, 100, 600, 100).Line.DashStyle = msoLineDashDot
      .AddLine 200, 200, 400, 200
    End With
    CurrentPos = 0
  End If
End Sub

Sub 移動開始()
  If Not Flg Then
    Flg = True
    CurrentPos = 頂点の移動(CurrentPos)
  End If
End Sub

Function 頂点の移動(ByVal Counter As Long) As Long
  Dim i As Long
  
  With Triangle
    With .Nodes
      For i = Counter To 250 Step 2
        If Flg Then
          If Counter = 250 Then Flg = False
          .SetPosition 2, 340 + i, 100
          DoEvents
          Sleep 100
        Else
          頂点の移動 = i
          Exit Function
        End If
      Next
    End With
    .Fill.Visible = msoTrue
    .Line.DashStyle = msoLineSolid
  End With
  Flg = False
  頂点の移動 = 0
End Function

Sub 頂点を元に戻す()
  If Not Flg Then
    With Triangle
      .Nodes.SetPosition 2, 340, 100
      .Fill.Visible = msoFalse
      .Line.DashStyle = msoLineDash
    End With
    CurrentPos = 0
    DoEvents
  End If
End Sub

Sub 図の削除()
  On Error Resume Next
  If Not Flg Then
    ActiveSheet.Lines.Delete
    Triangle.Delete
    Set Triangle = Nothing
    CurrentPos = 0
    Flg = False
  End If
End Sub

Sub 一時停止()
  If Flg Then Flg = False
End Sub

「移動開始」で変形を開始して、「一時停止」でストップ。
再開はもう一度「移動開始」です。

試してみてな。
ほな。

【22250】Re:三角形の頂点の座標は?
発言  ponpon  - 05/2/13(日) 15:19 -

引用なし
パスワード
   ▼bykin さん:

>任意に停止/再開を繰り替えすんやったら、一旦プロシージャを抜けるようにして、
>フラグで判定すればええんとちゃいまっか?

ponponです。早速の回答ありがとうございます。
試してみました。ばっちりです。しかし、・・・
   CurrentPos
  Flg
 の使い方がいまいちよくわかりません。
 Flgの方は時々コードに出てくるので、何となく判定に使っていることはわかります。
 この場合でいうと、一時停止の時にFlgをfalseにして、一旦プロシージャを抜ける。ということなんでしょうが。
  >Sub 一時停止()
  >  If Flg Then Flg = False
  >End Sub

 Sub 移動開始()やfunctionを実行しているときに、FlgがFalseになることで
 一旦プロシージャを抜けるというのが、理解できません。すみません。

 CurrentPos(カレントポジション?)というのは、stopしたところの頂点340+iの値だと思うのですが、
>Sub 移動開始()
>  If Not Flg Then
>    Flg = True

    CurrentPos = 頂点の移動(CurrentPos)
    ↑この意味がわかりません。
>  End If
>End Sub

 また、Function 頂点の移動は、Flgがtrueの時は、頂点を動かし、Flgがfalseの時は、頂点のiの値を返す関数だと思うのですが、
         CurrentPos = 頂点の移動(CurrentPos)で移動が再開されるのかが、どうしてもわかりません。
 コードに書かれていることは、何となくわかるのですが、意味が理解できません。
 もし、時間があるのでしたら、考え方を教えていただけないでしょうか?
 こういった手法は、本にはあまり書かれていません。本を頼りに今まで下手なコードですましてきていますので、脱初心者へのステップにしたいと考えています。よろしくお願いします。
>Function 頂点の移動(ByVal Counter As Long) As Long
>  Dim i As Long
>  
>  With Triangle
>    With .Nodes
>      For i = Counter To 250 Step 2
>        If Flg Then
>          If Counter = 250 Then Flg = False
>          .SetPosition 2, 340 + i, 100
>          DoEvents
>          Sleep 100
>        Else
>          頂点の移動 = i
>          Exit Function
>        End If
>      Next
>    End With
>    .Fill.Visible = msoTrue
>    .Line.DashStyle = msoLineSolid
>  End With
>  Flg = False
>  頂点の移動 = 0
>End Function

【22251】Re:三角形の頂点の座標は?
回答  bykin  - 05/2/13(日) 17:38 -

引用なし
パスワード
   こんにちわ。

>Sub 移動開始()やfunctionを実行しているときに、FlgがFalseになることで
>一旦プロシージャを抜けるというのが、理解できません。

まず、このフラグがTrueになってるのはどういう状態のときか・・・ってことを
考えればええんです。
提示したコードの中で Flg = True が書いてあるのは1箇所だけ。
Sub 移動開始()の部分ですわな。
Flg = True にしてから「頂点の移動」っていうFunctionを実行してます。
この頂点の移動が中断されることなく終了したら、Functionの最後で
Flg = False で元に戻してます。
つまり、頂点を移動させる処理のあいだだけフラグが立つわけです。
これが基本やね。

前もって「三角形の描画」で、CurrentPosを0に設定してるから、最初に
「移動開始」を実行するときは
CurrentPos = 頂点の移動(CurrentPos) → CurrentPos = 頂点の移動(0)
ということになります。
このまま中断がなければ、CurrentPosは使わずにそのままコードは終了しますわなー
使う必要がないからです。

・・・で、中断する場合は別のマクロ(一時停止)がループに割り込んで、
Flg = False に設定してしまうので、ループ内の次の判定では
中断したループの回目を戻り値に設定して、Functionは終了します。
この戻り値がCurrentPosに代入されるんです。
再開用のデータを記憶させてるわけです。
再開するときはこのデータを「頂点の移動」に渡すことになるんやね。
CurrentPos = 頂点の移動(CurrentPos) → CurrentPos = 頂点の移動(ループ再開用カウンタの値)
ってことです。
こうすると、再開時の頂点位置を正しく設定したうえで、
まだ済んでいないループの回数分だけ頂点が移動することになります。

以上のような理由から、「頂点を元に戻す」ではCurrentPosを最初の状態の0に戻してます。

また、各プロシージャの先頭にフラグの判定が入ってるんは、
実行したらあかん状態のときに実行させないためです。
頂点の移動中に図の削除なんかを実行したらマズいでっしゃろ?

こんな説明でよろしいでっか?
ほな。

【22252】Re:三角形の頂点の座標は?
お礼  ponpon  - 05/2/13(日) 18:28 -

引用なし
パスワード
   ponponです。こんばんは。
お答えありがとうございます。
 Flgをたてると、別のプローシージャーのループの途中でも、割り込みをするんですね。
 私は、一つのプロシージャーが終了するまで、他のプロシージャーは開始しないものだと理解していました。
 これからは、あるプロシージャーの途中で、判断する場合に使えそうです。
 これで、初心者に毛の生えたぐらいになったかもしれません。
 ありがとうございました。

【22253】Re:三角形の頂点の座標は?
回答  bykin  - 05/2/13(日) 18:36 -

引用なし
パスワード
   >Flgをたてると、別のプローシージャーのループの途中でも、割り込みをするんですね。
>私は、一つのプロシージャーが終了するまで、他のプロシージャーは開始しないものだと理解していました。

フラグのあるなしと割り込みできるかどうかは関係おまへんよ。
ループの中にDoEventsを入れておけば、ループ実行中に別のプロシージャを
実行させることが可能ってことです。

ちょっと説明不足やったかな?
ほな。

【22254】Re:三角形の頂点の座標は?
お礼  ponpon  - 05/2/13(日) 19:07 -

引用なし
パスワード
   ▼bykin さん:
>フラグのあるなしと割り込みできるかどうかは関係おまへんよ。
>ループの中にDoEventsを入れておけば、ループ実行中に別のプロシージャを
>実行させることが可能ってことです。
 ponponです。ありがとうございました。

DoEvents ヘルプでは、
 発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。
 これでは、ちょっと理解できていませんでしたが、使い方が、少しわかりました。
 今まで、図形の関係は、flashなどで作成して、アニメーションを子どもたちに見せていましたが、エクセルでできると大変便利がよいです。エクセルでいろいろ使えるとなると、アイデアはそれなりにあるので、取り組んでいきたいと思います。
 しかし、どこの掲示板も会社での仕事関係で、データベースの処理のことはたくさんあるのですが、図形の関係はあまりありません。
 どこ通いサイトでもありましたら、教えてください。

【22256】Re:三角形の頂点の座標は?
発言  bykin  - 05/2/13(日) 21:52 -

引用なし
パスワード
   こんばんわ。

エクセルは表計算が基本やからねー・・・
VBAを使ってシェイプを操作したいってことやったら、
VBAの掲示板(こことか)で質問すればええと思います。

エクセルでのお絵かき手法(手作業)をマスターしたいんやったら、
吟遊詩人はんの↓こことか
http://ginyusijin.hmc6.net/
エセルはんの↓ここなんかを参考にしてください。
http://ecell.ld.infoseek.co.jp/

あと、ゲーム関係のページなんかも参考になるかも・・・
近田はんの↓こことか
http://www1.plala.or.jp/chikada/
谷孝一はんの↓こことか
http://www.geocities.co.jp/SiliconValley-Cupertino/8748/

ま、いろいろ探してみておくれやす。
ほな。

【22425】Re:三角形の頂点の座標は?
お礼  ponpon  - 05/2/19(土) 10:02 -

引用なし
パスワード
   ▼bykin さん:
おはようございます。ponponです。
返信遅れて申し訳ありません。(*^m^*)
>
>エクセルは表計算が基本やからねー・・・
確かに。
お気に入りに追加させていただきました。
ますますエクセルが好きになりそうです。
ありがとうございました。
>VBAを使ってシェイプを操作したいってことやったら、
>VBAの掲示板(こことか)で質問すればええと思います。
>
>エクセルでのお絵かき手法(手作業)をマスターしたいんやったら、
>吟遊詩人はんの↓こことか
>http://ginyusijin.hmc6.net/
>エセルはんの↓ここなんかを参考にしてください。
>http://ecell.ld.infoseek.co.jp/
>
>あと、ゲーム関係のページなんかも参考になるかも・・・
>近田はんの↓こことか
>http://www1.plala.or.jp/chikada/
>谷孝一はんの↓こことか
>http://www.geocities.co.jp/SiliconValley-Cupertino/8748/
>
>ま、いろいろ探してみておくれやす。
>ほな。

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