Excel (VBA)

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

 
(Windows 10 Pro : Microsoft 365)
ワークシート上のテキストボックス(図形)のイベントについて
投稿日時: 23/09/11 13:59:53
投稿者: mashimo

ワークシート上に多数のテキストボックス(図形)が置いてあり、そのテキストボックスをクリックしたときに共通の処理をしたいと検討しています。
(簡単な例として、図形をクリックしたらぞの図形の名前を表示させるなど)
 
方法1:各図形に対してマクロの登録を手動で行い必要な処理をさせる
方法2:上記方法1の「マクロの登録」をマクロ化する?
方法3:図形クリックのイベントを捉えて共通の処理をさせる
など
方法1は図形の数だけマクロを準備する必要があり?、現実的でないです。
また、図形は今後、動的に増えていきます。
同様の理由で方法2も現実的でないかと思います(実現方法もわかりませんが)
方法3のような機能を実現したいのですが、可能でしょうか?
 
フォーム上のオブジェクトならWithEventsを使用した例がネットにありましたが、これが使用できるかどうかも判断できずに困っています。
 
実際にやりたいことはシート上に付箋のようにたくさん存在するテキストボックス(図形)の中の文字を取得して自動で修正することです。
 
アドバイスをお願いします

投稿日時: 23/09/11 14:27:57
投稿者: mashimo

自己解決しました
良い方法では無いかもしれませんが、シート上の全テキストボックスに対してOnActionプロパティで既存のマクロを設定し、そのマクロ内でApplication.Callerを取得することで、図形名を取得できました。
今からテキストボックス内のテキストを取得して修正する部分を検討していきます。
 
上記方法での問題点や、他に良い方法があるようでしたらご指摘ください

回答
投稿日時: 23/09/11 14:37:26
投稿者: simple

図形のテキストボックスには、そういうイベントはありませんから、
提示のあった方法が適当です。
二回目の投稿を拝見する前に書いてしまったので、
参考までにアップしておきます。

REM アクティブシートのすべてのTextBoxに、
REM 同一のマクロtestを登録する。
Sub main()
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        If shp.Type = msoTextBox Then
            shp.OnAction = "test"
        End If
    Next
End Sub

REM 登録するマクロの例
Sub test()
    Dim shp As Shape
    Dim n   As String
    n = Application.Caller
    Set shp = ActiveSheet.Shapes(n) '自分自身を指すshapeオブジェクト
    
    'textの修正例(文字列の最後に"mod"を連結する例)
    shp.TextFrame2.TextRange.Characters.Text = _
       shp.TextFrame2.TextRange.Characters.Text & "mod"
End Sub

回答
投稿日時: 23/09/11 14:45:32
投稿者: simple

     shp.TextFrame2.TextRange.Text = _
       shp.TextFrame2.TextRange.Text & "mod"
でよかったですね。まあ、そこはポイントではないですけど。

回答
投稿日時: 23/09/11 15:44:46
投稿者: WinArrow

>そのマクロ内でApplication.Callerを取得することで、図形名を取得
 
「テキストボックスの名前」は、一意ではない(重複することがある)ので、
作成時に注意することをお勧めします。
 

投稿日時: 23/09/12 09:25:09
投稿者: mashimo

納得しました。
>「テキストボックスの名前」は、一意ではない(重複することがある)ので、
作成時に注意することをお勧めします。
実は、このことは今まで認識しておらず、今回の試行錯誤で気が付きました。
気をつけなければいけませんね。
皆さん、ありがとうございました。