2012-07-16 14 views
5

Ich baue ein Projekt und ich verstehe, dass Excel 2003 den Import von Daten von externen Webseiten über "Daten -> Externe Daten importieren -> Neue Webabfrage" unterstützt.Importieren von Daten nach Excel 2003 mit einer Anmeldeseite

Dies kann hier aufgeführten über die wenigen Schritten erfolgen: http://www.internet4classrooms.com/excel_import.htm

jedoch die Site-I-Daten aus ist eine interne Website (Intranet) am Import und erfordert eine Anmeldung jedes Mal wenn ich auf sie zugreifen.

Die Website erinnert sich nicht an das Passwort und jedes Mal, wenn ich auf den "Import" -Button klicke, macht es aufgrund der Anmeldung nichts.

Wie fordere ich einen Benutzernamen + ein Passwort an und logge mich auf der Website ein, während ich die Daten von einer externen Website in Excel 2003 importiere?

+0

Ist es möglich, dass Sie den Code auf diesem Intranet-Server zu ändern? – seeker

+0

Welche Art von Daten ist das? Kannst du es anders machen? Können Sie stattdessen MSXML oder IE-Automatisierung verwenden, um es abzurufen? Hilft diese Antwort? http://stackoverflow.com/a/11216467/190829 – JimmyPena

Antwort

2

Ich stieß vor ungefähr einem Jahr darauf und wie JimmyPena vorgeschlagen hat, ist IE Automatisierung wahrscheinlich der Weg zu gehen. Das wird viel komplizierter aussehen, als Sie erwartet haben, aber glauben Sie mir, ich verbrachte Stunden damit, einen einfacheren Weg zu finden und konnte keinen finden.

Nehmen Sie sich etwas Zeit, um etwas über HTML und das DOM-Objekt zu erfahren. Es mag wie Overkill für das, was Sie tun, aber es wird sich als nützlich erweisen, wenn Sie Daten von Websites erhalten möchten. Hier ist ein Skript, um Sie in die richtige Richtung:

  1. Erstellen einer Userform mit zwei Textfelder und eine Schaltfläche
  2. Textbox1 wird der Benutzername Eingang und TextBox2 sein wird Ihr Passwort
  3. Sie sollten das Passwort maskieren Eingabe durch Auswahl eines Passwort-Zeichens im Eigenschaftenfenster (Drücken Sie F4 im VBA-Editor, wählen Sie Textfeld2 aus der Dropdown-Liste und geben Sie ein Zeichen neben PasswordChar ein)
  4. Doppelklicken Sie auf die Schaltfläche, die Sie gerade erstellt haben, und fügen Sie den folgenden Code ein:

    Option Explicit 
    
    Private Sub CommandButton1_Click() 
    Const READYSTATE_COMPLETE = 4 
    Const tempDir As String = "C:\Windows\Temp\" 
    
    Dim userName$, passWord$, URL$, s_outerhtml$ ''These are strings 
    Dim IE As Object, IE_Element As Object, IE_HTMLCollection As Object 
    Dim i_file% ''This is an integer 
    Dim blnUsernameEntered As Boolean, blnPasswordEntered As Boolean, blnSheetFnd As Boolean 
    Dim ws As Excel.Worksheet 
    
    ''Test for missing username or password 
    If Me.TextBox1 = vbNullString Then MsgBox "Enter a User Name", vbOKOnly, "User Name Missing": Exit Sub 
    If Me.TextBox2 = vbNullString Then MsgBox "Enter a Password", vbOKOnly, "Password Missing": Exit Sub 
    
    ''Set the username and password based on the userform inputs 
    userName = Me.TextBox1.Value 
    passWord = Me.TextBox2.Value 
    
    ''Hide the form 
    Me.Hide 
    
    ''Enter your address to navigate to here 
    URL = "http://theofficialjbfansite.webs.com/apps/auth/login" 
    
    ''Create an Internet Explorer object if it doesn't exist 
    If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application") 
    
    ''Make the window visible with true, hidden with false 
    IE.Visible = True 
    ''navigate to the website 
    IE.Navigate URL 
    
    '' use this loop to make wait until the webpage has loaded 
    Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE 
        DoEvents 
    Loop 
    
    ''This is where it will get tricky - see my notes on DOM at the end of this post 
    ''build a collection of input elements 
    Set IE_HTMLCollection = IE.document.getElementsByTagName("input") 
    ''for each html element in the "input" collection 
    For Each IE_Element In IE_HTMLCollection 
        If IE_Element.Name = "email" Then IE_Element.innerText = userName: blnUsernameEntered = True 
        If IE_Element.Name = "password" Then IE_Element.innerText = passWord: blnPasswordEntered = True 
        If blnUsernameEntered = True And blnPasswordEntered = True Then Exit For 
        ''Unblock line below if you are having trouble finding the element name, 
        ''view the output in the Immediate Window (Ctrl + G in the VBA Editor) 
        ''Debug.Print IE_Element.Name 
    Next 
    
    ''Find the form and submit it 
    Set IE_HTMLCollection = IE.document.getElementsByTagName("form") 
    For Each IE_Element In IE_HTMLCollection 
        If IE_Element.Name = "loginForm" Then IE_Element.submit 
    Next 
    
    Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE 
        DoEvents 
    Loop 
    
    ''The next line helps ensure that the html has been fully loaded 
    Application.Wait Now() + TimeValue("0:00:02") 
    s_outerhtml = IE.document.body.OuterHtml 
    i_file = FreeFile 
    
    
    ''This is a modification of some code I found at www.tek-tips.com <--great resource 
    ''the code saves a temporary copy of the webpage to your temp file 
    Open tempDir & "\tempFile.htm" For Output As #i_file 
    Print #i_file, s_outerhtml 
    
    Close #i_file 
    
    ''Creating a "Data" sheet if it doesn't exist 
    For Each ws In ThisWorkbook.Worksheets 
        If ws.Name = "Data" Then blnSheetFnd = True: Exit For 
    Next 
    
    If blnSheetFnd = False Then Sheets.Add: ActiveSheet.Name = "Data" 
    
    Sheets("Data").Cells.Clear 
    
    ''Here is your webquery, using the temporary file as its source 
    ''this is untested in 2003, if it errors out, record a macro 
    ''and replace the property that throws the error with your recorded property 
    With Sheets("Data").QueryTables.Add(Connection:= _ 
        "URL;" & tempDir & "tempFile.htm" _ 
        , Destination:=Range("$A$1")) 
        .Name = "Data" 
        .FieldNames = True 
        .RowNumbers = False 
        .FillAdjacentFormulas = False 
        .PreserveFormatting = True 
        .RefreshOnFileOpen = False 
        .BackgroundQuery = True 
        .RefreshStyle = xlInsertDeleteCells 
        .SavePassword = False 
        .SaveData = True 
        .AdjustColumnWidth = True 
        .RefreshPeriod = 0 
        .WebSelectionType = xlEntirePage 
        .WebFormatting = xlWebFormattingAll 
        .WebPreFormattedTextToColumns = True 
        .WebConsecutiveDelimitersAsOne = True 
        .WebSingleBlockTextImport = False 
        .WebDisableDateRecognition = False 
        .WebDisableRedirections = False 
        .Refresh BackgroundQuery:=False 
    End With 
    
    ''delete the temporary file 
    Kill tempDir & "\tempFile.htm" 
    
    ''clean up after yourself, foo!! 
    IE.Quit 
    Set IE = Nothing 
    Set IE_HTMLCollection = Nothing 
    Unload UserForm1 
    
    End Sub 
    
  5. Ändern Sie die URL auf Ihre Website und ändern Sie die getelement Methoden mit Ihrer Webseite für jemanden nicht vertraut mit HTML und das DOM (Document Object Model)

