三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

EXCELのスライサーによる操作をVBAマクロで行いたい 蛇足で失敗したテスト

知恵袋で、EXCELのスライサーによる操作をVBAマクロで行いたいです。
detail.chiebukuro.yahoo.co.jp
とあったので、やってみました。
※ライブでテストして、恥をかいてみた。ぉぃぉぃ。

www.youtube.com
https://youtube.com/live/0DmaN-DWkYI
目次
00:00 キッカケの質問を紹介
00:45 1.マクロ記録で探る
02:30 1.1 SlicerCachesから探ると良いのでは?
05:56 2.単純にonやOffじゃないよなぁと思いつつ
08:10 アイテム無しの時エラー発生
09:18 2.1 蛇足、トグル切替動作はNotを使う
11:00 3.終わりの挨拶 気になったので蛇足でエラー処理ほかを追加してみた
14:22 On Error Resume Next エラー処理を入れてみた
16:40 蛇足処理の説明を熱心に・・・未来を知ってたら熱弁しなかったのに・・
19:47 蛇足処理のテストで失敗、恥をかく・・・


1.マクロ記録で探る

いつものマクロ記録で探る

    With ActiveWorkbook.SlicerCaches("スライサー_在庫数")
        .SlicerItems("0").Selected = True
        .SlicerItems("20").Selected = False
        .SlicerItems("100").Selected = False
    End With

など、オブジェクトがわかるので、

1.1 SlicerCachesから探ると良いのでは?

Sub スライサーをSlicerCachesから探る()

    'スライサーをSlicerCachesから名前指定でセット
    Dim oSlicer As Excel.SlicerCache
    Set oSlicer = ActiveWorkbook.SlicerCaches("スライサー_在庫数")

    'スライサーの下にItemが複数あるので、
    'SlicerItems(n)から抜き出す,SlicerItems.Countでアイテム数
    'nは1から始まる
    'SlicerItems(n).Value や SlicerItems(n).Selected を使ってみる
    
    Dim n As Long
    For n = 1 To oSlicer.SlicerItems.Count
        Debug.Print oSlicer.SlicerItems(n).Value, oSlicer.SlicerItems(n).Selected
    Next
    
End Sub


2.単純にonやOffじゃないよなぁと思いつつ
05:56 https://www.youtube.com/watch?v=0DmaN-DWkYI&t=356s

Sub test001_01単純にonやOffじゃないよなぁ()

    'スライサーをSlicerCachesから名前指定でセット
    Dim oSlicer As Excel.SlicerCache
    Set oSlicer = ActiveWorkbook.SlicerCaches("スライサー_在庫数")

    'SlicerItems("0")が無いと、エラーになるけど
    If oSlicer.SlicerItems("0").Selected = True Then  'Onなら
        oSlicer.SlicerItems("0").Selected = False '選択をoffに
    Else 'Offなら
        oSlicer.SlicerItems("0").Selected = True  '選択をonに
    End If
    
End Sub


2.1 蛇足、トグル切替動作はNotを使う 上のコードだと、また怒られるぞ
09:18 https://www.youtube.com/watch?v=0DmaN-DWkYI&t=558s

ON/OFF, True/False の トグル切替動作は、
VBAなら Not演算子を使えと言われるなぁ。

Sub test001_02トグル切替動作はNotを使え()

    With ActiveWorkbook.SlicerCaches("スライサー_在庫数")
        '現在値のNotをセットするとトグル操作になるよ
        .SlicerItems("0").Selected = Not .SlicerItems("0").Selected
    End With

End Sub

3.終わりの挨拶

なんか、違うような気もしつつ、
※在庫0とアリ全てを切り替えたいなら、間違えた回答かも・・・

気になったので、蛇足回答:

14:22 https://www.youtube.com/watch?v=0DmaN-DWkYI&t=862s
On Error Resume Next エラー処理を入れてみた

16:40 https://www.youtube.com/watch?v=0DmaN-DWkYI&t=1000s
蛇足処理の説明を熱心に・・・未来を知ってたら熱弁しなかったのに・・

19:47 https://www.youtube.com/watch?v=0DmaN-DWkYI&t=1187s
蛇足処理のテストで失敗、恥をかく・・・

Sub test002_在庫0とアリ全てを切り替える()

    'スライサーをSlicerCachesから名前指定でセット
    Dim oSlicer As Excel.SlicerCache
    Set oSlicer = ActiveWorkbook.SlicerCaches("スライサー_在庫数")

    '在庫0のOn/Offを保存
    Dim bFLG As Boolean   'True/False
    On Error Resume Next
    bFLG = oSlicer.SlicerItems("0").Selected  '現在の状態を保存
    If Err.Number <> 0 Then  '↑でエラーかチェック
        MsgBox "在庫0がありません", vbExclamation
        Exit Sub
    End If
    On Error GoTo 0
    
    'ループで全てのチェックを付ける、外す
    Dim n As Long
    For n = 1 To oSlicer.SlicerItems.Count
        If oSlicer.SlicerItems(n).Value = "0" Then '在庫"0"か、それ以外か判断
            oSlicer.SlicerItems(n).Selected = Not bFLG '反対をセット
        Else  'その他の在庫数 状態を変える
            oSlicer.SlicerItems(n).Selected = bFLG '保存状態をセット※↑上と違う
        End If
    Next

End Sub


すみません、バグってました。。。

バグも含めヒントとなれば幸いです。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)