円の方程式 X = r * Sin(θ)、Y = r * Cos(θ)を使い、フリーフォームで円を描こうと思い、下記のマクロを書きました。
まず、最初からつまずきました。
マクロ名をSub Circleにしたらそれだけでエラー。
VBAにCircleという関数か何かあるのですか?
次に下記に名前を変えて実行したら、実行時エラー1004「アプリケーションまたはオブジェクトの定義エラー」だそうです。ためしにX0、Y0を100にしたらエラーは出ませんがスタートの座標100、100から円までの軌跡と円に接するところが変になります。
フリーフォームで真円を描くにはどこをどう直せばいいでしょうか?
Sub EN()
r = 50
π = Application.WorksheetFunction.Pi()
' X0 = 100
' Y0 = 100
X0 = r * Sin(0) + 100
Y0 = r * Cos(0) + 100
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, X0, Y0)
For θ = 0 To π * 2 Step π * 2 / 360
X = r * Sin(θ) + 100
Y = r * Cos(θ) + 100
.AddNodes msoSegmentCurve, msoEditingAuto, X, Y
DoEvents
Next
.ConvertToShape.Select'ここがエラー
End With
End Sub
No.5ベストアンサー
- 回答日時:
既にご指摘があるように、刻みを荒くすると旨く行くようです。
小生もいろいろ試してみました結果です。それもある時は
旨く行って、変えてないのに別の機会には旨く行かないこともあったようで、悩まされました。ご報告だけですみません。
Sub EN()
Cells.Clear
Dim x As Double
Dim y As Double
Dim pai As Double
Worksheets("sheet1").DrawingObjects.Delete
j = 0
R = 100#
pai = Application.WorksheetFunction.Pi()
pai = 3.14159
'-------0
j = j + 1
x0 = R * Sin(0) + 200#
y0 = R * Cos(0) + 200#
Cells(j, "A") = x0
Cells(j, "B") = y0
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, x0, y0)
'--------1-359
For θ = 5 To 359 Step 5
j = j + 1
x = R * Sin(θ * pai / 180) + 200#
Cells(j, "A") = x
y = R * Cos(θ * pai / 180) + 200#
Cells(j, "B") = y
.AddNodes msoSegmentCurve, msoEditingAuto, x, y
Next
'--------
.AddNodes msoSegmentCurve, msoEditingAuto, x0, y0
j = j + 1
Cells(j, "A") = x0
Cells(j, "B") = y0
.ConvertToShape.Select
End With
End Sub
でFor θ = 5 To 359 Step 5の5を4にするとエラーがでて、5にするとうまく行きます。
初期値5もX0,y0から離れるようにしないと行けない。
(θ = 0 to・・やθ = 1 toはX0,y0と接近してだめ。)
(1)Forは小数点つきの数を指定していても、整数値を取って飛ぶ。Stepの取る数も同じ。
(2)必ず最初の点に戻って閉曲線になるべきかどうか、最初の点に繰り返しAddnodesして良いかどうか不明。
フリーフォームを使われるぐらいだから、簡単な下記のやり方は既にご存知でしょうね。
Sub test04()
cLeft = 200
cTop = 100
cWidth = 100
cHeight = 100
ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _
Left:=cLeft, Top:=cTop, Width:=cWidth, Height:=cHeight).Select
End Sub
ありがとうございました。
勉強になりました。
msoShapeOvalはもちろん存じております。
今回、円をぐるっと書いてみたかったのでフリーフォームでやってみました。
No.4
- 回答日時:
#2です。
>修正のプロシージャーを実行しましたが、やはり同じ実
>行時エラーとなりました。
私の環境(Excel2002)では、先の修正で動作したのですが、バージョンなどに影響を受けるかもしれません。
#3の方の回答にあるように、節点が近すぎるとエラーになるようですので、
r = 50
をもう少し大きくするか、
For θ = π * 2 / 60 To π * 2 Step π * 2 / 60
の刻みを粗くする。たとえば、
For θ = π * 2 / 45 To π * 2 Step π * 2 / 45
位に変えてみてください。これでエラー発生するなら、順次数値を変えてみて、エラーが発生しない数値を探してみてください。
いずれにしても、半径と刻みを調整すれば、先の回答内容で動作すると思います。
No.3
- 回答日時:
#1の書き込みをした者です。
実は回答して直ぐに回答内容の誤りに気付き「間違ってました」と再書き込みをしたつもりだったのですが、急ぎの用件があってあわてたのでどうやら回答の確認ボタンを押さずに席を外してしまったようです。失礼しました。#2のrebellionさん、正確な回答をありがとうございました。
それで、一部判明したことがあるのでご報告します。
以下だけでエラーになります。
ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 100, 150)
.AddNodes msoSegmentCurve, msoEditingAuto, 100, 150
そして以下とするとエラーはなくなります。
.AddNodes msoSegmentCurve, msoEditingAuto, 100, 158
つまり、接近しているとまずいようです。そして、その線でネット情報を調べたら同じ問題についての記述を見つけたのでご報告します。
http://cgi.fuji.ne.jp/~fj2094/cgi-bin1/wwwlng.cg …
の一番最後の報告に「節点の距離が近すぎるとダメみたいです」と記載されています。
No.2
- 回答日時:
>マクロ名をSub Circleにしたらそれだけでエラー。
一般的な英単語は予約語に引っかかる可能性がありますので、putcircleとかのように辞書にない形で、定義するのが普通だと思います。
>実行時エラー1004「アプリケーションまたはオブジェクトの
>定義エラー」
BuildFreeformについては詳しくないので、真の原因はよくわかりませんが、ADDNODEをForループで0から始めると、BuildFreeformで指定した最初の節点になるのが、まずいのではないかと思います。また、ForループでのStepの刻みも小さすぎるのではないかと思います。
以上を踏まえて修正してみると、
Sub EN()
Dim X As Single, Y As Single
R = 50
π = Application.WorksheetFunction.Pi()
' X0 = 100
' Y0 = 100
X0 = R * Sin(0) + 100
Y0 = R * Cos(0) + 100
With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, X0, Y0)
For θ = π * 2 / 60 To π * 2 Step π * 2 / 60
X = R * Sin(θ) + 100
Y = R * Cos(θ) + 100
.AddNodes msoSegmentCurve, msoEditingAuto, X, Y
DoEvents
Next
.ConvertToShape.Select
End With
End Sub
といった感じでしょうか?
あとθやπのような2バイト系の字は、変数に使用しない方が好ましいと思います。また、この場合DoEventsも不必要だと思います。
No.1
- 回答日時:
多分ですね、
Visual Basic editorの[ツール]-[参照設定]中の[ConvertToShape]に対応するライブラリファイルが選択されていないのではないかと思います。
試してみてください。
この回答への補足
ありがとうございました。
[ConvertToShape]に対応するライブラリファイルとはどれなのでしょうか?
現在参照にチェックが入っているのは
Visual Basic For Applications
Microsoft Excel 9.0 Object Library
OLE Automation
Microsoft Office 9.0 Object Library
Microsoft Forms 2.0 Object Library
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
Excelのマクロでフリーフォームの作成について
Excel(エクセル)
-
エクセルの図形で弧を書く方法
Excel(エクセル)
-
-
4
円弧の描画について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
なぜこんな初歩的なVBAのIf文で...
-
エクセルエラー13型が一致しま...
-
マクロについて教えてください...
-
実行時エラー3001「引数が間違...
-
VB6+SQL サーバー 2000 で 実行...
-
VBAがブレークモードになっ...
-
エラー1004 PDFの保存ができま...
-
EXCEL VBAマクロ中断でデバッグ...
-
VBS実行時エラー オブジェクト...
-
1列目の何行目に検索文字がある...
-
プロシージャ名の取得
-
[Delphi] データセットは閉じて...
-
VBSで変数の宣言はできないので...
-
ExcelのVBAのAutoFillの使い方...
-
VB6のDateDiff関数が、お客さん...
-
ACCESS フォームサイズ指定で...
-
ExcelVBA Range クラスの Page...
-
アクセス 実行時エラー3265
-
「アプリケーション定義または...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
VBAがブレークモードになっ...
-
なぜこんな初歩的なVBAのIf文で...
-
【Excel VBA】マクロをボタンに...
-
VBSで変数の宣言はできないので...
-
VBS実行時エラー オブジェクト...
-
実行時エラー3001「引数が間違...
-
ExcelVBA Range クラスの Page...
-
ExcelVBAで、ユーザー定義型は...
-
EXCEL VBAマクロ中断でデバッグ...
-
マクロについて教えてください...
-
プロシージャ名の取得
-
ADODB.Streamを使用してUTF-8を...
-
実行時エラー -'-2147417848
-
Outlook.ApplicationをCreateOb...
-
VBAでのエラー
-
なぜエラーになるのでしょうか...
-
VBAのコードがエラーになっ...
-
[Delphi] データセットは閉じて...
おすすめ情報