[[20040204171945]] 『オブジェクトの選択』(AKI) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オブジェクトの選択』(AKI)

 初めて質問しのに、続けざまですみません。
 マクロでもつまづいています。。
 
  ActiveSheet.Shapes("Picture 289").Select
    Selection.Delete

  上記の場合、("Picture 289")の「289」の部分を絶対値ではなく
 相対値として表したいのですが、いい方法ありますか??
 セルだと相対値ききますが。。Shapesだとどうすればいいでしょう・・
 [Picture〜]はどんどん変化していきます。


 複数オブジェクトがあるとき、下のようにして、オブジェクトの名前を得ます。

 Sub ShapeTest()
     ' MsgBox ActiveSheet.Shapes.Count
     For Each sp In ActiveSheet.Shapes
         MsgBox sp.Name
     Next
 End Sub

(kazu)


 kazuさん、回答をありがとうございました。
 上記のNextの前にExit Forは入れてもいいんですよね??

 そうするとMsgBoxに数字が入ってでてきますが、この数字は
 spのカウント数で、次に出てくる名前「Check Box1と出てきますが」はspの
 名前という事になるのでしょうか?そもそもspは ShapesのPicture限定の
 意味なのでしょうか?選択したいPictureは880になっているのにMsgBoxで表示される
 数は290というのは、私の組み込み方が悪いと思うのですが。

 私がしたいのは、sheet上に他のsheet上のセルに投入された名前をobjectとして
 貼り付け、(←ここまでは自分でできました。。)作業後、次の人がそのsheetを使う為に
 全内容をクリアする。その際に、名前obを選択してdeletしたいのです。名前obは
 いつでも同じ場所に貼り付いています。名前obは貼り付ける度に Picture ○○○と
 数字が増えていってしまいます。

 (AKI)


 Exit Forは必要なら入れてOKです。

 Shapes は図形全体を表します。Shapes の中にはTextBox もCheckBox も
 Picture も全部含まれます。

 従って、Pictureのみ取り出したければ下のように
 if 文でPictで始まるものだけ選択します。

 Sub ShapeTest()
      ' MsgBox ActiveSheet.Shapes.Count ' これは図形全体の個数です
      For Each sp In ActiveSheet.Shapes
         If Mid(sp.Name, 1, 4) = "Pict" Then
             MsgBox sp.Name
             Exit For   ' これがあると一個目のPictureだけ表示します
         End If
      Next
  End Sub

 一個目のPictureだけを操作したければMsgbox sp.Name をpname = sp.Name
 にして、ループから抜け出して、pnameを操作に使用すればできます。

 (kazu)


 kazuさん、やっとわかりました。
 ですが、せっかく教えてもらったのに、肝心の選択と削除までたどり着けません。。
 
 'MsgBox ActiveSheet.Shapes.Count '
      For Each sp In ActiveSheet.Shapes
         If Mid(sp.Name, 1, 4) = "Pict" Then
            pname = sp.Name
            Exit For
         End If
          ActiveSheet.Shapes("Picture ○○○").Select ←ここに組み込みでok?
        Selection.Delete                              
   Next
   End Sub

      ○○○の部分をpnameに変えても動きません。。どの様に表示すればいいのでしょうか?

   (AKI)


 なんか良く分からないのだけど、仕様(考え方)に問題があるような・・

 >私がしたいのは、sheet上に他のsheet上のセルに投入された名前をobjectとして
 なにobject?

 >貼り付け、(←ここまでは自分でできました。。)
 どこに?

 >作業後、次の人がそのsheetを使う為に全内容をクリアする。
 作業後って? ブックを保存する前?

 全内容をクリアってどんなこと?

 >その際に、名前obを選択してdeletしたいのです。
  ?

 >名前obはいつでも同じ場所に貼り付いています。
 どこ?

 >名前obは貼り付ける度に Picture ○○○と数字が増えていってしまいます。
 どのように貼り付けてるの?

 

  (INA)


 Sub test3()
    For Each sp In ActiveSheet.Shapes
       If Mid(sp.Name, 1, 4) = "Pict" Then
          pname = sp.Name
          ActiveSheet.Shapes(pname).Select ←ここに組み込みます
          Selection.Delete
          Exit For
       End If
    Next
    ' 削除したあとすべきことがあればここに記述します
 End Sub

 (kazu)


  kazuさん、
 できましたーーー!!!!
 すごくうれしいです。これでここ2日位はまっていました。
 ありがとうございます!!!

  INAさん、
 私の説明の仕方悪くて、申し訳ありません。。今回の件は何とかなりました。。
 これからも宜しくお願いします。チェックボックスは無事に動いています。

 (AKI) 


 ん〜・・

 結局、「シート上にあるすべての Pictureオブジェクトの削除方法 」 について
 のご質問だったということなのですね。

 てっきり複数のPictureオブジェクトが配置してあって、
 ある特定のセル上にあるものだけ削除したいのかと思っていました。

 また、もしマクロでPictureを配置しているようであれば、
 その時点で名前を付与してしまうのも簡単かと思っておりました。

 深く考えすぎました。 失礼しました。(^_^;)

 いちおう考えてみましたので、載せておきます。
 Sub Sample()
 Dim sh As Object
    For Each sh In ActiveSheet.Pictures
        If TypeName(sh) = "Picture" Then sh.Delete
    Next
 End Sub

   (INA)


 とりあえず落ち着いたようで、よかったです。

 私もオブジェクトに名前をつけるべきだとは思いました。

 Mid では少しかっこ悪いので、Left にすべきだったかなとは思っていました。
 ほう、TypeName ってのがありましたか、知りませんでした。

 (kazu)


 昨日は定時退社だったので、今朝の書き込みになってしまいました。
 INAさん、ありがとうございます。INAさんのでもPicture無事に削除できました。
 みなさん、すごいですね。。(感動)私なんて記憶させながらマクロ作成して、
 ほんの少しステートメント織り込む程度です。これからも宜しくお願いします。

 INAさんのご指摘の件ですが、Sheet上にはPictureは1つしか配置してありません。
 図形としては、ほとんどがCheckBoxです。。(258もありました。)←動き遅くなります??

  そのPictureも苦肉の策でなぜかPictureになってしまいました。もっとスマートには
 したいのですが。下記内容で配置する時に名前の付与できますか?

  Sheets("XXXX").Select

    Range("D6").Select   ← このセルに人名が入っている
    Selection.Copy
    Sheets("YYYY").Select
    ActiveSheet.Shapes("Group 170").Select ←セル上ではなく図形の上に人名を貼り付                               けたいのです。
    ActiveSheet.Paste            ←そうすると貼り付けたものがPictureに
    Application.CutCopyMode = False
    Selection.ShapeRange.LockAspectRatio = msoTrue
    Selection.ShapeRange.Height = 23.25
    Selection.ShapeRange.Width = 222.75
    Selection.ShapeRange.PictureFormat.Brightness = 0.5
    Selection.ShapeRange.PictureFormat.Contrast = 0.5
    Selection.ShapeRange.PictureFormat.CropLeft = 42.52
    Selection.ShapeRange.PictureFormat.CropRight = 42.52
    Selection.ShapeRange.PictureFormat.CropTop = 0#
    Selection.ShapeRange.PictureFormat.CropBottom = 0#
    Selection.ShapeRange.IncrementLeft 735#
    Selection.ShapeRange.IncrementTop 53.25
  
  (AKI)


 いまいち、やりたいことが、み え ま せ ん。

 フォームのチェックボックスを複数まとめて、グループにして、
 そこに人名を貼り付けて、Pictureができる。

 テキストボックスにCaptionをつければ済むことではないのでしょうか?

 どうしたいのか言ってもらえるとありがたいのですが。

 CheckBoxが258個?、これはもうListBox かComboBox の出番です。
 (kazu)


  説明不足に加え表現力もなくスミマセン。。。

 投入シートに入れた担当名を別シートの「担当/調査/承認欄」の担当欄に
 貼り付けたのです。元々「担当/調査/承認欄」をオブヘジェクトで作成して
 しまったので、担当名もオブジョクトにしなければ、上に貼りつかないですよね?
 他の方法あったらお教えください。

 >テキストボックスにCaptionをつければ済むことではないのでしょうか?

  具体的にどうすればいいのでしょうか?

  (AKI)


 > 元々「担当/調査/承認欄」をオブヘジェクトで作成してしまった...
 具体的にどういう作り方をしているのでしょうか?
 (kazu)


  恥ずかしながら、図形描画−四角形/直線/テキストボックスを組み合わせて
 作りました。
 (AKI)


 > 図形描画−四角形/直線/テキストボックスを組み合わせて...

 ということは、テキストボックスだけでできない事情があったのでしょうか?

 (kazu)

  >テキストボックスだけでできない事情があったのでしょうか?

    事情など全然ありません。テキストボックスで作り直しました。
 
 >テキストボックスにCaptionをつければ。。
 
  Captionをつけるとはどうすればよいのでしょう?

  (AKI)


    テキストボックスにしたら、テキストボックスをクリックして
  リンクしたいセルを選択したら、投入した名前が担当欄の
  テキストボックスに入りました。
  KAZUさんがおっしゃっていたのはこの事なのですね。。 
  私はまだまだ基本的な知識が足りない様です。。
  ご指摘ありがとうございました。
  (AKI)


 >図形としては、ほとんどがCheckBoxです。。(258もありました。)←動き遅くなります??
 それは配置しすぎです・・・(@д@;) 
 安定性を考えると非常に危険かと・・

 sheetのWクリックイベントを使って、セルをチェックボックス代わりに使うか、
 もしくは、リストボックスをマルチセレクト1、スタイル1の設定で使った方が
 良いかと思います。

  (INA)


 三連休の間もCheckBoxの事は気になっていました。。
 コントロールツールボックスで作成したら、データ量も膨大になってしまいましたし。。

 >sheetのWクリックイベントを使って、セルをチェックボックス代わりに使う

   具体的にどの様な作業手順になるのでしょうか?

 >リストボックスをマルチセレクト1、スタイル1の設定で使った

   プロパティでの設定時にどの項目に上記設定をすれば良いのでしょうか?

 (AKI)


 >具体的にどの様な作業手順になるのでしょうか?

 シートモジュールのダブルクリック・イベントを使います。
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Address <> Range("A1").Address Then Exit Sub

    Cancel = True

    If Target.Value = "レ" Then
        Target.Value = ""
    Else
        Target.Value = "レ"
    End If
 End Sub

 >プロパティでの設定時にどの項目に上記設定をすれば良いのでしょうか?
 コントロールツールボックスのリストボックスのプロパティの
 リストスタイル・プロパティとマルチセレクト・プロパティです。

  (INA)


 せっかく教えていただいのに、レスポンス遅く
 なってしまって申し訳ありません。
 INAさんに教えていただいた内容が私には
 高度過ぎてがんばったのですが、
 わからないのです。。お手間かもしれませんが、
 もう少し噛み砕いて教えていただけるでしょうか?

 ダブルクリック・イベントの件ですが、
 Range内にチェックを入れたいセル番地を
 入れてさえすれば、ダブルクリックするだけで
 チェックできるのでしょうか?
 マクロの実行のリストには載らないのですが。。

 リストボックスの運用の基本的な事がわかって
 いないので、使い方が良くわかりません。
 今回は

 セル毎に確認項目が投入されていて、
 項目毎にその確認ができたかをチェックする為の、
 チェックボックスを作成するつもりでした。
 それを具体的にどの様にリストボックスで
 代用するのでしょうか?

 A1: ○○○は確認できましたか? 確認済 レ 
 A2: △△△は基準通りですかか? 確認済 レ 
 A3: □□□は間違っていませんか?確認済 レ 
       ・
       ・
       ・ 続く

 本当に手取り足取りになってしまいますが、
 ご教授をお願い致します。


 >ダブルクリック・イベントの件ですが、
 >Range内にチェックを入れたいセル番地を
 >入れてさえすれば、ダブルクリックするだけで
 >チェックできるのでしょうか?
 単一セルであればできます。

 ただし複数セルの場合は以下のように変更して下さい。
 If Target.Address <> Range("A1").Address Then Exit Sub
  ↓
 If Application.Intersect(Target, Range("A1:A10,C1,D6:E10")) Is Nothing Then Exit Sub

 >マクロの実行のリストには載らないのですが。。
 ふつうに実行させるマクロではなくて、ダブルクリックすると実行されるマクロなのです。
 そのため、どのセルをダブルクリックしたときに処理するかを上記のコードで
 判別しています。targetがWクリックされたセルを表しており
 Intersect により、 Range("A1:A10,C1,D6:E10") の範囲の中にtargetがあるか
 しらべて、もし無い(Nothing)場合は、Exit Sub(マクロ終了)となります。
 もし範囲ないであれば、それ以降のコードを処理します。

 >それを具体的にどの様にリストボックスで
 >代用するのでしょうか?
 リストボックスに項目を表示させます。
 そうすると、リストボックスは以下のようになります。

 リストボックスの設定で表示されるチェック用のボックス  
  ↓             項目(ListFillRangeプロパティを A1:A3 にする)
                      ↓
  □  ○○○は確認できましたか?  
  □  △△△は基準通りですかか? 
 □  □□□は間違っていませんか?
  

 どちらを使うかはお好みしだいですね。
  (INA)


  だいぶ間が空いてしまい申し訳ありません。。悪戦苦闘してみました。
 INAさんに教えていただいた、ダブル・クリックイベントですが、
 コピーして(複数セル用)、Rangeの部分を変更したのですが、
 Wクリックしてもチェックは付かず、セル内にカーソルがピコピコして
 いるのみです。。。
 そこでリストに挑戦したら上手くいきそうなのですが、リスト上にて
 チェック忘れを抜き出す(確認する)事は可能でしょうか?
 チェックボックスの時には、リンクセルにFALSEとTRUEを表示させて
 オートフィルタで検索かけて確認する様にしていました。
 リスト形式にしてしまうと、リストの複数の項目のチェックの漏れを
 抜き出す等して確認すれば宜しいでしょうか?
 ご教授お願い致します。


 >セル内にカーソルがピコピコしているのみです。。。
 「デザインモード」になったままではないでしょうか?

 >リスト形式にしてしまうと、リストの複数の項目のチェックの漏れを
 >抜き出す等して確認すれば宜しいでしょうか?
 リストボックスは、どのような感じで使っていますか?

 いまいち「リスト上にてチェック忘れを抜き出す(確認する)事」というのの
 イメージが掴めません。

 どのようなリストがあって、どのような状況のときに
 「チェック忘れを抜き出す」マクロを実行したとして、
 どこにどのような結果を出力すればよいのでしょうか?

  (INA)


 >「デザインモード」になったままではないでしょうか?
   「デザインモード」がOFFされていてもチェック付きません。。
  セル内にカーソルが入って入力可能になるのみです。
  Rangeの前にワークシート名も入れてはみたのですが。。

 リストの形式は
  □ ○○○は確認できましたか?  

   □  △△△は基準通りですかか? 
  □  □□□は間違っていませんか?
   ・
   ・
  の確認内容(220個以上)を選択して名前の定義(ex.確認内容)をつけます。
  リストのプロパティでlistfillRange=確認内容 にします。
  でもLinkedCellでチェックの有無(false/true)を表示するセルを選択する
  場合、1つの確認内容(○○○は確認できましたか?)にしか、リンクセルは
  通用しないのでしょうか?
  チェックした結果はプロパティのどの項目にてコントロールできるのでしょうか?

  確認内容がたくさんあると、「△△△は基準通りですか?」をチェックし忘れたのを
  一応のチェック終了後に1個1個見直しをしなくても、何かを手がかりに抽出する
  事は可能でしょうか?
  
  確認項目1つに対して1項目しかないリストボックスを作ってもチェックボックス
  256個と同様の重さになってしまいますよね。。。

  (AKI)


 >「デザインモード」がOFFされていてもチェック付きません。。
 > セル内にカーソルが入って入力可能になるのみです。
 > Rangeの前にワークシート名も入れてはみたのですが。。
 対象となるシートモジュールに記述してますか?
 標準モジュールではだめです。
 あとシートモジュールに記述するので、ワークシート名は不要です。

 >チェックした結果はプロパティのどの項目にてコントロールできるのでしょうか?
 Selected プロパティで 選択の有無を判別できますので、
 以下のように処理することができます。

 Sub Sample() 
 Dim i As Long
 Dim myList As String
 Dim myCnt As Long

    For i = 0 To ListBox1.ListCount - 1

        If ListBox1.Selected(i) = False Then
            MsgBox ListBox1.List(i) & "が、選択されていません。", 48, "未チェック"
            myList = myList & Chr(13) & ListBox1.List(i)
            myCnt = myCnt + 1
        End If

    Next i

    MsgBox "未チェック名項目は、 " & myCnt & " 件 ありました。" & Chr(13) & _
            myList, 64, "未チェック項目"

 End Sub

  (INA)


 INAさん、本当にありがとうございました!!!!
  ダブルクリック・イベントでチェックできました。
 最初からシートモジュールのダブルクリック・イベントと記載されていたのに
 標準モジュールにコピペしてました。。
 リスト形式にするより、こちらのチェックを使った方が今まで作ったマクロも
 そのまま適用できるので、ダブルクリック・イベントのチェックを使用します。
 
 リストボックス上での選択の有無の処理方法も、これから他のデータ用に
 リストボックスを作ろうと考えているので、その時に試させていただきます。

 何度もしつこく質問を繰り返したのに対して粘り強く教えていただき、
 本当に感謝しております。
 これからも宜しくお願い致します。

 (AKI) 


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.