Der schwierigste Teil zu arbeiten, um die richtige zu finden sein wird Elemente auf der Seite.

Ein guter Trick ist, das Developer Tool von Internet Explorer zu verwenden. Öffnen Sie Ihre Intranetseite in IE und drücken Sie F12. Dies öffnet das Developer Tool. Klicken Sie auf das Pfeilsymbol (der Pfeil zeigt nach oben und nach links) in der Symbolleiste und wechseln Sie zurück zu Ihrer Intranetseite. Bewegen Sie den Mauszeiger über die Seite und Sie sehen blaue Kästchen um jedes Element herum. Bewegen Sie den Mauszeiger über den Benutzernamen und klicken Sie auf das Eingabefeld. Dadurch wird der HTML-Code im Quellcode hervorgehoben.

Von hier aus können Sie die Element-ID, den Namen, den Tagnamen und die Klasse identifizieren, wenn sie eine hat. Recherchieren Sie unter getelementbyID, getelementsbytagname usw. oder gehen Sie durch den obigen Code, um ein Gefühl dafür zu bekommen, wie es funktioniert.

Eine letzte Anmerkung, wenn Ihre Intranetseite ein Formularelement hat, müssen Sie das Formularobjekt mit den Methoden getelement oben abrufen und es mit .submit übermitteln. Wenn die Seite ein Schaltflächenobjekt verwendet, rufen Sie das Schaltflächenelement ab und verwenden Sie .click. Viel Glück!

0

Nicht sicher, ob es immer noch relevant ist, aber ich habe eine Lösung für diese über einen Makro

Im Folgenden sind die Schritte:

1: Nehmen Sie Ihre Makro die neue Web-Abfrage in dem Import (alles tun wird)

2: Aktualisieren Sie alle Ihre Abfragen.

Bearbeiten Sie Ihre Webabfrage, um einen Inline-Benutzernamen/ein Passwort einzufügen.

Unten ist mein Makro:

Sub xmlUpdate() 
'This will enable the import of our XML data. The first part is a dummy import, to authenticate the Excel file with the iJento servers. The second part (Web_Query_1 is the actual import) 
'The sheet is initially inserted as "Dummy" and then promptly deleted. 
    Sheets.Add.Name = "Dummy" 
    ActiveWorkbook.XmlImport URL:= _ 
     "https://USERNAME:[email protected]/query/app?service=file=201" _ 
     , ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1") 
    Sheets("Dummy").Select 
    Application.DisplayAlerts = False 
    ActiveWindow.SelectedSheets.Delete 
    ActiveWorkbook.XmlMaps("Web_Query_1").DataBinding.Refresh 
    End Sub