Excel (VBA)

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

 
(Windows 11 Home : Excel 2021)
1つの点(X, Y) を描画する方法
投稿日時: 24/01/09 21:20:09
投稿者: TomVla

VBAで「1点」を描画する方法があるでしょうか。
下記プログラムでは「E10」という「セル」の描画になってしまいます。
どのようにすれば(5,10)という座標点を描画できるでしょうか。
 
Option Explicit
Sub DrawPoint()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("p11") ' シート名に適切な名前を指定
 
    Dim xCoord As Integer
    Dim yCoord As Integer
 
    xCoord = 5
    yCoord = 10
 
    ws.Cells(yCoord, xCoord).Interior.Color = RGB(0, 0, 0)
End Sub

回答
投稿日時: 24/01/09 21:55:58
投稿者: WinArrow

図形を使って「点」を描画することになります。
なお、図形はセルの上に乗っかっているだけですので、セルの属性にはなりせん。
   
構文は、
    Shapes(xx).AddShape Type,Left,Top,Width,Height
  
こんな感じです。
  
図形、位置、サイズを指定します。
  
セル5にE5に配置したいならば、
Leftに、Range("E5").Left
topに、Range("E5").Top
を指定すればよいでしょう。

投稿日時: 24/01/10 07:06:31
投稿者: TomVla

WinArrowさん
早速のご連絡ありがとうございます。
下記ではコンパイルエラーになってしまいます。
 
Option Explicit
Sub DrawPoint()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("p11") ' シート名に適切な名前を指定
  
    Dim xCoord As Integer
    Dim yCoord As Integer
  
    xCoord = 5
    yCoord = 10
  
    Set Shapes(xx).AddShape Type,Range("E5").Left,Range("E5").Top,Width,Height
End Sub
 
基本的なことで申し訳ありませんがご教示おねがいします。

回答
投稿日時: 24/01/10 09:56:00
投稿者: WinArrow

TomVla さんの引用:

基本的なことで申し訳ありませんがご教示おねがいします。

 
そうですね・・・・基本的なことが分かっていないようですね?
 
「構文」とは、文法なので、そのままをコードとして記述すると
あたり前に「コンパイルエラー」になります。
「コンパイルエラー」とは、未定義の変数があるということです。
変数とは、今回の場合
「Type」「Width」「Height」
に対応する変数が宣言されていません。
 
今回の例では
> Set Shapes(xx).AddShape Type,Range("E5").Left,Range("E5").Top,Width,Height
set命令では、図形をオブジェクトとして格納する「変数」が記述されていません。
今回、図形をオブジェクトとして格納する「変数」が必要か否かは、私には判断でいません。
 
紹介した構文に間違いがありました。
>Shapes(xx).AddShape
のところは
Shapes.AddShape
が正しいです。
 
※図形ですから、
(1)図形の種類が必要です。
 Typeで指定します。
(2)サイズが必要です。
 Width,Heiightで指定します。
 
※コードの中で使用している「xCoord」「yCoord」は、どのように使用するのですか?
図形の左上として使用するのでしたら、
「xCoord」は、Leftパラメータに相当します。
「yCoord」は、Topパラメータに相当します。
 
不明なところがあったら、まずはHELPを参照してください。
 

投稿日時: 24/01/10 11:54:13
投稿者: TomVla

質問のしかたがマズかったようで申し訳ありません。
 
>※図形ですから、
>(1)図形の種類が必要です。
> Typeで指定します。
>(2)サイズが必要です。
> Width,Heiightで指定します。
質問の冒頭に書きましたように「座標点」を描画したいのです。
「点」ですから「サイズ」はありません。
「Type」は「Point」となるのでしょうか。
 
(X,Y)=(5,10)のようにX座標=5,Y座標=10としたいので
 xCoord = 5、yCoord = 10としました。
 
VBAではこのような「座標点」の描画はできないのでしょうか。
 

回答
投稿日時: 24/01/10 12:54:35
投稿者: WinArrow

引用:

質問の冒頭に書きましたように「座標点」を描画したいのです。
「点」ですから「サイズ」はありません。

見えないものは、描画でないと思いますが・・・・
どのように目視するのですか?

投稿日時: 24/01/10 13:08:16
投稿者: TomVla

