[[20210831142310]] 『リボンに設定されたアイコンをマクロで変更する』(ゼブラ) ページの最後に飛ぶ

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

 

『リボンに設定されたアイコンをマクロで変更する』(ゼブラ)

個人用マクロに「Alt押しながら参照元セルをクリックした場合参照先にジャンプする」マクロの作成をしようと考えています
この機能が有効になっているかどうかのステータス表示をそのマクロが割り当てられたリボンアイコンの変更で行おうと考えているのですが
クリックしたリボンアイコンの取得方法が分かりません
どなたか取得方法と変更方法わかる方おられませんか?

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


http://suyamasoft.blue.coocan.jp/Ribbon/ReverseResolution/getImage/index.html
(参考) 2021/08/31(火) 16:07

 あれもこれも言われても全部出来るか自信ないが...^^;

 標準モジュールに入れて、Alt_Key 押してみてください。
 実行したら、最後はEscキーで終了してくださいね。

 Option Explicit

 #If Win64 Then
    Declare PtrSafe Function _
    GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
 #Else
    Declare Function _
    GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
 #End If

 Function EscPress() As Integer
    Const KEY_PRESSED = -32768
    EscPress = (GetAsyncKeyState(vbKeyEscape) And KEY_PRESSED) = KEY_PRESSED
 End Function
 Function AltPress() As Integer
    Const KEY_PRESSED = -32768
    AltPress = (GetAsyncKeyState(vbKeyMenu) And KEY_PRESSED) = KEY_PRESSED
 End Function

 Sub LoopStart()

        Dim Alt_Key As Integer

                MsgBox "キー入力ループ開始"
 Do
        If EscPress = True Then Exit Do
                DoEvents

        If AltPress = True Then
                Alt_Key = AltPress + 19 ' 実数判定値 = 18
                Debug.Print AltPress + 19
                MsgBox "Alt キーが押されました'"
        End If
 Loop
                MsgBox "キー入力ループから抜け出しました"
 End Sub

 thom さん こんにちは...お世話になりま〜す。
 お考えをお借りしてま〜す。^^;

 https://thom.hateblo.jp/entry/2019/03/10/125326

 LIC さん すいませ〜ん。

 いつも参考にさせていただいておりま〜す。
 ありがとうございます。

 https://liclog.net/getasynckeystate-function-vba-macro-catia-v5/

 (ゼブラ)さんへ

 後の操作は、只今検討中なのでここまで出来たらご連絡ください。

(あみな) 2021/08/31(火) 16:54


お二方ありがとうございます
やっぱりcustomUIいじる感じになりますか・・・
あれ参考になるもの少ないんですよね・・・参考のサイト見ながら解釈します

あなみさんのはジャンプするイベントの設定方法ですかね
はじめは各シートにWithEventsでイベント設定すればいいやと思ってましたが
ほかの処理しないならそっちでもいいかもですね
(ゼブラ) 2021/08/31(火) 17:06


 普通に↓のこれとWithEventsでいいのかもしれませんが

  SendKeys "%"

 最初だから いろんな方法を検討してみようかなと

 リボンはちょっとよ〜わかりません
 こんなかんじ?

  With Application

        .DisplayFormulaBar = False
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
        .ShowDevTools = False
    End With

  With Application

        .DisplayFormulaBar = True
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
        .ShowDevTools = True
    End With

 頑張りましょう^^

