やりたいこと
- Excel VBAでダイアログを表示して、ユーザーにパスワードを入力させたい
- 入力されたパスワードは
*
とかでシーリングしたい - InputBoxに近い感じで使いたい
InputBoxでは入力文字が隠せない
やりたいことは概ねInputBox
の機能で実現できるのですが、InputBox
では入力した文字がそのまま画面に表示されてしまいます。
一方でユーザーフォームのテキストボックスにはPasswordChar
プロパティがあり、そこに*
等の文字を設定することで、入力された文字列を非表示にできます。
InputBox
の引数にPasswordChar
があれば万事解決だったのに。
簡単なユーザーフォームを作ってInputBoxの代わりに使う
さて、そういうわけで簡単なユーザーフォームを作成してInputBoxの代わりに使えるようにしましょう。
ポイントは以下のとおりです。
- ユーザーフォームにテキストボックスとOK,Cancelボタン、ラベルを配置する
- コードビハインドに
InputBox
関数に相当するInputPasswordBox
関数を定義する - ついでにOK,Cancelのいずれかのボタンが押されたのか取得できるプロパティを実装する
コントロールの設定(プロパティ)
プロパティウィンドウで設定した項目です。(コードビハインドの前提条件)
書かれていないプロパティはデフォルト値のままです。
ユーザーフォーム
- (オブジェクト名):FormInputPasswordBox
- Caption:(コードで指定するので使わないけど、お好みで変更)
OKボタン
- (オブジェクト名):
ButtonOK
- Default:
True
- Caption:
OK
Cancelボタン
- (オブジェクト名):
ButtonCancel
- Cancel:
True
- Caption:
キャンセル
テキストボックス
- (オブジェクト名):
TextBoxPassword
- PasswordChar:
*
ラベル
- (オブジェクト名):
LabelMessage
- Caption:(コードで指定するので使わないけど、お好みで変更)
コードビハインド
FormInputPassword
Option Explicit
Private IsCanceled_intarnal As Boolean
Private IsOKed_intarnal As Boolean
Public Function InputPasswordBox(caption As String, title As String) As String
Me.LabelMessage.caption = caption
Me.caption = title
Call Me.Show
InputPasswordBox = TextboxPassword.Value
End Function
Public Property Get IsCanceled() As Boolean
IsCanceled = IsCanceled_intarnal
End Property
Private Sub ButtonCancel_Click()
IsCanceled_intarnal = True
Call Me.Hide
End Sub
Public Property Get IsOKed() As Boolean
IsOKed = IsOKed_intarnal
End Property
Private Sub ButtonOK_Click()
IsOKed_intarnal = True
Call Me.Hide
End Sub
Private Sub UserForm_Initialize()
IsCanceled_intarnal = False
IsOKed_intarnal = False
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True ''×ボタンで閉じられるとIsOKedプロパティとかが使えない
End If
End Sub
Module
Option Explicit
Sub Login()
Dim password As String
' パスワード入力用ユーザーフォーム
Dim fipb As New FormInputPasswordBox
password = fipb.InputPasswordBox("パスワードを入力してください", "パスワード入力")
If fipb.IsCanceled Then
Call MsgBox("キャンセルされました")
End If
Call Unload(fipb) ' ユーザーフォーム解放
End Sub
余談
先日C#
でも似たようなことをやりました。
-
【C#】コンソールアプリで入力された文字を非表示にしてReadLineする
ユーザーにパスワードをキーボード入力させる需要ってあんまりないのかしら…?