[[20230716075008]] 『複数のコマンドボタンの中からキャプションが』(たけ) ページの最後に飛ぶ

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

 

『複数のコマンドボタンの中からキャプションが』(たけ)

VBA初心者になります。
1項目につき3列、50項目ある(在庫管理シート)があり、別シート(型式.部品情報設定)に50項目のコマンドボタン配置をして、ボタン押下で必要な項目の表示非表示を行い、列を表示している時はキャプション"非表示"に、列を非表示の時は
"表示"にするコードをコマンドボタン21〜70まで作りました。また、ユーザーフォームのコマンドボタンにて1項目3列のうち重要な3列目のみ全ての項目に対して一括で表示非表示となるコードを作りました。
そこで、(型式.部品情報設定)シートのコマンドボタン(21〜70)の中でいくつか押下し、列を非表示(コマンドボタンのキャプションは"表示")にした状態で、ユーザーフォームのコマンドボタンを押下して一括で非表示→表示と切り替えると、(型式.部品情報設定)シートで非表示に設定した列も、一括表示の際表示されてしまいました。
そこで、ユーザーフォームのコマンドボタン(一括表示非表示)のコードの後に、(型式.部品情報設定)シートで列が非表示(コマンドボタンのキャプション"表示")のマクロを再度実行されるように以下のコードを追加してみたのですが、うまくいきません。
おそらく初歩的な部分で間違いがあるように思います。

説明が分かり辛いと思いますが、ご教授をよろしくお願いいたします。

Dim i As Integer
For i = 21 To 70
If Worksheets("型式.部品情報設定").Controls("CommandButton" & i).Caption = "表示" Then
Call Worksheets("型式.部品情報設定").("CommandButton" & i)_Click
End If
Next i

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


他の詳細はよく存じ上げませんが
プロシジャーを呼びだすだけでしたら
Application.Run
でしたら
オブジェクト名.プロシジャー名、パラメータ
とかで
行けるかもしれませんね。^^;
でわ
m(_ _)m

(隠居Z) 2023/07/16(日) 23:42:53


失礼致しました。
アクティブxのコマンドボタンならパラメータは有りませんでしたね^^;

 Option Explicit
Sub OneInstanceMain()
    Dim i As Long, ctx
    For i = 1 To 2
        ctx = "Sheet1.CommandButton" & i & "_Click"
        Application.Run ctx
    Next
End Sub
(隠居Z) 2023/07/16(日) 23:58:15

 >Dim i As Integer
 >For i = 21 To 70
 >If Worksheets("型式.部品情報設定").Controls("CommandButton" & i).Caption = "表示" Then
 >Call Worksheets("型式.部品情報設定").("CommandButton" & i)_Click
 >End If
 >Next i
  
 こんな感じでいけるかも知れない。(簡易テストではOKだった)
    ↓
     Dim i As Integer
     Dim shps As Shapes

     Set shps = Worksheets("型式.部品情報設定").Shapes

     For i = 21 To 70
         If shps(i).DrawingObject.Object.Caption = "表示" Then
             shps(i).DrawingObject.Object.Value = True
         End If
     Next i

 ※DrawingObjectは非表示メンバーに落ちていて、インテリセンスに出てこなかったです。(こりゃ分からん)

(半平太) 2023/07/17(月) 09:55:47


 Commandボタンだけじゃないかも知れないので修正します。(これでも荒っぽいかも知れない)

 Sub test()
     Dim i As Integer, k As Long
     Dim shps As Shapes, shp As Shape

     Set shps = Worksheets("型式.部品情報設定").Shapes

     For k = 1 To shps.Count
         Set shp = shps(k)

         For i = 21 To 70
             If shp.Name = "CommandButton" & i Then
                 If shp.DrawingObject.Object.Caption = "表示" Then
                     shp.DrawingObject.Object.Value = True
                     Exit For
                 End If
             End If
         Next i
     Next k
 End Sub

 後刻、上のレスは削除します。

