2016-07-14 14 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)' - 你不顯示錶單的實例,但是它分配全局變量並卸載窗體的全局/默認實例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 

通知OkButtonCancelButtonQueryClose處理器只有永遠隱藏的形式,讓調用代碼仍然可以讀取IsCancelledUIDPWD屬性值。

,調用代碼可以做到這一點 - 假設用戶窗體被重命名爲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 UIDSendkeys是嘗試指派你需要使用括號中的返回值,所以當一個方法。

試試這個:

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

+0

驅動程序是用於鏈接後的某個對象/ findElementByName是ArcObjects庫的一部分。鑑於OP不知道如何聲明全局變量,我非常懷疑他在使用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

@Tim錯誤消息是由不正確的語法造成的,而不是可變範圍。 –

相關問題