自分のセンスや笑いの好みに影響を受けた作品を教えて

Aというマクロボタンを押したときにパスワード入力させたく、
調べているうちに、ユーザーフォームを使って、パスワードを***でマスキングした認証が出来るようになりました。
Aのボタンを押すと、10シートあるうちの、特定の3シート以外を非表示にする処理です。

更にBというマクロボタンがあり、こちらをクリックすると、10シートあるうちの、特定の5シート以外を非表示にする処理です。

つまり、担当者がAとBのグループに分かれていて、自分の担当のシートだけ編集できるようにしました。
Bのマクロボタンを押すと、Aと同様にパスワードを入力させるのですが、
AとBのパスワードは違うものにしたいので、全く同じ見た目とソースのユーザフォームを作らなければいけません。
手作業でそっくりにフォーム設計する以外に楽な方法はないでしょうか?
または同じフォームを共用するとか、良い方法がありましたら教えてください。

A 回答 (4件)

こんにちは


既に回答にありますが、
>AとBのパスワードは違うものにしたいので、
違うものにするのであれば、パスワードで処理を分ければ良いのでは無いかと思います。

具体的な一例

Worksheets(1)を表紙シート説明などを表示用に作っている場合
パスワードを入力するフォーム UserForm1
ThisWorkbookモジュールに

Private Sub Workbook_Open()
Dim ws As Worksheet
For Each ws In Worksheets
If Worksheets(1).Name <> ws.Name Then ws.Visible = xlVeryHidden
Next
UserForm1.Show
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
For Each ws In Worksheets
If Worksheets(1).Name <> ws.Name Then ws.Visible = xlVeryHidden
Next
End Sub

UserForm1にTextBox1とCommandButton1があり
TextBox1のPasswordChar=*

UserForm1モジュールに

Private Sub CommandButton1_Click()
Dim Ary, SN
Select Case TextBox1.Value
Case "AAA"
Ary = Array("A", "B", "C")
Case "BBB"
Ary = Array("A", "B", "C", "D", "E")
Case "admin"
For Each SN In Worksheets
If SN.Name <> "" Then SN.Visible = True
Next
' Unload Me
Exit Sub
Case Else
Unload Me
Exit Sub
End Select
For Each SN In Ary
If SN <> "" Then Worksheets(SN).Visible = True
Next
Unload Me
End Sub
(Variantと言う事で、変数SNを少しあらい使い方をしています)

パスワードを知らないユーザーはWorksheets(1)以外見ることは出来ません
xlVeryHiddenなのでシートタグからも表示不可です。

各シート名は暫定、Worksheets(1)を隠したい場合は、
Worksheets(1).Visible = xlVeryHidden 追加、BeforeClose時
Worksheets(1).Visible = True
    • good
    • 0

こんにちは



よくわかりませんけれど・・・

これかな?
https://oshiete.goo.ne.jp/qa/12446604.html

想像するところ、個々のボタンに応じてマクロを作成しているのではないかと思いますが、極論を言えば、一つのマクロでも対応可能と思われます。
要は、押されたボタンを識別できさえすれば、処理手順としては同じでしょうから…

どのような実装になっているのか不明ですけれど、呼び出されたマクロ内で、
 Application.Caller
を参照することで、呼び出し元のボタンを識別可能なので、
>全く同じ見た目とソースのユーザフォームを作らなければいけません。
なんてことも必要無くなります。(同じフォームを利用することで十分かと)

上記のようにまでは纏めなくても、単純に「パスワードを入力して返すサブルーチン(あるいはチェックするサブルーチン)」を作成しておいて、それぞれのボタンクリック時のマクロからこれを呼び出すようにしておけば、ひとつのフォームを兼用できるものと想像されます。
    • good
    • 1

そのユーザーフォームにどの程度の機能を組み込むかで、やり方が違ってくると思います。


1案 ユーザーフォームはパスワードの入力及び検証のみ行う。
2案 ユーザーフォームでパスワードの入力及び検証の後、シートの非表示まで行う。

1案であれば、ユーザーフォームは共有し、パスワードをグローバル変数で設定する方法
2案であれば、No1の方が提示する方法で、フォームのエクスポート/インポートでフォームをコピーする方法
になるかと。
    • good
    • 0

入力されたパスワードによってAグループ用、Bグループ用の設定を変更(=同じフォームを共用)した方が楽なような気がしますが、見た目が同じ2つのユーザーフォームを作りたいのであれば出来ないことは無いようです。


直接コピーはできないようですので、エクスポートとインポートを利用すればできそうです。ただし、エクスポート時にオブジェクト名を指定できないので
1.Form_Aをエクスポート
2.Form_Aのオブジェクト名を変更
※この操作をしておかないと、同じオブジェクト名になるので次の操作でエラーが生じます
3.(1)でエクスポートしておいたファイルをインポート
4.一方のパスワードや表示するシートなどのコードを変更
で、見た目は同じものができるはずです。お試しください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報