90本目 セルに被っている画像の削除

VBA100本ノック

VBA100本ノック 90本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック 90本目
Rangeオブジェクトを引数で受け取り、
そのセル範囲に少しでも重なっている画像を
全て削除するFunctionを作成してください。
戻り値として削除した画像数を戻してください。

※あくまで画像です。
※画像の回転は考慮しない。

解答

Sub Main()

    MsgBox ノック90本目(Selection) & "個 写真を削除したよ"

End Sub

Function ノック90本目(r As Range) As Long
    ノック90本目 = 0
    
    Dim sh As Shape, sh_rng As Range
    For Each sh In r.Parent.Shapes
        If sh.Type = msoPicture Then 'shapeが"画像"の時のみ
            Set sh_rng = Range(sh.TopLeftCell, sh.BottomRightCell) 'shの範囲
            If Not Intersect(r, sh_rng) Is Nothing Then 'もし被ってる範囲があれば
                sh.Delete
                ノック90本目 = ノック90本目 + 1
            End If
        End If
    Next
    
End Function

■考え方・流れ
0:00 冒頭・問題確認
2:02 Rangeを受け取りLongを返すFunctionの作成 
3:28 受け取ったRangeからシートを求める
5:11 Shapeが写真かどうかで条件分岐
6:30 shの範囲を特定する
8:36 rとshが被っていれば図形を削除しカウントする

今回はかなり小分けに動画化してみました!

新人君
新人君

小分けのほうが
分かりやすいっすね!!

ブチョ
ブチョ

分かりにくいっすね!

新人君
新人君

逆張りの部長…

Rangeを受け取りLongを返すFunctionの作成

ここは正直、言うことが無い…!!!

流石にfunctionの作り方は覚えておこう!!
俺は今覚えた!!
ByRefとかValさんとかはもういいや!!

呼び出すときはこんな感じ!!

この辺がわからない人は、ノック16本目を見返してくれ!!

受け取ったRangeからシートを求める

これは今回初めてだが、親オブジェクトを求めるってことだ!!!
For Eachで処理したいから、Rangeの一つ上の、シートが知りたいんだよな!!

引数でシートをもらってもいいんだけど…
引数であんまりごちゃごちゃ受け渡したくない時もあるよな!!
そういうこった!

ちなみにこれは全然難しくはねえ!
Parentプロパティさんってのがあるから、今日はそれを覚えて帰ってくれ!!!

だからつまり、Rangeの親の親って言ったら、ブックが返るってこった!!
イメージつくかい??

分からんかったら…
今までのノックを全部見返してくれい~!!!!w

Shapeが写真かどうかで条件分岐

ん?Shapeが写真?なんのこっちゃ?となるかもしれんが…
Shapeって、色々あんねん!(白って200色…のやつ)

図形とか画像とかコントロールとかってことね!!

これさえわかりゃ、あとはぐぐりゃええんすわ。

写真ってどれじゃ~~ってことで。
msoPictureがもう見慣れてる気がする!

おし!一旦ここまで!

shの範囲を特定する

うっし!ここからは!ココからはやっっっっっっっと、「Rangeが画像と被ってたら」の話。

引数でぶっこまれた”r”と、For Eachでぐるぐるした”sh”を、
Intersectメソッドさんに書けます!!!

Intersectメソッドさんって何かって言うと…
被ってる範囲を出してくれるおじさんでしたね!!

つまり…かぶってりゃあ何かしらRangeが返ってきて、かぶってなけりゃあ返ってこんってことっす。

その考えすりゃ理解出来れればOK!!
一旦はDebug.Printで様子見ね。。

よし!!ここからは最後の仕上げ!!!

rとshが被っていれば図形を削除しカウントする

最後!!!Intersectメソッドさんの結果を基に、Is Nothingじゃなけりゃあ
shを削除して、カウントすりゃ完成!!

書き方は「If Not」って書いてげるのが一番簡単かな!!!
そうでなくても、If~ElseのElseのところに処理を書いてあげてもOK!!!

処理は「sh.Delete」と、ノック90本目=ノック90本目+1でOK牧場。。

こ、これで完成かな…

お疲れんこん~~~!!

ブチョ
ブチョ

お疲れ様!
ポケモン発売から1週間たったね!

新人君
新人君

色んなバグがあるらしいっすね!

あとがたり

おはこんばんちは。uぷ主です。
90本目、セルに被っている画像の削除するファンクションを作る問題でしたね!!

今回はそこまで難しくはなかったけど…
最後のプロパティ関連が出てきたって感じですかね??
ParentやTopなんちゃらみたいな…。

ちな、uぷ主はVBAではParentは初めて使いました!
Topなんちゃらはよく使うんですけどね…。。

とま、今回もめちゃくちゃありがたい問題でした。
神髄さん、ありがとうございました!!!!!


ほな、ここからは一ミリも関係ないお話。
報告を2点。

一つ目、Youtube登録者数10万人突破しました~~~~!!!!
いぇ~~い!!
・・・・

だからなんなん??って感じなんですけど…ww
銀の盾が申請できるみたいなんでね。
それ抱きしめて寝たいと思います。
届いたらまた報告しま。

ホントに登録してくれたみなさんに感謝です。

二つ目、、、、

ポケモン新作買っちゃった~~~~~!!!!!
これは、、、、、、非常にまずいっす。
時間が…無くなる…。。。。

まあ、、、剣盾もやってたんで…そこまで変わらないとは思うんですが…
本業やらYoutubeやらに支障が出ないようにやっていきたい…。。。。

最後までご視聴いただいたみなさん!ありがとうございました!

コメント

タイトルとURLをコピーしました