[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のコマンドボタンの中からキャプションが』(たけ)
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 >
(隠居Z) 2023/07/16(日) 23:42:53
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
(半平太)様 (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
(たけ) 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
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.