- ベストアンサー
エクセルVBAオートシェイプの条件分岐
- エクセルVBAの初心者が、セルに文字が入っておらずオートシェイプがない場合にアクションを起こす方法を知りたいです。
- 質問者はIFを使った条件分岐が難しいため、SELECTCASEを使おうと思っています。
- ケース2の条件として「オートシェイプがあったら」という条件をどのように書けばいいのか分かりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > SELECTCASEを用いてみようと思うのですが条件の書き方が分かりません。 > ケース2の「オートシェイプがあったら」という条件の書き方が分かりません。 'オートシェイプ'が厳に'オートシェイプ'を指しているとすれば、 Shapes コレクションの Shape オブジェクトを総当たりでループして、 shape.Type プロパティが msoAutoShape であるものの有無をチェック することになります。 こういう場合は関数にしておいた方が簡単でしょうね。 ' ' /// Shapes に'オートシェイプ'が含まれるならTrue Function HasAutoShape(oShapes As Shapes) As Boolean Dim oS As Shape For Each oS In oShapes If oS.Type = msoAutoShape Then HasAutoShape = True Exit For End If Next End Function ' ' /// 本題への答として、この関数と組み合わせて Case HasAutoShape(.Shapes) Exit Sub Case Else のように書くことができます。 'オートシェイプ'とは言ってみたものの実は'シェイプ'のことだった場合は、 関数などなくともシンプルに Case .Shapes.Count > 0 Exit Sub Case Else のような書き方で済みます。 一般に、'オートシェイプ'は[図形]の[挿入]で得られる'シェイプ'のこと、 また、'シェイプ'には、チャート、各種コントロール、セルのコメント、 等々、シート上に配置したセル以外のものは殆ど'シェイプ'に含まれます。 > IFを使った条件分岐が私には難しかったので ... ... > オートシェイプの有無を条件にするにはどのような書き方をすれば良いでしょうか? コツさえ掴んでしまえば、If ... Then ステートメント の方が 簡単であっさりしたものになります。 今回の場合は、If ... を用いるのが標準的かな、とは思います。 勿論、両方扱える方がいいですよね。 ' ' /// 'オートシェイプ' Sub オートシェイプ貼り付け2() With ThisWorkbook.Worksheets("Sheet1") If .Range("A1").Value <> "" Then Exit Sub If HasAutoShape(.Shapes) Then Exit Sub ' オートシェイプ☆を貼る End With End Sub ' ' /// ' ' /// 'シェイプ' Sub オートシェイプ貼り付け2() With ThisWorkbook.Worksheets("Sheet1") If .Range("A1").Value <> "" Then Exit Sub If .Shapes.Count > 0 Then Exit Sub ' オートシェイプ☆を貼る End With End Sub ' ' /// 「○○があるかどうか」というのは、 コレクションオブジェクト(この場合はShapes)のプロパティで、 collection.Count 等で、オブジェクトの数を取得して、0 より大きいか、 という判別することになるものが多いです。 'シェイプ'にはコレクションがあり、.Count プロパティで、 「'シェイプ'があるかどうか」を簡単に調べられますが、 残念ながら'オートシェイプ'にはコレクションがありませんので、 「'オートシェイプ'があるかどうか」を調べる為には、 オブジェクトを総当たりで調べて、見つかったらループを抜ける、 というやり方になります。こういう扱い方をするオブジェクトも 結構たくさんありますから、For Each ... Next ループと Exit For の構文はいずれ必要な場面に出くわすこともあるでしょう。 > ' オートシェイプ☆を貼る この部分は、こちらでは書けている、省略している、という理解でいます。 以上です。
お礼
realbeatinさん ご回答ありがとうございます。 IF、あっさり書く事が可能なのですね。 ワークシート関数のみの知識しかないのでVBAではどうやって 「文字がない」AND「図形がない」を条件として書くかばかりを考えてました。 ANDがなくてもIFが2つ並んで良いんですね、衝撃です! また、本でオートシェイプの情報はセルではなく図形本体に持たせられるみたいな事が 書いてあったので更に???になり・・・。 数をかぞえて0より多いという書き方は目からうろこです。 >オートシェイプ☆を貼る は参考書を読みながら出来ました。 いつもありがとうございます。