[[20240109160245]] 『VBAにてオートシェイプを非表示』(勘吉) ページの最後に飛ぶ

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

 

『VBAにてオートシェイプを非表示』(勘吉)

初心者のため説明下手ですがご容赦ください。

まず状況ですが
シート1〜7まで存在します。
シート1〜5がオブジェクトが多数存在し
シート7がオブジェクトの名前、詳細等の一覧となっております。
シート1〜5のオブジェクトには
図形の書式→オブジェクトの選択と表示 にて名前を設定してます。(シート7の一覧A列と同じ名前)

ここからやりたいことです。
シート7のF列に「1」と入力すると、その行のA列と同じ名前のオブジェクトを非表示にしたいです。
ちなみにシート7は1500行程度存在します。
シート1〜5にも1500個程度オブジェクトが存在します。

これをVBAにてマクロを組みたいのですが最初から躓いております。
よろしくお願いします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 具体的に、どんな事が分かれば出来そうですか?

 (1)マクロを起動する方法はどうするか
  ・コマンドボタンをクリックしたとき→コマンドボタンにマクロを登録します。
    ・シート7のF列のセルの値を変更したとき→シートモジュールのWorksheet_Changeプロシジャにマクロを書きます

 (2)シェープを指定する方法がわからない? → マクロの記録をしてみましょう
 
 (3)シェープを非表示にする方法が分からない? → マクロの記録をしてみましょう

 (4)全然わからないので作ってほしい → シート7のレイアウトを詳しく説明しましょう
(´・ω・`) 2024/01/09(火) 17:40:12

 UI的にはシート7に「チェックボックス」を配置して、ON/OFFを切り替えるのがいいと思います。
 1500個ものオブジェクトというのは想像できませんが、「もたつき感」はないのでしょうか?

 それは考えずに、「チェックボックス」を使った案を投下します。
 「Sheet1〜Sheet5」にオートシェイプを適当に配置した新規ブックで試してください。testを実行です。
 「Sheet7」に一覧表が作成されるので、「チェックボックス」を「ON/OFF」してみてください。
 オートシェイプには、同じ名前を指定できるので、「シート名」と「IDプロパティ」で特定しています。

 ※19:47、一部修正しました。

 Sub test()
    Const 一覧$ = "Sheet7"
    Dim shp As Shape, ws As Worksheet, cboxCnt&, r As Range
    Application.ScreenUpdating = False
    With Sheets(一覧)
        .Columns("A:A").ColumnWidth = 40
        .Columns("A:A").RowHeight = 20
        .CheckBoxes.Delete
        .Range("A1:D1").Value = Array("AutoShape名", "シート名", "Shape.ID", "ON/OFF")
        For Each ws In ThisWorkbook.Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5"))
            For Each shp In ws.Shapes
                cboxCnt = .CheckBoxes.Count
                Set r = .Range("A1").Offset(cboxCnt + 1)
                With .CheckBoxes.Add(Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:=r.Height)
                    .Caption = shp.Name
                    r.Offset(, 1) = ws.Name
                    r.Offset(, 2) = shp.ID
                    .LinkedCell = r.Offset(, 3).Address
                    r.Offset(, 3).Value = CBool(shp.Visible)
                    .OnAction = "CheckBox_Click"
                End With
            Next
        Next
    End With
 End Sub
 Private Sub CheckBox_Click()
    Dim shp As Shape, rng As Range, checked As Boolean, wsName$, spID&
    With ActiveSheet
        Set rng = .Range(.CheckBoxes(Application.Caller).LinkedCell)
        checked = rng.Value
        spID = rng.Offset(, -1).Value
        wsName = rng.Offset(, -2).Value
        For Each shp In Sheets(wsName).Shapes
            If shp.ID = spID Then
                shp.Visible = checked
                Exit For
            End If
        Next
    End With
 End Sub
(まる2021) 2024/01/09(火) 19:10:52

 直接の回答ではありません。少し気になりましたので、コメントします。
 >シート7のF列に「1」と入力すると、その行のA列と同じ名前のオブジェクトを非表示にしたいです。
  この1を立てる作業は手作業でやるんですか?
  オートシェイプの名前を確認して、1を立てる、これって大変じゃないですか?

  1500ものオートシェイプを手でハンドリングするというのは大変過ぎませんか?
 そもそも、何を目的にして1500のオートシェイプが必要なんですか?
  オートシェイプに依らない方法はないんでしょうか?
  そこから議論をしたほうが有益なように感じます。

(xyz) 2024/01/10(水) 23:46:17


コメント返信:

[ 一覧(最新更新順) ]


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