Excel (VBA) |
![]() ![]() |
(Windows 11 Home : Excel 2021)
フィボナッチ数列
投稿日時: 23/11/10 20:45:17
投稿者: TomVla
|
---|---|
これは正方形の内部に「縦横に」「平行に」線分がいくつか引かれる図が得られるはずですが、
|
![]() |
投稿日時: 23/11/11 06:22:47
投稿者: simple
|
---|---|
フィボナッチ数列は作成できていると思います。
|
![]() |
投稿日時: 23/11/11 07:07:34
投稿者: TomVla
|
---|---|
simpleさん
|
![]() |
投稿日時: 23/11/11 07:26:12
投稿者: simple
|
---|---|
引用:うーむ。 Set shp = ws.Shapes.AddLine(T + 119, 0, 0, 399)は、どことどこを結ぶ線と思っていますか? |
![]() |
投稿日時: 23/11/11 12:18:16
投稿者: simple
|
---|---|
よく確認してください。
|
![]() |
投稿日時: 23/11/11 12:54:19
投稿者: Suzu
|
---|---|
simple さんの引用: Shapes.AddLine メソッド (Excel) https://learn.microsoft.com/ja-jp/office/vba/api/excel.shapes.addline?f1url=%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vbaxl10.chm638081)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue 引用: つまり、 AddLine の それぞれの引数は 第一引数 : 始点 の X座標 第二引数 : 始点 の Y座標 第三引数 : 終点 の X座標 第四引数 : 終点 の Y座標 を指定します。 変数 T が 「1」の時の それぞれの引数は 第一引数 : 始点 の X座標 521-1 = 520 第二引数 : 始点 の Y座標 0 → 始点: C1 セルの 左上 第三引数 : 終点 の X座標 0 第四引数 : 終点 の Y座標 399 → 終点: A22 セル の左 になりますから、斜線になって当然です。 コード に 赤字を追加すれば 各変数の挙動がワークシート上に表示されます。 F列に T の値が表示されますから、フィボナッチ数列が得られている事は確認できます。 ' 描画するワークシートを選択(必要に応じて変更) Set ws = ThisWorkbook.Sheets("Sheet3") [color=red] ws.Cells(1, 1) = "N" ws.Cells(1, 2) = "P" ws.Cells(1, 3) = "Q" ws.Cells(1, 4) = "R" ws.Cells(1, 5) = "S" ws.Cells(1, 6) = "T" [/color] For N = 1 To 12 T = S * (Q ^ N - R ^ N) [color=red] ws.Cells(N + 1, 1) = N ws.Cells(N + 1, 2) = P ws.Cells(N + 1, 3) = Q ws.Cells(N + 1, 4) = R ws.Cells(N + 1, 5) = S ws.Cells(N + 1, 6) = T [/color] ' 直線を描画 Set shp = ws.Shapes.AddLine(T + 119, 0, 0, 399) ' ws.Shapes.AddShape Type:=msoShapeRectangle, Left:=0, Top:=0, Width:=T * 100, Height:=T * 100 ' Stop Set shp = ws.Shapes.AddLine(521 - T, 0, 0, 399) そのフィボナッチ数列を、Shapeとしてどう見せるか? それは 仕様の話であり、回答者が決めつける話ではないので、 きちんと、質問者さんが提示する必要があります。 それが、simpleさんが仰っている 引用: の意図です。 フィボナッチ数列と言う事なので、在りうるとすれば Wikipedia フィボナッチ数 https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0 の様な 正方形 の集合 または、それらのある一つ角を結んだ螺旋曲線 のどちらであると予測できます。 直線を使っていますから前者なのでしょう。 当方なら、 AddShape Type:=msoShapeRectangle の正方形で描くでしょうかね。 だとしても、始点終点の XY座標は N の T のみでなく N-1 の ときの T の X座標・Y座標にも影響を受ける事になり Set shp = ws.Shapes.AddLine(T + 119, 0, 0, 399) Set shp = ws.Shapes.AddLine(521 - T, 0, 0, 399) Set shp = ws.Shapes.AddLine(120, T - 1, 400, 0) Set shp = ws.Shapes.AddLine(120, 400 - T, 400, 0) の様な 0、339、400、120 の 様な固定値では無いはずですね。 まぁ、先に提示したコードの様に、セルに それぞれの計算結果値を表示させる様にし それぞれの 数値が 意図した値になっているのか、確認する様にしましょう。 |
![]() |
投稿日時: 23/11/12 07:17:23
投稿者: TomVla
|
---|---|
Suzuさん simpleさん
|
![]() |
投稿日時: 23/11/12 08:36:01
投稿者: simple
|
---|---|
[Rangeの指定方法]というスレッドで
Option Explicit Dim fibo() As Long Sub test1() '単純に右、下に正方形を追加していく場合 Const m As Long = 10 Dim k As Long ReDim fibo(0 To m) Call setFibo(m) 'フィボナッチ数の作成 Call 図形消去 ' Autoshapeを初期化 ReDim xpos!(m), ypos!(m), n&(m) '各shapeの座標と大きさ xpos(0) = 2!: ypos(0) = 2!: n(0) = fibo(0) * 10 Call rect(xpos(0), ypos(0), n(0)) '正方形の描画 For k = 1 To m If k Mod 2 = 1 Then xpos(k) = xpos(k - 1) + n(k - 1) ypos(k) = ypos(0) Else xpos(k) = xpos(k - 2) ypos(k) = ypos(k - 2) + n(k - 2) End If n(k) = fibo(k) * 10 Call rect(xpos(k), ypos(k), n(k)) Next End Sub Sub test2() ' らせん形の位置に正方形を追加していく場合 Const m As Long = 10 ReDim fibo(0 To m) Call setFibo(m) ' Autoshapeをいったん消去 Call 図形消去 ReDim xpos!(m), ypos!(m), n&(m) Dim k As Long xpos(0) = 500!: ypos(0) = 475! ' 最初のAutoShapeの位置 n(0) = fibo(0) * 10 Call rect(xpos(0), ypos(0), n(0)) '正方形の描画 For k = 1 To m Select Case k Mod 4 Case 1 xpos(k) = xpos(k - 1) + n(k - 1) ypos(k) = ypos(k - 1) Case 2 xpos(k) = xpos(k - 2) ypos(k) = ypos(k - 1) + n(k - 1) Case 3 xpos(k) = xpos(k - 1) - fibo(k) * 10 ypos(k) = ypos(k - 2) Case 0 xpos(k) = xpos(k - 1) ypos(k) = ypos(k - 1) - fibo(k) * 10 End Select n(k) = fibo(k) * 10 Call rect(xpos(k), ypos(k), n(k)) '正方形の描画 Next End Sub Function rect(x!, y!, n&) With ActiveSheet.Shapes.AddShape(msoShapeRectangle, x, y, n, n) .Fill.Visible = msoFalse With .Line .Visible = msoTrue .Weight = 1.5 End With End With End Function Function setFibo(k As Long) Dim j& fibo(0) = 1: fibo(1) = 1 For j = 2 To k fibo(j) = fibo(j - 1) + fibo(j - 2) Next End Function Sub 図形消去() Dim shp As Shape For Each shp In ActiveSheet.Shapes If shp.Type = msoAutoShape Then shp.Delete End If Next End Sub |
![]() |
投稿日時: 23/11/12 09:43:27
投稿者: TomVla
|
---|---|
(正方形の接続方法)のところで、実行すると
|
![]() |
投稿日時: 23/11/12 10:28:34
投稿者: simple
|
---|---|
改めて、投稿内容を新規ブックにコピーペイストして実行しましたが、そういう状態にはなりません。
|
![]() |
投稿日時: 23/11/12 12:10:36
投稿者: simple
|
---|---|
冒頭にある
|
![]() |
投稿日時: 23/11/12 13:47:56
投稿者: TomVla
|
---|---|
やはり動作しません。
|
![]() |
投稿日時: 23/11/12 16:24:55
投稿者: simple
|
---|---|
(1)
引用:test1のなかで、Call ×× としているところで、××のSubプロシージャや Functionプロシージャを呼び出しています。それらのプロシージャが無ければ エラーになるのは至極当然のことです。基本的な理解をしっかりされることを推奨します。 (2) 1. 標準モジュールに貼り付けることを一応前提にしています。 2.図形は、アクティブシートに描画されます。 全体をコピー貼り付けして、test1をステップ実行してみて下さい。 特に、描画する命令を実行したときに、描画がされるか確認してください。 |
![]() |
投稿日時: 23/11/13 07:25:08
投稿者: TomVla
|
---|---|
ありがとうございます。
|
![]() |
投稿日時: 23/11/13 09:38:56
投稿者: simple
|
---|---|
どのあたりに勘違いがあったんですか? 無理に説明を求めるものではありませんが。
|
![]() |
投稿日時: 23/11/13 19:27:16
投稿者: TomVla
|
---|---|
ご参考:
|
![]() |
投稿日時: 23/11/13 21:03:38
投稿者: simple
|
---|---|
既に回答したとおりですが、念のため。
Sub test3() Dim ws As Worksheet Dim P As Single, R As Single Dim Q As Single, S As Single Dim T As Single, n As Single P = Sqr(5) Q = (P + 1) / 2 R = (-P + 1) / 2 S = 1 / P ' 描画するワークシートを選択(必要に応じて変更) Set ws = ThisWorkbook.Sheets("Sheet3") For n = 1 To 12 T = S * (Q ^ n - R ^ n) ' 直線を描画 Call myLine(T + 119, 0, 0, 399) Call myLine(521 - T, 0, 0, 399) Call myLine(120, T - 1, 400, 0) Call myLine(120, 400 - T, 400, 0) Next End Sub Function myLine(x!, y!, m!, n!) With ActiveSheet.Shapes.AddShape(msoShapeRectangle, x, y, m, n) .Fill.Visible = msoFalse With .Line .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 255) .Weight = 2# End With End With End Function |
![]() |
投稿日時: 23/11/13 21:44:25
投稿者: TomVla
|
---|---|
simpleさん
|