「dot」で座標位置を表せないのでしょうか。
x座標とy座標の交点です。着色点にすれば「color dot」となります。
EBAにはこのような発想はないのでしょうか。

回答
投稿日時: 24/01/10 13:54:34
投稿者: WinArrow

CADと間違えていませんか?

回答
投稿日時: 24/01/10 17:01:24
投稿者: MMYS

TomVla さんの引用:

質問の冒頭に書きましたように「座標点」を描画したいのです。
  <中略>
VBAではこのような「座標点」の描画はできないのでしょうか。

TomVla さんの引用:
「dot」で座標位置を表せないのでしょうか。
x座標とy座標の交点です。着色点にすれば「color dot」となります。
EBAにはこのような発想はないのでしょうか。

VBA以前に、その目的を達成するには、Excelのどの機能を使用するつもりですか。
 
初稿(24/01/09 21:20:09)では、セル値で目的を達成しておりますけど。セル値をドットに見立てて実現するおつもりですか。
 
それとも、通常操作で
  挿入 → 図 → 図形 → 正方形/長方形
として図形を挿入し、最小サイズにすれば、それっほく見えますけど。
こちには、すでにWinArrowさんが、提案されております。
 
なお、Excelは表計算ソフトであって、図形ソフトでもCADでも有りません。
 

回答
投稿日時: 24/01/10 17:03:06
投稿者: Suzu

TomVla さんの引用:
「dot」で座標位置を表せないのでしょうか。
x座標とy座標の交点です。着色点にすれば「color dot」となります。
EBAにはこのような発想はないのでしょうか。

 
dot に対し、どのようなイメージを持たれているか わかりませんが、
 
例えば、
どこかに、座標のみの dot があり、それに、大きさの指定はない。
 
では、それが、0.01mm でも、10mm でも、概念としては同じですが
それを、画面上で、表現しようとしたとき、0.01mm を ユーザーは 視認する事はできません。
 
その 座標点 について、
どのような大きさで表示させるか を その アプリケーションは 既定値として持っています。
 
その様な概念を、Excel の Shape は持ち合わせていません。
画面上 どの様な 大きさ(太さ)で表示するか まで指定する必要があります。
 
 
Excelで
ある一つの セルの背景色を変え、画面ズームを 10% にすれば dot の様には見えます。
また、セルの高さや、幅を 変える事も可能です。
 
 
 
そのれらを理解した前提で、
おっしゃっている(5,10) という座標は、
 画面上の
  ・どこ を 起点として
  ・どの方向の
  ・どんな単位
 の 位置を示すのでしょうか?
 
以前 ご質問があって コードが提示された
Re: Fractal
https://www.moug.net/faq/viewtopic.php?t=82422
は、セルの背景色に対しての操作。
 
今回は、オートシェイプを操作するのであれば、
オートシェイプについて、きちんと 基礎を習得する必要があります。
 
(Excel)VBAマクロでオートシェイプを描写するときの基礎知識
https://dz11.hatenadiary.jp/entry/2017/11/17/094716
 
考え方や、計算方法については 他の言語で学んだ事が使える事も多いですが
操作しようとする対象については、N-BASIC や 他の言語で学んだ事が
そのまま使用できると考えてはいけません。
 
 
何度もご自身でも基礎ができていないとおっしゃっています。
きちんと、参考書なりを購入し、学びましょう。

回答
投稿日時: 24/01/10 18:15:39
投稿者: WinArrow

図形描画のサンプルコードです。
  

Sub test()
    Dim xCoord As Integer
    Dim yCoord As Integer
  
    xCoord = 5
    yCoord = 10
    With ActiveSheet
        .Shapes.AddShape Type:=msoShapeRectangle, Left:=xCoord, Top:=yCoord, Width:=0.01, Height:=0.01
    End With
End Sub

 
  
数値の単位は、ポイントです。
データ型:single
サイズを指定しないとエラーになるので、0.01を指定しています。
しかし、1ピクセル未満は、1ピクセル表示になる(0.75ポイント)
図形の種類は、四角形です。
 

回答
投稿日時: 24/01/10 23:13:16
投稿者: simple

既に解決済みの感じですが、ひとこと。
 
■PSETと全く同じものはありません。プログラム言語が違うんですから。
こんなヘルパー関数を使っておくとよいでしょう。