(半平太) 2023/07/17(月) 12:54:27


 こんな書き方もあると思います。サンプルです。
 Sub test()
     Dim k As Long
     For k = 1 To 2
         With ActiveSheet.OLEObjects("CommandButton" & k).Object
             If .Caption = "aaa" Then
                 .Value = True 'クリックと同等
             End If
         End With
     Next
 End Sub
 テスト用であり、ActiveSheetを推奨する意図はありません。念のため。

(xyz) 2023/07/18(火) 06:04:10


(隠居Z)様
 (半平太)様
(xyz)様
丁寧にお教えくださり、本当にありがとうございました。
皆様にお教えいただいた内容をもとに色々試行錯誤したのですが、内容を理解するところからも時間がかかり、なかなかうまく行かず、悩んでおりましたが、("型式.部品情報設定")シートの項目ごとの50個配置したコマンドボタンで、非表示の場合、(在庫管理シート)の対象列の背景を変えることで、ユーザーフォームからの一括表示切替で背景色が任意色の場合非表示にするコードを埋め込むことでうまく行きました。

Dim v As Range

    For Each v In Range("AF44:FG44")

        If v.Interior.ColorIndex = 15 Then
           Columns(v.Column).Hidden = True
        Else
      End If
    Next

最初の私の文章がもっと正確で伝わりやすければ良かったのですがほんとに申し訳ありませんでした。
またよろしくお願いいたします。

(たけ) 2023/07/18(火) 20:39:34


本筋と全く関係のないところですが何点か。

■1
↓について

 >皆様にお教えいただいた内容をもとに色々試行錯誤したのですが、
 >内容を理解するところからも時間がかかり、なかなかうまく行かず、
 >悩んでおりましたが、("型式.部品情報設定")シートの項目ごとの
 >50個配置したコマンドボタンで、非表示の場合、(在庫管理シート)の
 >対象列の背景を変えることで、ユーザーフォームからの一括表示切替で
 >背景色が任意色の場合非表示にするコードを埋め込むことでうまく行きました。

 (1)当初のコードのように対象シートを明確にしたほうがよい
 (2)[Columns(v.Column)]は回りくどい感じする

と思いました。
また、「ColorIndex = 15」はわかっていてそうしているのであれば別ですが、そうでなければ参考リンク先を一読されることをお勧めします。

 【参考】
http://officetanaka.net/excel/vba/graph/24.htm

■2
当初のコードはインデントがついていませんし、「2023/07/18(火) 20:39:34」に提示されたコードもよく見るとインデントが不自然です。
投稿時にずれただけかもですが、そうでなければインデントをつける際に意味合いを持たせたほうが良いです。

■3
ということを踏まえると私なら↓のようにすると思います。

    Sub 抜粋()
        Dim MyRNG As Range

        With Worksheets("型式.部品情報設定").Range("AF44:FG44")
            .EntireColumn.Hidden = False 'いったん非表示を解除

            For Each MyRNG In .Cells
                If MyRNG.Interior.ColorIndex = 15 Then '[Colorプロパティの使用を検討]
                    MyRNG.EntireColumn.Hidden = True 'EntireColumnプロパティを使えばよい
                'Else ←いらない
                End If
            Next MyRNG
        End With
    End Sub

なお、推奨する意図はありませんが、IF文のところは↓のようにしても動作します。

 If MyRNG.Interior.ColorIndex = 15 Then MyRNG.EntireColumn.Hidden = True
 ※↑の書き方の場合「End If」をつけてはだめです。

(もこな2) 2023/07/18(火) 23:02:42


(もこな2)様
>丁寧にアドバイスを頂きありがとうございます。
>ド素人なものでコードの使い方が分からず
>見苦しいところ丁寧にお教えいただき感謝します。
>←この記号も知りませんでした(汗)
>改めて勉強させていただきます。

(たけ) 2023/07/19(水) 09:20:34


>改めて勉強させていただきます。
何故「>」を付けたのでしょう?