(あみな) 2021/08/31(火) 17:22


 たたき台ができました。

 リボンアイコンについては配慮はしていません。
 簡単に言うと、Alt_Keyを押さないとなにもできません。

 では流れです。

 1.Workbook_Open

   WithEvents 設定

 2.コマンドボタンクリック(フォームコントロール)

   LoopStart

 3.BeforeRightClick

   UserForm を開く  オブジェクト名 ( OperationForm )

 4.Altキーを押します。

   UserForm の Label1.Caption = "0" 初期値が、Alt_Key ' 実数判定値 = 18
   に切り替わって判定します。

 5.参照先にジャンプする

   >個人用マクロに「Alt押しながら参照元セルをクリックした場合参照先にジャンプする」
   で詳細が記載されてないので選択型にしました。

   OptionButton を3個設置

 6.OptionButton のいずれかを選択する

   好きなシートに飛んでってください。(笑)

   ※OptionButton と Altキーが押されてないと、
     MsgBox にて案内がでます。

 7.通常動作の場合は、Escキーを解除

   どうしようか検討中

 ▼ThisWorkBookモジュール

 Private Sub Workbook_Open()
    Call ShEv_EventGet
 End Sub

 ▼標準モジュール宣言部

 '----- Class Event -----
 Public ShEv(1 To 3) As EventGet

 ▼標準モジュール

 Sub OperationFormUp_Click()
    OperationForm.Show vbModeless
 End Sub

 Sub ShEv_EventGet()
    Dim i As Long
    For i = 1 To 3
        Set ShEv(i) = New EventGet
        Set ShEv(i).TargetSheet = ThisWorkbook.Sheets(i)
    Next
 End Sub

 ▼ユーザーフォームモジュール

 Private Sub UserForm_Initialize()
    Label1.Caption = "0"
 End Sub

 Private Sub CommandButton1_Click()

    Dim i As Long
    Dim OptionAry As Variant
    Dim Jump As Boolean
    OptionAry = Array(OptionButton1, OptionButton2, OptionButton3)
    Jump = False

    For i = 0 To UBound(OptionAry)
            If OptionAry(i).Value Then
                Jump = True
                    If Jump And Label1.Caption = 18 = True Then
                            With Application
                                    Select Case i
                                                Case 0
                                                        .Goto Workbooks("実験.xlsm").Sheets(1).Range("A1"), True
                                                Case 1
                                                        .Goto Workbooks("実験.xlsm").Sheets(2).Range("A1"), True
                                                Case 2
                                                        .Goto Workbooks("実験.xlsm").Sheets(3).Range("A1"), True
                                    End Select
                            End With
                    Else
                                MsgBox " その操作は禁止されています。マクロ作成者に聞いてください。"
                                SendKeys "{ESCAPE}"
                                Application.Quit
                    End If
            Exit For
            End If
    Next

 End Sub

 ▼クラスモジュール

 Private WithEvents TargetSh As Worksheet
 Public Property Set TargetSheet(ByVal vObject As Worksheet)
    Set TargetSh = vObject
 End Property
 Private Sub TargetSh_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

    Dim RetMsg As VbMsgBoxResult
    Cancel = True

    If Not Intersect(Target, Range("A1:H100")) Is Nothing Then
        If UserForms.Count = 0 Then
                    OperationForm.Show vbModeless
        Else
                    RetMsg = MsgBox(" 既に、フォームは開かれています。キャンセルするとフォームを閉じます。" & vbCrLf & _
                    " OKボタンを押すと、継続してフォームを利用できます。", vbOKCancel + vbInformation, Title:="INFOMATION")
        End If
            Select Case RetMsg
                    Case vbOK
                    Case vbCancel
                                RetMsg = MsgBox(" 開かれているフォームを閉じます。", _
                                vbOKOnly + vbInformation, Title:="INFOMATION")
                        For Each OperationForm In UserForms
                                Unload OperationForm
                        Next
            End Select
    End If
 End Sub

 >この機能が有効になっているかどうかのステータス表示をそのマクロが割り当てられたリボンアイコンの変更で行おうと考えているのですが
クリックしたリボンアイコンの取得方法が分かりません

 >どなたか取得方法と変更方法わかる方おられませんか?

 (ゼブラ)さんが、調べた有効な方法を記載した
  URL を貼り付けしといてください。

 明日、閲覧してみます。

(あみな) 2021/08/31(火) 23:05


わざわざありがとうございます
しかし私は汎用的に使用できるよう個人用マクロ(アドインといえば伝わりやすいでしょうか?)に機能を割り当てたく思っています
リンク先というのも大層なことは考えていなくてRange.DirectPrecedentsで取得できれば良い程度に考えています

リボンカスタマイズについては参考さんのURLやQiitaでcustomUIのことを調べれば必要最低限のことはわかると思います
Excelブックを分解したりしないとなのでここでは書きません(めんどくさい)

customUIの要素や属性のリファレンスがある場所を知っていればそこに誘導したりするんですが...
(ゼブラ) 2021/09/01(水) 08:41


 >クリックしたリボンアイコンの取得方法

 何のアイコンなのかをボタンから直接取得する方法は存じませんが、
 使用するアイコンイメージは決まってる訳ですよね? (今回のケースだとOn/Offの2種類?)
 PictureだったりFaceIdだったりImageMso文字列だったりbmpファイルだったり...

 ボタンから取るんじゃなくて、別途、広域変数にでも状態を覚えさせておけば
 それで判断して変更できませんか?

 Private btnState As Boolean
  に状態を覚えさせる

 GetImageコールバックの中で
 ・該当ボタンの引数imageにbtnStateの状態に応じた値(ImageMso文字列またはIPictureDisp型)を代入
 OnActionの中で
 ・目的のマクロを実行
 ・btnStateを変更してInvalidateControlを呼出す(→GetImageコールバックが発動)

 って感じで。

