5

プロジェクトを作成していますが、Excel2003が[データ]->[外部データのインポート]->[新しいWebクエリ]を介した外部Webページからのデータのインポートをサポートしていることを理解しています。

これは、ここにリストされているいくつかの手順で実行できます:http: //www.internet4classrooms.com/excel_import.htm

ただし、データをインポートするサイトは内部Webサイト(イントラネット)であり、アクセスするたびにログインが必要です。

ウェブサイトはパスワードを覚えておらず、「インポート」ボタンを押すたびに、ログインのために何もしません。

Excel 2003の外部Webサイトからデータをインポートするときに、ユーザー名とパスワードの入力を求めてWebサイトにログインするにはどうすればよいですか?

4

2 に答える 2

2

私は約 1 年前にこれに遭遇し、JimmyPena が示唆したように、IE 自動化がおそらく進むべき道です。これはあなたが予想していたよりもはるかに複雑に見えますが、信じてください、私はより簡単な方法を見つけるのに何時間も費やしましたが、見つけることができませんでした.

HTML と DOM オブジェクトについて少し時間をかけて学んでください。あなたがやっていることはやり過ぎのように思えるかもしれませんが、ウェブサイトからデータを取得したい場合には、後で役に立ちます。正しい方向に向けるためのスクリプトは次のとおりです。

  1. 2 つのテキスト ボックスとボタンを持つユーザー フォームを作成します。
  2. Textbox1 はユーザー名の入力、textbox2 はパスワードです。
  3. プロパティ ウィンドウでパスワード文字を選択して、パスワード入力をマスクする必要があります (VBA エディタで F4 を押し、ドロップダウンから textbox2 を選択し、PasswordChar の横に文字を入力します)。
  4. 作成したボタンをダブルクリックして、次のコードを貼り付けます。

    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. URL を Web サイトに変更getelementし、Web ページで動作するようにメソッドを変更します

HTML と DOM (ドキュメント オブジェクト モデル) に不慣れな人にとって最も厄介な部分は、ページ上の正しい要素を見つけることです。

Internet Explorer の Developer Tool を使用するとよいでしょう。IE でイントラネット ページを開き、F12 キーを押します。これにより、開発者ツールが開きます。ツールバーの矢印アイコン (矢印は上と左を指す) をクリックして、イントラネット ページに戻ります。ページにカーソルを合わせると、各要素の周りに描かれた青いボックスが表示されます。ユーザー名ログインの上にカーソルを置き、入力ボックスをクリックします。これにより、ソース コード内の HTML が強調表示されます。

ここから、要素の ID、名前、タグ名、およびクラスがある場合はそれらを特定できます。getelementbyID、などについて調査するかgetelementsbytagname、上記のコードをステップ実行して、どのように機能するかを感じてください。

最後に、イントラネット ページにフォーム要素がある場合は、getelement上記のメソッドでフォーム オブジェクトを取得し、 で送信する必要があり.submitます。ページでボタン オブジェクトを使用している場合は、ボタン要素を取得して を使用します.click。幸運を!

于 2012-07-28T20:08:13.463 に答える
0

それがまだ関連しているかどうかはわかりませんが、マクロを介してこれに対する解決策があります

手順は次のとおりです。

1: 新しい Web クエリをインポートする際にマクロを記録します (何でも構いません)。

2: すべてのクエリを更新します。

Web クエリを編集して、インラインのユーザー名/パスワードを含めます。

以下は私のマクロです:

 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:PASSWORD@SERVER.com/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

于 2013-06-27T09:08:46.440 に答える