2016-07-14 4 views
2

Я пытаюсь добавить некоторый код, чтобы всплывать пользовательская форма, которая позволяет конечному пользователю вводить свой логин/пароль для определенного веб-сайта. Этот код Passing variable from Form to Module in VBA приблизил меня к моей цели, но я не уверен, как заставить его работать так, как мне нужно. Вот код для моей пользовательской формы.Назначение переменной непосредственно из пользовательской формы

Private Sub CommandButton1_Click() 
UPass = UserForm1.UserID 
Unload UserForm1 
End Sub 

Private Sub CommandButton1_Click() 
UID = UserForm1.WavePassword 
Unload UserForm1 
End Sub 

И я использую приведенное ниже в коде для входа на сайт.

Public Sub Connect_To_Wave() 
    Dim Dasboard As Worksheet 
     Set Dashboard = ActiveWorkbook.Worksheets("Dashboard") 
    Dim UID As String 
     UID = driver.findElementByName("PASSWORD").SendKeys UID 
    Dim UPass As String 
     UPass = driver.findElementByName("PASSWORD").SendKeys Upass 




Set ie = CreateObject("InternetExplorer.Application") 
my_url = "url of website - not a variable" 

With ie 
    .Visible = True 
    .Navigate my_url 
    .Top = 100 
    .Left = 530 
    .Height = 700 
    .Width = 400 

Do Until Not ie.Busy And ie.readyState = 4 
    DoEvents 
Loop 

End With 

ie.Document.getElementById("txtLoginUsername").Value = "" 
ie.Document.getElementById("txtLoginPassword").Value = "" 
ie.Document.getElementById("txtLoginUsername").Value = UID 
ie.Document.getElementById("txtLoginPassword").Value = UPass 
ie.Document.getElementById("btnLogin").Click 

Do Until Not ie.Busy And ie.readyState = 4 
    DoEvents 
Loop 
End Sub 

Проблема Я бегу в том, что я получаю ошибку «ожидаемого конца заявления» на UID/upass переменных. Как правильно получить форму пользователя, чтобы передать вход непосредственно в переменную, чтобы переменная могла использоваться для входа на веб-сайт? Я полностью открыт для изменения метода, если есть лучший способ.

+0

Я даже не получил вплоть до запуска любого набора кода. Когда я закончил набирать строки UID =/UPass =, они оба покраснели и отметили ошибку. – TonyP

+2

Процедура 'CommandButton1_Click' определена дважды. Это невозможно компилировать. Также 'Connect_To_Wave()' должно быть 'ConnectToWave (ByVal uid As String, ByVal pwd As String)' - вы не показываете, где форма instanciated, но она назначает глобальные переменные и выгружает глобальный/стандартный экземпляр формы isn это знак сплошного кода. –

+0

Я сделал эти изменения, как было предложено. Я не знаю, как это проверить. Я ударил F8, чтобы запустить пользовательскую форму, и это работает, как я полагаю, но я не уверен, как тестировать код входа одновременно. Когда я пытаюсь F8, код входа в систему теперь просто звучит, но не содержит сообщения об ошибке. – TonyP

ответ

3

Это не может скомпилировать:

Private Sub CommandButton1_Click() 
UPass = UserForm1.UserID 
Unload UserForm1 
End Sub 

Private Sub CommandButton1_Click() 
UID = UserForm1.WavePassword 
Unload UserForm1 
End Sub 

процедура не может существовать дважды.Переименовать кнопку OkButton, добавить CancelButton и переписать код-за вашу форму следующим образом:

Option Explicit 
Private cancelling As Boolean 

Public Property Get UID() As String 
    UID = UserID.Text 
End Property 

Public Property Get PWD() As String 
    PWD = WavePassword.Text 
End Property 

Public Property Get IsCancelled() As Boolean 
    IsCancelled = cancelling 
End Property 

Private Sub OkButton_Click() 
    Me.Hide 
End Sub 

Private Sub CancelButton_Click() 
    cancelling = True 
    Me.Hide 
End Sub 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    If CloseMode = VbQueryClose.vbFormControlMenu Then 
     cancelling = True 
     Me.Hide 
    End If 
End Sub 

Уведомления OkButton, CancelButton и QueryClose обработчика только когда-либо Скрыть форму, так что вызывающий код может все еще прочитать IsCancelled , UID и PWD.

что вызывающий код может это сделать - если предположить, что UserForm переименован в LoginPrompt:

Public Sub DownloadStuff() 
    With New LoginPrompt 
     .Show vbModal 
     If .IsCancelled Then Exit Sub 
     ConnectToWave .UID, .PWD 
    End With 
End Sub 

И наконец, ConnectToWave процедуру, принимая ввод пользователя:

Private Sub ConnectToWave(ByVal userID As String, ByVal password As String) 
    ' there, you got your values from the form - now use them! 
End Sub 
+0

Это основной вопрос, но где бы я разместил Public Sub Downloadstuff() в модуле с ConnecttoWave или с пользовательской формой? – TonyP

+0

Это было бы в стандартном модуле и могло бы отображаться как макрос, прикрепленный к кнопке на листе, например - я бы поставил его рядом с процедурой 'ConnectToWave'. –

+0

Это имеет смысл. Спасибо! – TonyP

1

Я не уверен, что driver есть, но это утверждение неверно

UID = driver.findElementByName("PASSWORD").SendKeys UID в Sendkeys является методом так, при попытке присвоить возвращаемое значение необходимо использовать скобки.

Попробуйте это:

UID = driver.findElementByName("PASSWORD").SendKeys(UID)

+0

Драйвер был каким-то объектом, используемым в связанном сообщении/findElementByName, является методом, который является частью библиотеки ArcObjects. Учитывая, что ОП не знает, как объявлять глобальные переменные, я очень сомневаюсь, что он использует ArcObjects. – Tim

1

Это:

Dim UID As String 
    UID = driver.findElementByName("PASSWORD").SendKeys UID 
Dim UPass As String 
    UPass = driver.findElementByName("PASSWORD").SendKeys Upass 

Должно быть:

Dim UID As String 
    UID = driver.findElementByName("PASSWORD").SendKeys(UID) 
Dim UPass As String 
    UPass = driver.findElementByName("PASSWORD").SendKeys(Upass) 

Если вы вызываете функцию, которая ничего не назначая вернуться к значение, то вам не нужно использовать круглые скобки, но если он присваивает что-то переменной, тогда вам нужно использовать вышеприведенный синтаксис.

Где Foo() функция и Bar переменная

'// Not assigning a value 
Foo Bar 

'// Assigning a value 
someVar = Foo(Bar) 
0

Чтобы сделать то, что вы хотите, вы должны создать глобальную переменную в верхней части модуля. Я сомневаюсь, что вы используете ArcObjects, чтобы обмануть весь файл driver.findElementByName. Кроме того, вы уже правильно задали значения полей имени пользователя и пароля (этот бит: ie.Document.getElementById("txtLoginUsername").Value = UID), поэтому нет необходимости в методе SendKeys.

Что вам нужно что-то подобное на самом верху вашего модуля кода:

Option Explicit 
Public UID as String 
Public UPass as String 
+0

Я должен был упомянуть, что у меня есть публика наверху. – TonyP

+0

@ Поверните сообщение об ошибке, вызванное неправильным синтаксисом, а не переменной. –

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