メニュー用のシートと、人物名のシートで構成されているブックがあります。
(例)
[メニュー] [鈴木] [佐藤] [加藤] [佐々木] [青木] [管理用]
メニューのシートには、
[鈴木] [佐藤] [加藤] [佐々木] [青木] [管理用]というコマンドボタンが設置されていて、
[鈴木] ボタンを押すと、[鈴木] シートのみ表示、他のシートは非表示
[管理用]ボタンを押すと、全シートが表示するようになってます。
人が増減すると、メニューのボタンを作り直さないといけないのですが、
ブック内の全シート名のボタンを自動的に生成するなんてできないでしょうか?
その先の課題は、
・増えた場合のマクロ
・ボタンに割り当てるマクロ
等がありますが、手動で出来る範囲なので一番手間のかかるボタン生成がまず出来たら嬉しいです。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
No.5です
すみません。。。(ご覧いただいて、お解りと存じますが)
MsgBox "登録がないので管理者に連絡してください"は要りませんです
適切な個所では無いのですが、キャンセルボタン対応箇所になります
For Each ws In Worksheets 以下重複部分は不要です。。。
コピペミスです。
修正訂正が多く申し訳ありません。
No.6
- 回答日時:
No2です。
>管理用というシートも存在します。
文字でシートを判断するようにしてしまったので、簡単な修正としては
Const Manage = "管理用"
の部分を
Const Manage = "[ 管理用 ]"
とでも変更すれば、そのままでも(一応)動作すると思います。
(シート名に[ 管理用 ]がないことが条件)
ついでながら、
>他人のシートが見れないようにするとなると、難しそうですね。。。
ブックのオープン時には、必ず「メニュー」のシートのみ表示されるようにしておけば可能でしょう。
ただし、現状はボタンを押せば表示されてしまうので、補足にあるようにパスワードなどが必要になるかと。
>個別にパスワードを設定したい場合だとやはり人数分のモジュールを用意する必要がありますよね?
どこかにパスワード表を作成しておけば、同じコードで処理することは可能です。
・表をコード内に記述して、コードを非表示にしておく
・パスワードシートを作成して、シートに非表示の保護をかけておく
等が考えられるかと。
ご質問とは関係なくなりますが、補足等の雰囲気から想像してみると・・
会社などでユーザーがきちんと管理されている環境なら、VBAでログインユーザ名を取得して、最初からその人のシートのみを表示することも可能です。
こちらの方法であれば、パスワード等も不要になるでしょうし、ユーザの操作の手間も省けると考えられます。
(非登録者の場合は、何も表示されないとかも可能)
とは言え、他の人が見られないようにしたいのなら、ブックを個人別に分けてしまった方が簡単かも知れません。
各ブックの内容を集めるのは、管理者用のブックにクエリを設定しておけばそのまま集計できますので。
(VBAを用いても良いですけれど・・)
No.5
- 回答日時:
>No.3の返信について
佐藤さんが鈴木さんのシートを見れないようにするためです。
.Visible = False は、シートタグ右クリックの再表示で表示できるのではないかと思います。(処理をしていれば表示できないかも)
なので .Visible = xlVeryHidden で 設定した方が良いです。
>個別にパスワードを設定したい場合だとやはり人数分のモジュールを用意する必要があります
Worksheets("管理用")を活用しましょう
管理用シートにユーザー名とパスワードを記録しておけば
例えば、 管理用シート C1:C10 にユーザー名、右横のD列にパスワードを入力してある場合。
Sub Worksheet_Hidden()
Dim ws As Worksheet
Dim btn_Name As String
Dim pass As String
Dim UserName As Range
btn_Name = ActiveSheet.Buttons(Application.Caller).Text
pass = InputBox("パスワードを入力してください")
Set UserName = Worksheets("管理用").Range("C1:C10").Find(btn_Name)
If Not UserName Is Nothing Then
If UserName.Offset(, 1) <> pass Then MsgBox "パスワードが違います": Exit Sub
Else
MsgBox "登録がないので管理者に連絡してください": Exit Sub
End If
For Each ws In Worksheets
If ws.Name <> "メニュー" And ws.Name <> btn_Name Then
ws.Visible = xlVeryHidden
Else
ws.Visible = True
End If
Next
For Each ws In Worksheets
If ws.Name <> "メニュー" And ws.Name <> btn_Name Then
ws.Visible = xlVeryHidden
Else
ws.Visible = True
End If
Next
End Sub
これでこのプロシージャのみで(非表示などは)ユーザーに対応できると思います。
注意:Application.Callerを使用していますので ボタンからの
実行以外は1004エラー です
ちなみにアクセス時に自動でPC名やログイン名を取得して
アクセス制限や新規登録させるような方法も出来ます。
これは、機会があれば、試すのも面白いかも知れません。
No.4
- 回答日時:
#3 失礼
Sub Worksheet_Hidden()
Dim ws As Worksheet
Dim btn_Name As String
btn_Name = ActiveSheet.Buttons(Application.Caller).Text
For Each ws In Worksheets
If ws.Name <> "メニュー" And ws.Name <> btn_Name Then
ws.Visible = xlVeryHidden
Else
ws.Visible = True
End If
Next
End Sub
Else ws.Visible = True を つけ忘れました
No.3
- 回答日時:
こんにちは
すでに回答があるので参考程度で
・増えた場合のマクロ
・ボタンに割り当てるマクロ
については、
>[鈴木] ボタンを押すと、[鈴木] シートのみ表示、他のシートは非表示
のコードを以下のように
Sub Worksheet_Hidden()
Dim ws As Worksheet
Dim btn_Name As String
btn_Name = ActiveSheet.Buttons(Application.Caller).Text
For Each ws In Worksheets
If ws.Name <> "メニュー" And ws.Name <> btn_Name Then
ws.Visible = xlVeryHidden
End If
Next
End Sub
他のコードもApplication.Callerを基に作成します。
ボタン追加とマクロ登録は以下のような感じ・・
不明確な要素もあるので追加のみ
トリガーはボタンが安全ですが、Workbook_NewSheet イベントを使う事も出来ると思います。制御系は必須
Sub sample()
Dim ws As Worksheet
Dim btn As Button
Dim n As Integer, flag As Boolean
Dim ws_name(), r As Range
ReDim ws_name(1 To Worksheets.Count)
For Each ws In Worksheets
If ws.Name <> "メニュー" Or ws.Name <> "" Then
n = n + 1
ws_name(n) = ws.Name
End If
Next
Worksheets("メニュー").Activate
For Each ws In Worksheets
For Each btn In ActiveSheet.Buttons
If ws.Name = btn.Caption Then flag = True: Exit For
Next
If flag = False And ws.Name <> "メニュー" And ws.Name <> "管理用" Then
For Each r In Range("B1:F2")
For Each btn In ActiveSheet.Buttons
If btn.TopLeftCell.Address = r.Address Then n = 100: Exit For
Next
If n <> 100 Then Set r = r: Exit For
n = 0
Next
With ActiveSheet.Buttons.Add(r.Left, r.Top, _
r.Width, r.Height)
.OnAction = "Worksheet_Hidden"
.Characters.Text = ws.Name
End With
End If
flag = False
Next
End Sub
Range("B1:F2")の範囲に追加して行きます(範囲拡張可)
できました、すごいです。
まず非表示にする部分ですが
一つのソースでボタンの名称とシート名を突合してるから1ソースで賄えるんですね。
ちなみに私は以下の様なマクロを使用していました。
これを全員分のモジュールを作って、True、Falseだけ名前毎に設定してます。なので人数分の標準モジュールが必要です。
鈴木さんがボタンを押したときのソースです。
------------------------------------------------------------
Sub シート表示制限_鈴木()
Dim sh As Worksheet
Dim pass As String
pass = InputBox("パスワードを入力してください")
If pass <> "pass" Then
MsgBox "パスワードが違います"
Exit Sub
Else
Worksheets("鈴木").Visible = True
Worksheets("佐藤").Visible = False
Worksheets("加藤").Visible = False
Worksheets("佐々木").Visible = False
Worksheets("青木").Visible = False
Worksheets("管理用").Visible = False
End If
Worksheets("メニュー").Select
End Sub
------------------------------------------------------------
佐藤さんが鈴木さんのシートを見れないようにするためです。
個別にパスワードを設定したい場合だとやはり人数分のモジュールを用意する必要がありますよね?
ボタン設置は言う事なしでしたが上記仕様のため難しいですよね。。。
ちなみに管理者は、全員のシートが見れるうえに専用の管理者シートも存在しています。
No.2
- 回答日時:
こんにちは
不明な点は適当です。
※ 「管理用」という名前のシートは存在しないものと仮定しています。
※ メニューシートのシート名は「メニュー」と仮定しています。
※ ボタンを作成する際は、CreateButtons()を実行してください。
※ ボタンの位置やサイズ等はお好みで調整してください。
※ 以下を標準モジュールにコピペのこと。
Const MenuSheet = "メニュー" ' メニューシート名
Const Manage = "管理用"
Sub CreateButtons()
Dim btn, sht
Dim i, shN()
Const btnWidth = 70
Const btnHeight = 30
Const btnLeft = 20
Const btnTop = 20
Const btnPitch = 90
Const MacroName = "MenuButtonClick"
With Worksheets(MenuSheet)
For Each btn In .Buttons
btn.Delete
Next btn
ReDim shN(1 To Worksheets.Count)
i = 1
For Each sht In Worksheets
If sht.Name <> MenuSheet Then
shN(i) = sht.Name
i = i + 1
End If
Next sht
shN(i) = Manage
For i = 1 To UBound(shN)
Set btn = .Buttons.Add(btnLeft + btnPitch * (i - 1), btnTop, btnWidth, btnHeight)
btn.Characters.Text = shN(i)
btn.OnAction = MacroName
Next i
End With
End Sub
Sub MenuButtonClick()
Dim sName, sht, flag: flag = False
If TypeName(Application.Caller) <> "String" Then Exit Sub
sName = Worksheets(MenuSheet).Buttons(Application.Caller).Characters.Text
If sName = Manage Then flag = True: sName = MenuSheet
For Each sht In Worksheets
If sht.Name <> MenuSheet Then sht.Visible = flag
Next sht
Worksheets(sName).Visible = True
Worksheets(sName).Activate
End Sub
言葉足らず失礼しました。
管理用というシートも存在します。
管理者は管理用シートも含め全部のシートが表示されます。
No.3のお礼にも書きましたが、他人のシートが見れないようにするとなると、難しそうですね。。。
No.1
- 回答日時:
できますが、、、
https://www.excellovers.com/entry/2017/07/30/155 …
疑似的なコントロール配列にしないとイベントをキャッチできません。
https://gabekore.org/vba-control-array
意外とめんどくさいので、.netとかでラッパー作ったほうが早いような気もします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Excel(エクセル) エクセルのマクロ設定 1 2023/04/05 19:37
- Excel(エクセル) エクセルの条件付き書式 個人シートを参照して集計シートに色付けしたい 1 2023/06/22 00:39
- Excel(エクセル) Excelマクロの差分抽出のコードを教えていただきたいです。 2 2023/03/14 11:40
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- Excel(エクセル) vba 同じブック内での転記について 4 2023/01/15 14:42
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- Excel(エクセル) 【マクロ】ファイル名の日付によって、保管するフォルダを、自動選択したい 4 2023/08/16 11:24
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
何歳が一番楽しかった?
自分の人生を振り返ったとき、何歳のころが一番楽しかったですか? 子供の頃でしょうか、それとも大人になってからでしょうか。
-
2024年においていきたいもの
2024年もあとわずかですが、いま抱えているもので「これは来年にもっていきたくないなぁ」というものを教えて下さい。
-
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
エクセルVBA フォームへ動的に貼り付けたボタンのクリックイベントを検知する方法を教えてください
Excel(エクセル)
-
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
-
4
Excel VBA 動的に作成したチェックボックスにイベントを追加したい
Excel(エクセル)
-
5
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
6
オブジェクト名をVBAで指定する方法を教えてくださ
PowerPoint(パワーポイント)
-
7
Excelマクロでオプションボタンの名前の変更をしたい
Excel(エクセル)
-
8
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
9
EXCEL VBA オートシェイプナンバーのリセット
Visual Basic(VBA)
-
10
コマンドボタンがあるかどうかを取得するには?
PowerPoint(パワーポイント)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コード名シートA列と集計シート...
-
【VBA】シート内のセルの色での...
-
特定の文字を含むシートだけマ...
-
複数の別シートから、1シートへ...
-
エクセルVBA Ifでシート名が合...
-
VBA 存在しないシートを選...
-
Excelマクロのエラーを解決した...
-
エクセルのシート名変更で重複...
-
エクセルの特定のシートのみを...
-
VBAを用いて繰り返し自動的...
-
ブック名、シート名を他のモジ...
-
範囲を指定して別シートにコピペ
-
excel vbaで今開いたばかりのフ...
-
シート名の一部を変更する方法...
-
ExcelVBA:複数の特定のグラフ...
-
エクセルのマクロについて教え...
-
コマンドボタンをクリックでシ...
-
いつもお世話になっております...
-
excelのマクロで該当処理できな...
-
VBA実行時エラー1004 ソート失敗
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
別のシートから値を取得するとき
-
Excelマクロのエラーを解決した...
-
実行時エラー'1004': WorkSheet...
-
ブック名、シート名を他のモジ...
-
ExcelのVBAのマクロで他のシー...
-
VBAで指定シート以外の選択
-
VBA 存在しないシートを選...
-
エクセルのシート名変更で重複...
-
IFステートの中にWithステート...
-
シートが保護されている状態で...
-
【VBA】シート名に特定文字が入...
-
ExcelVBA:複数の特定のグラフ...
-
XL:BeforeDoubleClickが動かない
-
実行時エラー1004「Select メソ...
-
【VBA】色のついたシート名を取得
-
エクセル・マクロ シートの非...
おすすめ情報