Function myPSET(x!, y!)
   With ActiveSheet
       .Shapes.AddShape Type:=msoShapeOval, Left:=x, Top:=y, Width:=0.25, Height:=0.25
   End With
End Function
(PSETという関数名を使うとエラーになってしまう。理由不明)
使い方の一例。
Sub test()
    Dim k&
    For k = 1 To 20
        myPSET [B2].Left + 0.5 * k, [B2].Top + 0.5 * k
    Next
End Sub

■AddShapeメソッドの考え方や、使い方については、過去議論しましたよね。
「フィボナッチ数列」
https://www.moug.net/faq/viewtopic.php?t=82533
の最後のところで、
> https://learn.microsoft.com/ja-jp/office/vba/api/excel.shapes.addshape
> を研究されるとよいでしょう。

としていますよ。
 
投稿日時: 23/11/13 09:38:56
投稿日時: 23/11/13 19:27:16
投稿日時: 23/11/13 21:03:38
などで議論しましたが、それらは理解もされなかったし、記憶にもまったく残らず、
ということですか。残念至極です。

投稿日時: 24/01/11 08:01:19
投稿者: TomVla

WinArrowさん MMYSさん Suzuさん  simpleさん
貴重なアドバイスありがとうございます。
少し時間をいただいて頭の中を整理します。消化不良になりそうなので。
まずはお礼まで。

回答
投稿日時: 24/01/12 13:13:09
投稿者: QooApp

VBA掲示板で他言語および他ツールの紹介をするのはいかがかとは考えましたが、
CADのようなオブジェクトの実体サイズを考慮不要で簡単に使用できるものとして個人的に思いつくのは
AdobeのillustratorをJavascriptで制御する方法です。
 
illustratorでは点(x,y)と点(x2,y2)をつなぐ実線を引くベクターオブジェクト形式ですが、
点部分も単一のオブジェクトとなっており、実線を引くための2点目を定義しなかった場合にCAD等と同様のサイズ0(実体なし)の座標上の点を定義できます。
 
ただしillustratorでさえ、この点オブジェクトは実線要素を含まないことが原因となる描画されない(目に見えない)という現象が起きます。(当たり前ではある)
 
範囲選択等、オブジェクトを選択すればそこに存在を確認することはできますが、未選択では全く表示されません。
 
描画するための実体を持たないためにこのような挙動となります。
 
CADの場合は画面の拡大量に依存せず常に一定のドット(またはクロスなど点を示す形)が描画されます。
※私は頭脳RAPID2Dしか触ったことないのでほかのCADは知りません。
 
点の座標に極高レベルの精度が要求されるようでしたらVBAやillustrator&JavascriptなどではなくCAD関係を使うほうが無難と考えます。
 
しかし、実際の座標を定義する値の計算方法に関しては別途エクセルで計算し
 
点Aの座標Xの計算式=???? 点Aの座標Yの計算式=????
点Bの座標Xの計算式=???? 点Bの座標Yの計算式=????
 
とデータを作成しておくことでCAD側に座標のリストを手動で登録することで高精度な座標設定は可能だと思います。
 
 
以上を踏まえたうえでですが、少なくともエクセルでは紙に針で穴を開けたような点を定義しようとしても、針の直径(点を示す図形の実態サイズ)の定義が発生してしまうはずです。
直径ゼロの針穴を定義できるのはCADや別の方法でオブジェクトを定義しているillustratorなどに限定されるのではないかと思います。
 
その点の座標にどの程度のこだわりを持つのか次第ではVBAをあきらめる必要が出てくるかもしれません。
 
あくまでも実体サイズをゼロで生成したい場合のはなしです。
実体サイズをどの程度の大きさ(VBAでは基本的にポイントという単位サイズ)で行くかはお好みですが、
許容できるならば各方面の方々が提示されてるので自分もそれに従って描けばいいかなと思います。
 
学校の授業などで黒板に簡単な作図をする程度のレベルであればチョークの太さの分だけ点というオブジェクトもサイズを獲得してしまいます。同様に文房具の定規でさえメモリの線幅の分だけ基準値の誤差が生まれます。これを妥協できるか否か、かなと思います。

投稿日時: 24/01/13 07:16:24
投稿者: TomVla

みなさま
数多くの方々よりご指摘いただいた内容をしっかり検討して先に進みます。
ありがとうございました。