2016-07-14 19 views
2

Ich versuche, Code hinzuzufügen, um ein Benutzerformular zu öffnen, das dem Endbenutzer erlaubt, sein Login/Passwort für eine bestimmte Website einzugeben. Dieser Code Passing variable from Form to Module in VBA brachte mich meinem Ziel näher, aber ich bin mir nicht sicher, wie ich es so machen kann, wie ich es brauche. Hier ist der Code für mein Benutzerformular.Eine Variable direkt von einem Benutzerformular zuweisen

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

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

Und ich benutze die unten im Code, um sich auf der Website anzumelden.

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 

Das Problem, das ich in laufen lasse, ist, dass ich einen Fehler von „erwartetem Ende der Anweisung“ auf der uid/upass Variablen erhalten. Wie bekomme ich das Benutzerformular korrekt, um die Eingabe direkt in die Variable zu übergeben, damit die Variable für die Anmeldung auf der Website verwendet werden kann? Ich bin völlig offen, die Methode zu ändern, wenn es auch einen besseren Weg gibt.

+0

Ich habe nicht einmal bekommen bis zu dem Punkt, an dem beide Codes ausgeführt werden. Als ich mit der Eingabe der UID =/UPass = Zeilen fertig war, wurden beide rot und markierten den Fehler. – TonyP

+2

Prozedur 'CommandButton1_Click' ist zweimal definiert. Das kann nicht kompiliert werden. Außerdem sollte 'Connect_To_Wave()' 'ConnectToWave (ByVal uid als String, ByVal pwd als String) sein '- Sie zeigen nicht an, wo das Formular instanziiert ist, sondern es weist globale Variablen zu und entlädt die globale/Standardinstanz des Formulars isn Es ist ein Zeichen für festen Code. –

+0

Ich habe diese Änderungen wie vorgeschlagen vorgenommen. Ich bin mir nicht sicher, wie ich es von hier aus testen soll. Ich habe F8 gedrückt, um das Benutzerformular auszuführen, und das läuft wie erwartet, aber ich bin mir nicht sicher, wie ich den Login-Code gleichzeitig testen soll. Wenn ich versuche, den Login-Code jetzt zu f8 zu senden, gibt es nur eine Fehlermeldung, aber keine Fehlermeldung. – TonyP

Antwort

3

Dies kann möglicherweise nicht kompilieren:

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

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

Ein Verfahren nicht zweimal vorhanden sein kann.Benennen Sie Ihre Schaltfläche OkButton, fügen Sie einige CancelButton und schreiben Sie Ihre Form des Code-Behind wie folgt:

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 

Hinweis OkButton, CancelButton und die QueryClose Handler immer nur ausblenden die Form, so dass der anrufenden Code kann noch lesen Sie die IsCancelled , UID und PWD Eigenschaftswerte.

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

Und zuletzt, die ConnectToWave Prozedur, die Eingabe des Benutzers unter: -

Dieser Code ruft dies tun könnte Annahme, daß die Userform LoginPrompt umbenannt

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

Dies ist eine grundlegende Frage, aber wo würde ich das Public Sub Downloadstuff() in das Modul mit dem ConnecttoWave oder mit dem Benutzerformular? – TonyP

+0

Das wäre in einem Standardmodul, und könnte als Makro zum Beispiel an einer Schaltfläche auf dem Arbeitsblatt angezeigt werden - ich würde es neben der "ConnectToWave" -Prozedur setzen. –

+0

Das macht Sinn. Vielen Dank! – TonyP

1

Ich bin nicht sicher, was driver ist aber diese Aussage ist falsch

UID = driver.findElementByName("PASSWORD").SendKeys UID als Sendkeys ein Verfahren ist so, wenn man versucht, den Rückgabewert Sie verwenden Klammern müssen zuweisen.

Versuchen Sie folgendes:

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

+0

Treiber war ein Objekt, das im verknüpften Post verwendet wurde/findElementByName ist eine Methode, die Teil der ArcObjects-Bibliothek ist. Da das OP keine Ahnung hat, wie man globale Variablen deklariert, bezweifle ich stark, dass er ArcObjects verwendet. – Tim

1

Dieses:

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

werden sollten:

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

Wenn Sie eine Funktion aufrufen, die nichts Zuweisen zurück zu a Dann müssen Sie keine Klammern verwenden, aber wenn Sie einer Variablen etwas zuweisen, müssen Sie stattdessen die obige Syntax verwenden.

Wo Foo() ist eine Funktion und Bar eine Variable

'// Not assigning a value 
Foo Bar 

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

Um das zu erreichen, was Sie wollen, müssen Sie an der Spitze des Moduls eine globale Variable erstellen. Ich bezweifle, dass Sie ArcObjects verwenden, also verwerfen Sie das ganze driver.findElementByName Zeug. Außerdem haben Sie den Wert für die Felder Benutzername und Passwort bereits richtig gesetzt (dieses Bit: ie.Document.getElementById("txtLoginUsername").Value = UID), so dass keine Methode SendKeys erforderlich ist.

Was Sie brauchen, ist so etwas ganz am Anfang der Codemodul:

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

Ich hätte erwähnen sollen, dass ich die Öffentlichkeit an der Spitze habe. – TonyP

+0

@Tim die Fehlermeldung wird durch falsche Syntax, nicht durch Variablenbereich verursacht. –

Verwandte Themen