(白茶) 2021/09/01(水) 10:23


 >ステータス表示をそのマクロが割り当てられたリボンアイコンの変更で行おう
 リボンのトグルボタンを使うのではだめでしょうか

 >Alt押しながら参照元セルをクリック
 Alt+セルクリックだと「リサーチ」の機能が立ち上がって、SelectionChangeが発生しません
 リサーチをOFFにしてイベントをつかむ方法はなにか考えてますか

 Alt+セルクリックではなくて、リボンのボタンクリックで
  Application.Goto ActiveCell.DirectPrecedents
 すればいいと思いますが、Alt+クリックにこだわる必要ありますか?

 DirectPrecedentsが複数のセル領域の場合、どこのセルにジャンプしますか?
(´・ω・`) 2021/09/01(水) 12:01

白茶さんのは参考さんのと似たような感じですね
あちらはボタンをトルグにしてそこから拾ってますが

リボンのトグルボタンを使うのではだめでしょうか トルグでいいんですけどリボンのユーザー設定からトルグぽいのがなかったんで

Alt+セルクリックだと「リサーチ」の機能が立ち上がって、SelectionChangeが発生しません それにぶち当たってもうAlt押しながらじゃなくてもいいかなと思い始めてます
誤クリックいやですけど

リボンのボタンクリックで 導線の問題ですね、いちいちリボンまでマウス運ぶのがめんどくさい

DirectPrecedentsが複数のセル領域の場合、どこのセルにジャンプしますか? 考えてなかったですね・・・スルーするかcells(1)にでも飛びますか

そしていろいろやってたんですけどPERSONAL.XLSBはcustomUI設定できないのかな・・・
他ではうまくいくのにこいつだけエラー出る・・・
そしてcustomUIはブックの設定だからもしやPERSONAL.XLSBに設定したところでUIのボタン使えないのでは・・・
(ゼブラ) 2021/09/01(水) 12:24


 トグルボタンあるようですよ
 http://suyamasoft.blue.coocan.jp/Ribbon/ReverseResolution/toggleButton/index.html

 >そしていろいろやってたんですけどPERSONAL.XLSBはcustomUI設定できないのかな
 私も試しましたが、できているように思います
(´・ω・`) 2021/09/01(水) 12:43

 (てか今更ですけど、ショートカットの『Ctrl + ]』『Ctrl + [』で充分なんじゃないかって気がしてました...)

(白茶) 2021/09/01(水) 13:00


 つかったことなかったので知らなかったですが、 ショットートカットあるんですね。
(´・ω・`) 2021/09/01(水) 13:19

 Ctrl + [          ・・・選択範囲の数式が直接参照するセルを選択
 Ctrl + ]          ・・・選択範囲のセルを直接参照する数式が入力されたセルを選択

 Ctrl + Shift + [  ・・・選択範囲の数式が直接または間接的に参照するすべてのセルを選択
 Ctrl + Shift + ]  ・・・選択範囲のセルを直接または間接的に参照する数式が入力されたすべてのセルを選択

 なんだそうですよ。
(白茶) 2021/09/01(水) 13:23

> トグルボタンあるようですよ
cutomUIで設定できるのはわかるんですがコマンドを設定するボタン一覧にないんであれこれしてるんです
http://www4.synapse.ne.jp/yone/excel2013/excel2013_macro_ribbon.html#command

>私も試しましたが、できているように思います
まじっすか
いろんな文字コード試しましたけどファイルが破損するんですよね・・・
ツール入れられないんでやりかたはほぼ↓
https://thom.hateblo.jp/entry/2018/06/13/043244

>(てか今更ですけど、ショートカットの『Ctrl + ]』『Ctrl + [』で充分なんじゃないかって気がしてました...)
あぁもうこれ最高ですね・・・ctrl+[の物理ボタンが欲しいくらいです・・・
(ゼブラ) 2021/09/01(水) 13:26


「個人用マクロブック」の PERSONAL.XLSB へ飛んでくイメージだったんですが

 Application.Goto "Module1.プロシージャ名"

 こんなかんじではないのか? ^^;

 

(あみな) 2021/09/01(水) 13:54


 >他ではうまくいくのにこいつだけエラー出る・・・
 XLSB形式なければうまくいくんですか?
 >いろんな文字コード試しましたけどファイルが破損するんですよね・・・

 XLSMで作ってうまくいってからXLSB形式で保存しなおしたらどうなりますか?
(´・ω・`) 2021/09/01(水) 14:48

 >cutomUIで設定できるのはわかるんですがコマンドを設定するボタン一覧にないんであれこれ
 これはいったい何をしようとしてるのか理解できないのですが