(taket) 2023/07/19(水) 09:25:47


 解決したのであれば結構なんですが、
 コマンドボタンは使用しないように変更したということですか?
 話の大枠が変わったということですか?

 いや、コマンドボタンは使います、ということなら、
 今回、解決したというマクロで、列の表示状態を変えると、
 コマンドボタンのキャプション(表示、非表示)が、
 実際の表示状態と不整合になってしまわないのですか?

 表示状態の変更(及びキャプションの変更)は、コマンドボタンに委ねることにしたので、
 外部から、そのコマンドボタンを実行させたい、という話ではなかったのですか?
 何か釈然としません。
(xyz) 2023/07/19(水) 10:08:45

 サンプルが通じなかったようです。実際に即して書くと、こうです。

 Sub test()
     Dim ws    As Worksheet
     Dim k     As Long
     Set ws = Worksheets("型式.部品情報設定")

     For k = 21 To 70
         With ws.OLEObjects("CommandButton" & k).Object
             If .Caption = "表示" Then
                 .Value = True    'クリックしたのと同等の効果
             End If
         End With
     Next
 End Sub

 # 私としては、質問に答えたので、これで一応の区切りをつけました。
 # もうその話は終わりました、ということなら、捨ててください。

(xyz) 2023/07/19(水) 10:25:12


(xyz)様 ありがとうございます。
なんとも説明がうまくできません。申し訳ありません。
型式.部品情報設定シートでは以下のようにコマンドボタンを項目ごとにたくさん作りました。

Private Sub CommandButton38_Click()

Dim C As Range
Dim D As Range

Set C = Worksheets("型式.部品情報設定").Cells(12, 15).Resize(1, 7).Offset(17, 0)
Set D = Worksheets("在庫管理シート").Range("AF:AH").Offset(0, 51)

If D.EntireColumn.Hidden = False Then
D.Interior.ColorIndex = 15'(追加)
D.EntireColumn.Hidden = True
Worksheets("型式.部品情報設定").CommandButton38.Caption = "表示"
C.Interior.ColorIndex = 15
Else
D.Interior.ColorIndex = 0'(追加)
D.EntireColumn.Hidden = False
Worksheets("型式.部品情報設定").CommandButton38.Caption = "非表示"
C.Interior.ColorIndex = 0
End If

End Sub

アドバイスいただいていろいろと試しましたが、ユーザーフォームで一括表示させると
部品情報ページで表示(在庫管理シートでは表示されていない)になっている項目も
表示されてしまい・・・
どうしようかと悩んで上のコードの(追加)の部分で列に色を付けて
一括表示の際これを下のコードで非表示とした次第です。

Dim v As Range

    For Each v In Range("L44:FG44")

        If v.Interior.ColorIndex = 15 Then
           V.EntireColumn.Hidden.Hidden = True
        End If
    Next

(たけ) 2023/07/19(水) 21:18:05


 最初の質問の答えになっていると思ったが違うのですか?
 よくわからないことを書かれて困った、みたいな発言はいかがなものですか?
 それでサンプルではなく、実際に合わせたものも書いたわけですが、
 最初の質問に対する回答として失格だったのですか?
(要望事項には応えているはずですが。尤も半平太さんの方針そのままですけど。)

 また、2023/07/19(水) 10:08:45で書いた懸念(キャプションとの不整合の可能性)にも回答はなかった。
 (ご自分の方針変更の説明を延々とされただけ。)

 何人もの回答があったのに、あっさり別の前提でやりました、というのはいかがなものかと。
 話が通じないようなので、これ以上の回答は結構です。
(xyz) 2023/07/19(水) 22:42:40

 言ってしまえばOn/Offの切替なんだから、チェックボックスとかトグルとか使った方が
 作るの人にも使う人にも易しかったのではないかと思いました。(一括処理に関してはボタンでしょけど)
 背景色で判断しないといけないくらいなら... ねぇ。

 わざわざCommandButton使ってる時点で「それは言いっこなし前提」なのかと思って黙ってましたが ^^;

(白茶) 2023/07/20(木) 09:42:51


コメント返信:

[ 一覧(最新更新順) ]


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