知恵袋で、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
すみません、バグってました。。。
バグも含めヒントとなれば幸いです。