(´・ω・`) 2021/09/01(水) 14:56

 [数式]タブの[ワークシート分析]グループの後にカスタムグループを追加してます。
 トグルボタンのイメージは暫定で、ニコちゃん(HappyFace)です
 トグルボタンをONにすると、ワークシートの右クリックでジャンプします。
 (右クリックメニューはCancelしてます)

 --------- customUI14.xml ---------------
 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <ribbon>
        <tabs>
            <tab idMso="TabFormulas">
                <group id="customGroup" label="Custom Tools"  insertAfterMso="GroupFormulaAuditing" autoScale="true">
                    <toggleButton id="ジャンプ" label="参照元セルにジャンプ" onAction="SW_JumptoDependence" size="large" imageMso="HappyFace"/>
                </group>
            </tab>
        </tabs>
    </ribbon>
 </customUI>

 ---------- 標準モジュール -------------
 Private Sub SW_JumptoDependence(control As IRibbonControl, pressed As Boolean)
     ThisWorkbook.SW_Jump = pressed
 End Sub

 ---------- ThisWorkbookモジュール -------------
 Public SW_Jump As Boolean

 Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
   If Not SW_Jump Then Exit Sub

   Cancel = True
   Application.EnableEvents = False
   On Error Resume Next
      Application.Goto Target.DirectDependents
   On Error GoTo 0
   Application.EnableEvents = True

 End Sub
(´・ω・`) 2021/09/01(水) 15:45

 他のブックで使いたいんですよね。
 ならこうかな
 ThiwWorkBookの isAddin プロパティはTrueにしてください。 

 ---------- ThisWorkbookモジュール ------------- 
 Private WithEvents App As Application
 Public SW_Jump As Boolean

 Private Sub Workbook_Open()
   Set App = Application
 End Sub

 Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
   If Not SW_Jump Then Exit Sub

   Cancel = True
   Application.EnableEvents = False
   On Error Resume Next
      Application.Goto Target.DirectDependents
   On Error GoTo 0
   Application.EnableEvents = True

 End Sub
(´・ω・`) 2021/09/01(水) 15:51

 >XLSB形式なければうまくいくんですか?
%USERPROFILE%\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLSB
↑は上手くいかなくてデスクトップに新たに作ったりしたxlsxやxlsmならうまくいきますね
このファイルにこだわらなきゃいいだけですがシート全部非表示にする方法調べますか・・・

 >XLSMで作ってうまくいってからXLSB形式で保存しなおしたらどうなりますか?
PERSONAL.XLSBはファイルが破損して保存できないですね
他は可能です

 >これはいったい何をしようとしてるのか理解できないのですが
もともと↓の手順でボタンにマクロ割り当ててそのボタンにステータス表示させられたらなぁと思ってたんです
http://www4.synapse.ne.jp/yone/excel2013/excel2013_macro_ribbon.html#command

下のソースはこれから試してみますありがとうございます
(ゼブラ) 2021/09/01(水) 17:27


 >シート全部非表示にする方法
 アドイン(XLAM)にすればいいのでは
(´・ω・`) 2021/09/01(水) 20:02

そのままじゃPERSONAL.XLSB以外でも動かなかったんで以下にしたらPERSONAL.XLSB以外で動くことを確認しました

なるべく1ファイルにまとめたかったですけどしたないですね・・・
ctrl+]か2ファイルで行きます

  <ribbon>
    <tabs>
      <tab idQ="nsShared:tabShared01" label="Sample">
        <group idQ="nsShared:grpShared" label="ユーザー補助">
			<toggleButton id="ジャンプ" label="参照元セルにジャンプ" onAction="SW_JumptoDependence" size="large" imageMso="HappyFace"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
(ゼブラ) 2021/09/02(木) 09:31

 2007までは、customUI.xml 
 2010以降は、customUI14.xml
 です。
 中身もちょっと違います。

 >1ファイルにまとめたかったですけどしたないですね・・・
 なぜ2ファイルになるんですか?
(´・ω・`) 2021/09/02(木) 09:45

コメント返信:

[ 一覧(最新更新順) ]


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