Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6833 / 13646 ツリー ←次へ | 前へ→

【42859】削除の方法 てるてる 06/9/23(土) 14:48 質問[未読]
【42861】Re:削除の方法 りん 06/9/23(土) 15:30 回答[未読]
【42864】後者の場合 てるてる 06/9/23(土) 16:04 発言[未読]
【42865】Re:後者の場合 Kein 06/9/23(土) 16:17 回答[未読]
【42868】Re:後者の場合 てるてる 06/9/23(土) 16:36 お礼[未読]
【42866】Re:後者の場合 りん 06/9/23(土) 16:21 回答[未読]
【42869】Re:後者の場合 てるてる 06/9/23(土) 16:38 お礼[未読]

【42859】削除の方法
質問  てるてる  - 06/9/23(土) 14:48 -

引用なし
パスワード
   お願いします。

今、フォームのスピンボタンを使って、別のシートから数値を持ってきて
その数値を使って、図形で直線を描いています。

スピンボタンは、図形を作成する際の変数を呼び込むために
絶対になくてはならないものです。

一方、書いた図形は、次の変数を読み込んで来る際に削除して
新たに図形を描かせるという作業を繰り返し行う処理をしたいと思っています。

ActiveSheet.DrawingObjects.Delete

を使うと、スピンボタンも削除されてしまうので
そこを何とか解決したいです。

スピンボタンを保護して、図形のみを削除する方法を教えて欲しいのですが・・・

過去ログを拝見しましたが、応用ができません・・・
よろしくお願いします。

【42861】Re:削除の方法
回答  りん E-MAIL  - 06/9/23(土) 15:30 -

引用なし
パスワード
   てるてる さん、こんにちわ。

>今、フォームのスピンボタンを使って、別のシートから数値を持ってきて
>その数値を使って、図形で直線を描いています。

線だけ消したい場合はこんな感じ。
Sub test1()
  Dim sh As Shape
  '
  For Each sh In Application.ActiveSheet.Shapes
   If sh.Type = msoLine Then sh.Delete
  Next
End Sub

スピンボタンだけ残したい場合はこんな感じ。
Sub test2()
  Dim sh As Shape, tf As Boolean
  '
  For Each sh In Application.ActiveSheet.Shapes
   If sh.Type = msoFormControl Then
     tf = (sh.FormControlType = xlSpinner) 'スピンボタンか否か
   Else
     tf = False '削除
   End If
   If tf = False Then sh.Delete
  Next
End Sub

【42864】後者の場合
発言  てるてる  - 06/9/23(土) 16:04 -

引用なし
パスワード
   ▼りん さん:

早速のレスありがとうございます。
作業の便宜上、後者の方でトライしてみたのですが、
分からない構文があります。

>Sub test2()
>  Dim sh As Shape, tf As Boolean
>  For Each sh In Application.ActiveSheet.Shapes
>   If sh.Type = msoFormControl Then


>     tf = (sh.FormControlType = xlSpinner) 'スピンボタンか否か


この行は、tfにスピンボタンを格納?しているのではないかと思うのですが、
カッコ内で ”=”をするのが何故なのか
補足して頂きたいのですが・・・

>   Else
>     tf = False '削除
>   End If
>   If tf = False Then sh.Delete
>  Next
>End Sub

上記の行だけが、何となくスッキリ理解できませんでした・・・
あとはOKです。

お願いします。。

【42865】Re:後者の場合
回答  Kein  - 06/9/23(土) 16:17 -

引用なし
パスワード
   スピンボタンだけを残して図形やコントロールを消したいのなら

Sub Del_Object()
  Dim Obj As Object

  For Each Obj In ActiveSheet.DrawingObjects
   If TypeName(Obj) <> "Spinner" Then Obj.Delete
  Next
End Sub

で、出来ると思います。

【42866】Re:後者の場合
回答  りん E-MAIL  - 06/9/23(土) 16:21 -

引用なし
パスワード
   てるてる さん、こんにちわ。

>>Sub test2()
>>  Dim sh As Shape, tf As Boolean
tfはブール(Boolean)型の変数です。
(型の詳細はヘルプを見てね)
シート上の図形をチェックする
>>  For Each sh In Application.ActiveSheet.Shapes
フォームコントロールかどうかで分岐
>>   If sh.Type = msoFormControl Then
フォームコントロールの場合は種類をチェックする
>>     tf = (sh.FormControlType = xlSpinner) 'スピンボタンか否か

カッコ内の、 sh.FormControlType = xlSpinner
という等式が成り立つときは、変数tfはTrueになり、
成り立たないとき(スピンボタンじゃないとき)はtfはFalseになります。
それ以外の時はスピンボタンではありえないのでtfは常にFalseであり、分岐の終了後FalseだったShapeを削除しています。

というわけで、
>この行は、tfにスピンボタンを格納?しているのではないかと思うのですが、
>カッコ内で ”=”をするのが何故なのか
tfにスピンボタンを格納しているのではなく、カッコ内の等式が成り立ったかどうかの値を格納しているのです。

変数の内容に関しては、メッセージボックスで中身を見てもらうのが早いかな。
Sub test2()
  Dim sh As Shape, tf As Boolean
  '
  For Each sh In Application.ActiveSheet.Shapes
   If sh.Type = msoFormControl Then
     tf = (sh.FormControlType = xlSpinner) 'スピンボタンか否か
   Else
     tf = False '削除
   End If
   MsgBox tf, vbInformation, sh.Name
   If tf = False Then sh.Delete
  Next
End Sub

【42868】Re:後者の場合
お礼  てるてる  - 06/9/23(土) 16:36 -

引用なし
パスワード
   ▼Kein さん:
アドバイスありがとうございます。

>Sub Del_Object()
>  Dim Obj As Object
>
>  For Each Obj In ActiveSheet.DrawingObjects
>   If TypeName(Obj) <> "Spinner" Then Obj.Delete
>  Next
>End Sub

かなりスッキリするやり方なんですね(汗
スピンボタンが”Spinner”で認識されていることは分かったので
自分なりに応用を使えるようにしてみたいと思います。

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

【42869】Re:後者の場合
お礼  てるてる  - 06/9/23(土) 16:38 -

引用なし
パスワード
   ▼りん さん:
引き続き、ありがとうざいます。
すごく丁寧に記載して頂いたおかげで、
モヤモヤしてたのは取れた?かなと思います。

Keinさんのも含めて、自分なりにもう少し理解を深めていきたいと思います。

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

6833 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free