2016-06-24 5 views
0

Я начал с использования InputBox в качестве пользовательского интерфейса, чтобы получить пароль для запуска SQL с базы данных. Я узнал, что InputBoxes не имеет возможности маскировать входные символы (например, *******). Затем я узнал, что мне нужно использовать форму пользователя, чтобы создать текстовое поле с полем маскировки пароля. Я никогда не делал это раньше.Создание пользовательской формы VBA. Маскировка паролей

Я нашел этот пост (http://www.mrexcel.com/archive/VBA/19882a.html), который, похоже, доставит мне большую часть пути, и я мог бы добавить несколько вещей, которые я знаю, как это сделать. Когда я перебрал его в пустую таблицу, у меня получился целый список ошибок, исходящих из него, и, поскольку пост смехотворно старый, я подумал, что, возможно, были некоторые обновления для VBA, которые делают этот код устаревшим. Кто-нибудь сможет критиковать его, чтобы заставить его работать? Я перечислил некоторые из ошибок, с которыми я столкнулся, пытаясь исправить это, а также код.

Errors: 
-Statement invalid Type block 
-User-defined type not defined 
-Method 'VBE' of object'_Application' failed 
-Method 'VBProject' of object'_Workbook' failed 
-Object required 

Код:

Option Explicit 
Public OK As Boolean 
Public Const sMyPassWord As String = "test" 

Function GetPassWord(Title As String) 
'--------------------------------------------------------------------------- ------------ 
' Procedure : GetPassWord 
' DateTime : 4/02/02 19:04 
' Author : Ivan F Moala 
' Purpose : Creates a Dynamic UF to Test for aPassword 
' : so there is no need to create one. 
'--------------------------------------------------------------------------- ------------ 
Dim TempForm 
Dim NewTextBox As MSForms.TextBox 
Dim NewCommandButton1 As MSForms.CommandButton 
Dim NewCommandButton2 As MSForms.CommandButton 
Dim x As Integer 

' Hide VBE window to prevent screen flashing 
Application.VBE.MainWindow.Visible = False 

' Create a Temp UserForm 
Set TempForm = ThisWorkbook.VBProject.VBComponents.Add(3) 

' Add a TextBox 
Set NewTextBox = TempForm.Designer.Controls.Add("forms.textbox.1") 
With NewTextBox 
.PasswordChar = "*" 
.Width = 140 
.Height = 20 
.Left = 48 
.Top = 18 
End With 

' Add the OK button 
Set NewCommandButton1 = TempForm.Designer.Controls.Add ("forms.CommandButton.1") 
With NewCommandButton1 
.Caption = "OK" 
.Height = 18 
.Width = 66 
.Left = 126 
.Top = 66 
End With 

' Add the Cancel button 
Set NewCommandButton2 = TempForm.Designer.Controls.Add ("forms.CommandButton.1") 
With NewCommandButton2 
.Caption = "Cancel" 
.Height = 18 
.Width = 66 
.Left = 30 
.Top = 66 
End With 

' Add event-handler subs for the CommandButtons & Userform 
With TempForm.CodeModule 
x = .CountOfLines 
.insertlines x + 0, "Sub CommandButton2_Click()" 
.insertlines x + 1, "OK = False: Unload Me" 
.insertlines x + 2, "End Sub" 

.insertlines x + 3, "Sub CommandButton1_Click()" 
.insertlines x + 4, "If TextBox1 = sMyPassWord Then OK = True: Unload Me" 
.insertlines x + 5, "End Sub" 

.insertlines x + 6, "Private Sub UserForm_Initialize()" 
.insertlines x + 7, "Application.EnableCancelKey = xlErrorHandler" 
.insertlines x + 8, "End Sub" 
End With 

' Adjust the form 
With TempForm 
.Properties("Caption") = Title 
.Properties("Width") = 240 
.Properties("Height") = 120 
NewCommandButton1.Left = 46 
NewCommandButton2.Left = 126 
End With 

' Show the form 
VBA.UserForms.Add(TempForm.Name).Show 

' Delete the form 
ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=TempForm 

' Pass the Variable back to the calling procedure 
GetPassWord = OK 

End Function 

Sub ThisIsHowToUseIt() 
'>>> This is the Main line <<<<br>Dim OKToProceed As Variant 
OKToProceed = GetPassWord("Password Entry") 
If OKToProceed = False Then End 
'>>>-----------------------<<<<p>'>>> Your routine goes here  <<<<p>MsgBox "My routine is running now" 

End Sub 
+0

Новая ошибка: «Программный доступ к проекту Visual Basic не доверен» и ссылается на «Установить TempForm = ThisWorkbook.VBProject.VBComponents.Add (3)» кода. – plankton

+0

oops, см. Ссылку для исправления программной ошибки – Rodger

ответ

1

Похоже, она возникла проблема с й бытием = 0 в этом разделе, когда он попадет в команде первых insertlines, где он добавляет 0 в X, а затем пытается insertlines в строке 0. Если вы увеличиваете все значения, добавляемые в x на 1, чтобы он начинался с строки 1, он воспроизводит только штраф.

' Add event-handler subs for the CommandButtons & Userform 
With TempForm.CodeModule 
x = .CountOfLines 
.insertlines x + 1, "Sub CommandButton2_Click()" 
.insertlines x + 2, "OK = False: Unload Me" 
.insertlines x + 3, "End Sub" 
.insertlines x + 4, "Sub CommandButton1_Click()" 
.insertlines x + 5, "If TextBox1 = sMyPassWord Then OK = True: Unload Me" 
.insertlines x + 6, "End Sub" 
.insertlines x + 7, "Private Sub UserForm_Initialize()" 
.insertlines x + 8, "Application.EnableCancelKey = xlErrorHandler" 
.insertlines x + 9, "End Sub" 
End With 

Кроме того, убедитесь, что в вашем Суб, что вы перемещаете Dim заявление на новую строку, так что она не является частью комментария, как у вас в вашем примере кода.

Sub ThisIsHowToUseIt() 
'>>> This is the Main line <<<<br> 
Dim OKToProceed As Variant 
OKToProceed = GetPassWord("Password Entry") 
If OKToProceed = False Then End 
'>>>-----------------------<<<<p>'>>> Your routine goes here  <<<<p>MsgBox "My routine is running now" 

End Sub 
+0

Я получаю ошибки даже до того, как я доберусь до X = 0. Если я заберу Dim из строки комментариев и запустил его как есть, я получаю эту ошибку: Ошибка компиляции: Пользовательский тип не определен ». Он выделяет «Dim NewTextBox как MSForms.TextBox» как проблему. Я думаю, что это не нравится в MSForms.TextBox part – plankton

+1

В инструментах/ссылках VBE щелкните и убедитесь, что у вас есть проверка рядом с библиотекой объектов Microsoft Forms 2.0 – Rodger

+0

Хорошо, так что это не было проверено. Теперь он переходит на «Application.VBE.MainWindow».Visible = False "как" Метод VBE "объекта'_Application 'не удалось. Является ли эта другая библиотека мне? – plankton

2

Если вы действительно просто заботиться о маскировке пароль (при вводе) в TextBox на UserForm, то вы можете использовать встроенную функциональность.

На самом деле существует свойство устанавливать символ маскирования пароля для любого TextBox. В то время как символы замаскированы заданным символом, TextBox можно по-прежнему ссылаться и проверять на его значение, а UserForm1.TextBox1.Value вернет незамасленную строку (в VBA). Посмотрите снимок экрана ниже и дайте мне знать, если это ответит на ваш вопрос.

enter image description here

+0

Я на работе, и брандмауэр не дает мне увидеть грустный рисунок. Мне это нужно er, которая будет создана после того, как отдельная кнопка на листе будет пробита, а затем уйдите после нажатия кнопки «ОК» или «Отмена» на форме. Поэтому он должен быть создан как часть макроса, вызванного ударом по этой начальной кнопке. Было бы намного проще, если поле ввода могло просто замаскировать текст. – plankton

+0

Все еще не разрешено. Я посмотрю на дом. Благодаря! – plankton

1

В вашем проекте VBA вы можете добавить UserForm (Вставка-> UserForm). Перетащите TextBox с панели инструментов на форму. Вы можете щелкнуть правой кнопкой мыши на новой форме и выберите «View Code»

В окне кода редактирования можно включить этот код:

Private Sub UserForm_Initialize() 
    Me.TextBox1.PasswordChar = "*" 
End Sub 

При запуске формы вы увидите * для каждого персонажа вы тип.

Смежные вопросы