Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2019)
Fractal
投稿日時: 23/05/09 12:50:49
投稿者: TomVla

以下は Mandelbrot set をExcel Visual Basicで描画するものでInternetで見つけました。
https://slicker.me/fractals/excel.htm
 
このコードで一応動作するようで特にError Messageも出ませんが、このURLで見られるような
描画が得られません。形がない青帯のようなものが出て来ます。
 
For y = 1 To 200
    For x = 1 To 200
        i = 0
        zx = 0
        zy = 0
        cx = -2 + x / 50
        cy = -2 + y / 50
        Do Until (i = 255) Or (zx * zx + zy * zy) >= 4
            xt = zx * zy
            zx = zx * zx - zy * zy + cx
            zy = 2 * xt + cy
            i = i + 1
        Loop
        Cells(y, x).Interior.Color = VBA.RGB(10, 10, i * 10)
    Next x
Next y
 
使用しているのはExcel_2019なのですがこれが新しすぎるのか。
そもそもVBAで「For ... Next」や「Do」が使用できるのか疑問です。
まともに動作しない理由についてお気づきのことがあれば
お教えいただけないでしょうか。

回答
投稿日時: 23/05/09 13:32:13
投稿者: taitani
投稿者のウェブサイトに移動

列幅とかぎょうはばの問題ではないでしょうか。
私にはリンク先の画像と同じように描画されました。
なお、コードは、一部ではなく、全部載せた方がよいですよ。

回答
投稿日時: 23/05/09 15:28:44
投稿者: Suzu

変数宣言でLongとかしていませんか?

回答
投稿日時: 23/05/09 16:40:04
投稿者: simple

ちょっとお付き合いしてみました。きちんと描画できますよ。
 
コードのはじめに変数宣言と環境設定してください。

    Dim x&, y&, i&
    Dim zx#, zy#, cx#, cy#, xt#
    Dim rng As Range

    Set rng = [A1].Resize(200, 200)
    rng.EntireColumn.ColumnWidth = 0.4
    rng.EntireRow.RowHeight = 5#

コードの終わりに、
    Application.Goto [A38], True
を追加して画面左上隅の位置を調節してください。
 
>そもそもVBAで「For ... Next」や「Do」が使用できるのか疑問です。
随分と大胆な感想ですな。使えるに決まっています。ヘルプを読んでください。

投稿日時: 23/05/09 21:00:08
投稿者: TomVla

みなさま
ご回答ありがとうございます。
超初心者でして、勉強不足のまま投稿してしまい申し訳ありません。
感想も大胆なものになってしまいました。
恥を忍んで追加質問いたします。お手数をかけして申し訳ありませんがよろしくお願いします。
 
taitaniさん
「行」「列」幅はどの程度にすればリンク先の画像と同じように描画されるでしょうか。
いろいろ試してみましたがうまくいきませんでした。
 
時間がかかりそうですが数日かけてじっくりやってみます。

投稿日時: 23/05/09 21:09:27
投稿者: TomVla

追記します。
 
simpleさん
>随分と大胆な感想ですな。使えるに決まっています。ヘルプを読んでください。
この「ヘルプ」とはどれを指摘されているのでしょうか。

回答
投稿日時: 23/05/09 21:39:16
投稿者: simple

>「行」「列」幅はどの程度にすればリンク先の画像と同じように描画されるでしょうか。
既に指摘いただいたように、もっと狭くしないといけませんね。
コードを提示していますが、試してみていないのでしょうか。放置ですか?
うーん、こちらの提案が伝わっていないのかな。
下記をコピーペイストして動かしてみてください。

Sub test()
    Dim x&, y&, i&
    Dim zx#, zy#, cx#, cy#, xt#
    Dim rng As Range
    
    Set rng = [A1].Resize(200, 200)
    rng.EntireColumn.ColumnWidth = 0.4
    rng.EntireRow.RowHeight = 5#

    For y = 1 To 200
        For x = 1 To 200
            i = 0
            zx = 0
            zy = 0
            cx = -2 + x / 50
            cy = -2 + y / 50
            Do Until (i = 255) Or (zx * zx + zy * zy) >= 4
                xt = zx * zy
                zx = zx * zx - zy * zy + cx
                zy = 2 * xt + cy
                i = i + 1
            Loop
            Cells(y, x).Interior.Color = VBA.RGB(10, 10, i * 10)
        Next x
    Next y
    Application.Goto [A38], True
End Sub


>この「ヘルプ」とはどれを指摘されているのでしょうか。
製品に付属するヘルプのことです。
大昔は書籍がついてきたことがありますが、現在はオンラインヘルプになっています。
 
VBE(エディター)画面に「ヘルプ」というメニューがあり、そこから辿っていけます。
また、コンテキストヘルプになっていて、例えば、Forのところにカーソルを置いて
F1キーを押すと、該当するヘルプがブラウザーに表示されるはずです。
(少し、表示されるものを見て、カンを働かせてリンクを辿る必要があるかもしれません。
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement
がFor..Nextステートメントに関するヘルプですね。)
 
ちなみに、ExcelVBAについてのテキスト、参考図書などは手元にあるんですか?
なければ購入して下さい。必須です。
そこに上記のような説明があるはずです。
For..NextやDoループは、いわゆる繰り返し構文で、こうしたものはたいていの言語には
あります。これがなければ繰り返しが書けません。
(手続き的な繰り返し構文を持たない言語もあるにはありますが)
 
繰り返しはプログラムの基本的な要素ですから、VBAを学ぶなら必須のものです。
薄くてもよいので、基本的なテキストを学習することが先決だと思います。

回答
投稿日時: 23/05/09 21:46:16
投稿者: simple

>リンク先の画像と同じように
数値を色々変えて試行錯誤してみてください。あなたが満足するまでやってください。

投稿日時: 23/05/10 04:16:08
投稿者: TomVla

simpleさん
解決しました。ありがとうございます。またご親切な解説にもお礼申し上げます。
 
決して放置したのではなく、やってみてもうまくいかなかったので再度投稿しました。
列・行幅を狭めたことが決め手になったかもしれません。
ExcelVBAについてのテキスト、参考図書は持っていますが内容は統計処理に関する
ものが殆どです。グラフィック処理については、今回教えていただいた環境設定に
ついての記載はありませんでした。
 
fractalは昔N-BASICで色々試みたことがあります。For..NextやDoループを何度も使用
しています。N-BASICのfractalについての本は何冊も持っています。数行の命令文で
複雑な図形を描画できるので夢中になりました。ここで再会できるとは!
今回の経験で世界が広がりましたので別のfractalにも挑戦してみます。
また疑問点について投稿しますのでよろしくお願いします。