2013-06-20 163 views
0

既然學校已經到了夏季,我有一些空閒時間,我選擇創建個人圖書庫存系統。在研究中,我遇到了Jules的這篇文章:ISBN -> bookdata Lookup to fill in a databaseVBA訪問:XML,錯誤'91':對象變量或塊變量未設置?

當試圖執行我的代碼時,我在使用Set xmlhttp = CreateObject("MSXML2.xmlhttp")時首先得到了Run-time error: Access is denied。我發現一條帖子(http://social.msdn.microsoft.com/Forums/en-US/1abda1ce-e23c-4d0e-bccd-a323aa7f2ea5/access-is-denied-while-using-microsoftxmlhttp-to-get-a-url-link-in-vbscript-help),表示要將該行更改爲Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")

我現在收到Run-time error '91': Object variable or With block variable not set.

人對如何解決這個任何想法?我新來使用XML。爲了測試,我使用了立即窗口並輸入testlookup("0007102968")

模塊SearchISBN:

Option Compare Database 
Option Explicit 

Public Function testlookup(value As String) 
    Dim book 
    Set book = New isbn 
    book.Lookup (value) 
    Debug.Print book.Title 
    Debug.Print book.PublisherText 
End Function 

類模塊ISBN:

Option Compare Database 
Option Explicit 

'https://stackoverflow.com/questions/2454348/isbn-bookdata-lookup-to-fill-in-a-database 
' AccessKeys created with account on ISBNDB.com 
' Reference in (Tools->Refernces) made to "Microsoft XML" 

Dim strTitle As String 
Dim strAuthor As String 
Dim strPublisher As String 
Dim strSummary As String 
Dim strPrice As Currency 
Dim strISBN10 As Integer 
Dim strISBN13 As Integer 
Dim strNotes As String 
'Dim strPersRating As String 
Dim accessKey As String 

Private Sub Class_Initialize() 
    ' Set AccessKey value of ISBNDB API 
    accessKey = "NSOY388Z" 
End Sub 
Property Get Title() As String 
    Title = strTitle 
End Property 
Property Get Author() As String 
    Author = strAuthor 
End Property 
Property Get Publisher() As String 
    Publisher = strPublisher 
End Property 
Property Get Summary() As String 
    Summary = strSummary 
End Property 
Property Get Price() As Currency 
    Price = strPrice 
End Property 
Property Get ISBN10() As Integer 
    ISBN10 = strISBN10 
End Property 
Property Get ISBN13() As Integer 
    ISBN13 = strISBN13 
End Property 
Property Get Notes() As String 
    Notes = strNotes 
End Property 

Public Function Lookup(isbn As String) As Boolean 
    Lookup = False 
' Dim xmlhttp 
' Dim strTest As String 
' strTest = "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn 
' Debug.Print strTest 
' 'Run-time error, access is denied 
' ' Set xmlhttp = CreateObject("MSXML2.xmlhttp") 
' Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") 
' xmlhttp.Open "Get", strTest, False '"https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False 
' xmlhttp.send 
' Debug.Print xmlhttp.responseText 
' Debug.Print "Response: " & xmlhttp.responseXML.XML ' 
' Dim xmldoc 
'' Set xmldoc = CreateObject("Microsoft.XMLDOM") 
'' xmldoc.loadXML (xmlhttp.responseXML.XML) 
'' ERROR 
'' If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") = 0) Then 
''  MsgBox "Invalid ISBN or not in database" 
''  Exit Function 
'' End If 
'' If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") > 1) Then 
''  MsgBox "Caution, got more than one result!" 
''  Exit Function 
'' End If 
' 
' Set xmldoc = New DOMDocument 
' xmldoc.loadXML (xmlhttp.responseText) 
' 
' 
' 
' strTitle = xmldoc.selectSingleNode("//BookData/TitleLong").Text 
' strAuthor = xmldoc.selectSingleNode("//BookData/AuthorsText").Text 
' strPublisher = xmldoc.selectSingleNode("//BookData/PublisherText").Text 
' strNotes = xmldoc.selectSingleNode("//BookData/Notes").Text 
' strSummary = xmldoc.selectSingleNode("//BookData/Summary").Text 
' 

    Dim xmlhttp As MSXML2.xmlhttp 
    Dim xmldoc As MSXML2.DOMDocument 
    Dim XMLNodes As MSXML2.IXMLDOMNodeList 
    Dim xmlElement As MSXML2.IXMLDOMElement 
    Dim bookTitle As String 
    Dim myErr As MSXML2.IXMLDOMParseError 

    Dim strTest As String 
    strTest = "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn 

    ' Fetch the XML - THIS IS WHERE I AM NOW GETTING ERROR 
    xmlhttp.Open "Get", strTest, False '"https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False 
    xmlhttp.send 

    Set xmldoc = New DOMDocument 
    xmldoc.loadXML (xmlhttp.responseText) 

    Set XMLNodes = xmldoc.getElementsByTagName("BookData") 

    Dim i As Integer 

    ' Get the data 
    For i = 1 To XMLNodes.length 
     Set xmlElement = XMLNodes.nextNode 
     bookTitle = xmlElement.getElementsByTagName("Title").Item(0).nodeTypedValue 
    Next 

    Lookup = True 

End Function 

編輯:仍然得到錯誤,但我現在越來越在即時窗口的響應:

https://isbndb.com/api/books.xml?access_key=NSOY388Z&results=texts&index1=isbn&value1=0007102968 
Response: 
<?xml version="1.0" encoding="UTF-8"?> 

<ISBNdb server_time="2013-06-20T16:20:00Z"> 
<BookList total_results="1" page_size="10" page_number="1" shown_results="1"> 
<BookData book_id="the_times_book_of_quotations" isbn="0007102968" isbn13="9780007102969"> 
<Title>The Times book of quotations</Title> 
<TitleLong></TitleLong> 
<AuthorsText></AuthorsText> 
<PublisherText publisher_id="times_books">[Glasgow] : Times Books : 2000.</PublisherText> 
<Summary></Summary> 
<Notes>Includes index.</Notes> 
<UrlsText></UrlsText> 
<AwardsText></AwardsText> 
</BookData> 
</BookList> 
</ISBNdb> 

https請求的瀏覽器結果:

回答

1

由於XML在VBA有時對我來說是痛苦的,我只是把XML響應文本,然後將其加載到MSXML2.DOMDocument。從那裏你可以解析並獲取你需要的數據。首先,您需要確保該文件具有對Microsoft XML dll的引用(通過從Visual Basic窗口中選擇工具>引用,然後選擇「Microsoft XML 6.0」)來執行此操作。

至於代碼,它會是這個樣子:

Dim xmlhttp As MSXML2.xmlhttp 
Dim xmldoc As MSXML2.DOMDocument 
Dim XMLNodes As MSXML2.IXMLDOMNodeList 
Dim xmlElement As MSXML2.IXMLDOMElement 
Dim bookTitle as String 

' Fetch the XML 
Set xmlhttp = CreateObject("Microsoft.xmlHTTP") 
xmlhttp.Open "Get", yourURL, False 
xmlhttp.send 

' Create a new XMLDocument to which to load the XML text 
Set xmlDoc = New DOMDocument 
xmldoc.LoadXML (xmlhttp.responseText) 

' Get all of the BookData Nodes and fetch the first node 
Set XMLNodes = xmldoc.getElementsByTagName("BookData") 

' Get your data (retrieved only the Title as an example) 
for i = 1 to XMLNodes.length 
    Set myElement = XMLNodes.NextNode 
    bookTitle = myElement.getElementsByTagName("Title").Item(0).nodeTypedValue 
Next 

可以擺脫的for循環,如果你相信,你只會得到一個響應(因爲其ISBN我猜你應該......)

+0

在我的代碼中,我檢查0或> 1的結果。我試過你的,但是我在'for'循環中遇到問題。 myChildren定義在哪裏? –

+0

我的錯誤;更新了代碼以'myChildren'替換'myElement'。現在應該工作 – Jaycal

+0

這有助於一些事情,但現在在我的類模塊isbn我得到了錯誤91在以下行:'xmlhttp.Open「獲取」,strTest,False「。有任何想法嗎? –

相關問題