インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

部品づくり 図形がどのセルの上にあるか

imihitoさんに教えていただいた application.caller TopLeftCell BottonRightCell これらはとても便利そう。

注意すべきは,自分で作り自分だけが使うときは問題ないけど少しだけ図形がずれる,ということがあると想定外の不具合はありそうです。


Altキー押しながらセルの上にきっちり図形を置くと,TopLeftCellは想定通り動きますが,BottomRightCellは右下のセルを返します。

自分の想定ではTopLeftCellのほうを使えばいい,となりますが,ほんのちょこっとずらされてしまうだけでだめになるはず。
f:id:chemiphys:20181119102419p:plain
なので,図形の真ん中の座標で判定させてみるテストをしてみました。

Sub test()
Dim Sht As Worksheet: Set Sht = ActiveSheet
Dim Shp As Shape: Set Shp = Sht.Shapes(Application.Caller)

Dim CenterX As Long, CenterY As Long
CenterX = Shp.Left + Shp.Width / 2
CenterY = Shp.Top + Shp.Height / 2

Dim Rng As Range: Set Rng = Sht.Range(Shp.TopLeftCell.Address & ":" & Shp.BottomRightCell.Address)
Dim r As Range
For Each r In Rng
    If CenterX >= r.Left And CenterX < r.Left + r.Width And CenterY >= r.Top And CenterY < r.Top + r.Height Then
        MsgBox r.Address
        Exit For
    End If
Next

f:id:chemiphys:20181119102432p:plain

負荷を減らすべく,評価対象のセルの数を少なくできてたらいいな。

もしこれらで取得するセルを利用する場合は,セルを間違ったら大変なことになるはずなので,基本的には図形名等にセルアドレスを忍ばせて,それを利用することで想定外は無くすべきだと考えますが,次善の策としてはかなり有用だなぁと思います。

それにしてもCallerプロパティはいいですね。これは今後コード書くときに重宝する気がしています。