Excel (VBA)

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

 
(指定なし : Excel 2016)
図形の選択で ChatGPTに質問したのですが・・・
投稿日時: 23/10/04 21:57:27
投稿者: taichi

質問内容は、
指定したセルには図形は1つしか存在しません。図形自体は時々いれかえるので、指定したセル内の図形をFor Eachを使わずに、セル番地の指定だけで当該図形を選択した。
コードは?
 
回答は、
Sub 図形を選択()
    Dim ws As Worksheet
    Dim cell As Range
    Dim shp As Shape
     
    ' ワークシートを設定
    Set ws = ThisWorkbook.Sheets("シート名") ' シート名を適切に変更
     
    ' セルを設定
    Set cell = ws.Range("A1") ' 指定したセルを設定
     
    ' セル内のShapeを取得
    On Error Resume Next
    Set shp = ws.Shapes(cell.Address)
    On Error GoTo 0
     
    ' 図形を選択
    If Not shp Is Nothing Then
        shp.Select
    End If
End Sub
このコードでは、指定したセル内にある図形をセルのアドレスを使用して取得し、それを選択します。セルやシート名を適切に変更してください。セル内に図形が存在しない場合、エラーハンドリングを使用してエラーを無視し、図形が存在する場合に選択します。
以上が ChatGPTの回答です
 
  On Error Resume Next を外すと案の定
 Set shp = ws.Shapes(cell.Address) でエラー
 Shapes()の()にShapeの存在するセル番地を記入してもダメですよね。
 
セル番地の指定だけで当該図形を選択できないのであれば、
    Set cell = ws.Range("A1") ' 指定したセルを設定
    
    For Each shp In ws.Shapes
        If Not Intersect(shp.TopLeftCell, cell) Is Nothing Then
            shp.Select
            Exit For
        End If
    Next shp
のように For Each を使います。セル内には図形を1つしか配置しないので、
For Each を使うとExcelは文句いわないですが、何となく余分な作業を
させているようなきがして、セル番地から図形を選択できないものかと思いました。
 
よろしくお願いいたします。
 
 
 
 
 

回答
投稿日時: 23/10/04 22:11:25
投稿者: simple

>For Each を使うとExcelは文句いわないですが、何となく余分な作業を
>させているような気がして、セル番地から図形を選択できないものかと思いました。

セルのプロパティに、その上にある図形、といったプロパティはありませんから、
その試みは成功しません。
あなたの方法、For Eachを使って一つずつチェックする方法でOKだと思います。
 
なお、余談めきますが、Shapeのなかにはメモだったり、入力規則だったりも入ってくるので、
そうした可能性があれば、なんらかの対応(エラー対応含む)が必要かもしれません。
まあ、それは傍流の話題ですが。

回答
投稿日時: 23/10/04 22:44:22
投稿者: WinArrow

図形には、ユーザー指定のン前が設定可能です。
図形を作成した時((VBAが望ましい)に、セルアドレスを含んだ名前にするとよいでしょう。
移動すると、厄介なことが発生することは、お分かりだと思います。
図形の名前をユーザー設定の名前にした場合、
その図形を複写すると、同じ名前になることがあるので、注意が必要です。

投稿日時: 23/10/05 06:13:10
投稿者: taichi

simple さん、WinArrow さん いつもありがとうございます。
 
simple さん
>セルのプロパティに、その上にある図形、といったプロパティはありませんから、
その試みは成功しません。
 
そうですよね! ws.Shapes(cell.Address) で Shapeを選択するコードなんか見たこともないですものね。
遠慮なくFor Each でいくことにします。
ChatGPTに時々質問してみましたが、間違って回答も結構あるような感じです。
 
> 余談めきますが、Shapeのなかにはメモだったり、入力規則だったりも入ってくるので
エッ! 思いもよらない話です。参考になるHelp またはサイトがあればご教授ください。
 
WinArrowさん
>図形を作成した時に、セルアドレスを含んだ名前にするとよいでしょう。
なんか目から鱗のようなきがします。

回答
投稿日時: 23/10/05 08:21:28
投稿者: simple

まあ大した話ではないです。
・リストを使った入力規則(ドロップダウンがshapeに該当)
・コメント(メモは書き間違いでした)
をシートに作成して、ご自分で書いたコードで、shp.Nameを出力すればわかります。
(前者はTopLeftCellがエラーになるので気が付きます。
  そのうちそういうケースに遭遇すると思います。)
また、.Typeを調べることでAutoshapeなどと判別することができます。
https://learn.microsoft.com/ja-jp/office/vba/api/office.msoshapetype

投稿日時: 23/10/05 17:43:40
投稿者: taichi

ありがとうございました。