范围变量设置空值

问题描述 投票:0回答:1

我试图从提要中提取数据,并将每条数据循环到标记为 RawData 的工作表上的 A1:D1 中,然后移动到 A2:D2 中获取下一组数据。我重复使用了之前的 VBA 项目中的代码,并且运行良好,但这个项目则不然,所以不确定我缺少什么。

我得到的错误是

Application defined or object-defined error
,并且发生在第一个实例:
Sheets("RawData").range(rCurrentCell).value = 

每个

debug.print
xNode
输出都是正确的,因此其设置的数据是正确的。

我认为在设置

rFirstCell
rCurrentCell
的值时实际上会破坏。打印这些行会产生空值。

最初我使用

ThisWorkbook.Worksheets
来引用其他事物,但遇到了对象错误,因此改用
ws
对象。

我之前设置

rFirstCell
的代码片段是:

'Set initial values for Range Pointers
 Set rFirstCell = Worksheets("RawData").range("A1")
 Set rCurrentCell = rFirstCell

Full Code:

Sub ReadFromAcumatica()
Dim xmlReq As ServerXMLHTTP60
Dim ws As Worksheet
Dim rFirstCell As Range 'Points to the First Cell in the row currently being updated
Dim rCurrentCell As Range 'Points the the current cell in the row being updated
Dim counter As Integer 'Counts the lines

counter = 0

'Clear Existing Data

 ThisWorkbook.Worksheets("RawData").Cells.Delete

 Set ws = ThisWorkbook.Worksheets("RawData")

 'Set initial values for Range Pointers
 Set rFirstCell = ws.Range("A1")
 Set rCurrentCell = rFirstCell

'Connect to server to pull data.
Set xmlReq = New ServerXMLHTTP60
xmlReq.Open "GET", "https://somewebsite.com", False, "username", "password"
xmlReq.send

Dim xmlStr As String
Dim XPath As String

xmlStr = xmlReq.responseText

' Create document object
Set objDom = CreateObject("Msxml2.DOMDocument.3.0")     '// Using MSXML 3.0

'/* Load XML */
objDom.LoadXML xmlStr
objDom.setProperty "SelectionNamespaces", _
"xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' " & _
"xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'"

Set xNodes = objDom.getElementsByTagName("m:properties")
    
    For Each xNode In xNodes
        If xNode.ChildNodes.Length <> 1 Then
            Debug.Print xNode.SelectSingleNode("d:OrderNbr").text, xNode.SelectSingleNode("d:InventoryID").text & _
            xNode.SelectSingleNode("d:Description").text, xNode.SelectSingleNode("d:Quantity").text, xNode.SelectSingleNode("d:RequestedOn").text

           'xNode.SelectSingleNode("d:OrderNbr").text
           
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
                Sheets("RawData").Range(rCurrentCell).Value = xNode.SelectSingleNode("d:InventoryID").text
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
                Sheets("RawData").Range(rCurrentCell).Value = xNode.SelectSingleNode("d:Description").text
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
                Sheets("RawData").Range(rCurrentCell).Value = xNode.SelectSingleNode("d:Quantity").text
            Set rCurrentCell = rCurrentCell.Offset(0, 1) 'move current cell one column right
                Sheets("RawData").Range(rCurrentCell).Value = xNode.SelectSingleNode("d:RequestedOn").text
            Set rCurrentCell = rCurrentCell.Offset(1, -4) 'move current to next line
                        
        End If
    Next

End Sub
excel vba excel-2013
1个回答
0
投票

更简洁的代码。别忘了关闭这个问题。

Sub ReadFromAcumatica()
Dim xmlReq As ServerXMLHTTP60
Dim ws As Worksheet
'Dim rFirstCell As Range 'Points to the First Cell in the row currently being updated
Dim rCurrentCell As Range 'Points the the current cell in the row being updated
Dim counter As Integer 'Counts the lines

Set ws = ThisWorkbook.Worksheets("RawData")
counter = 0

'Clear Existing Data
ws.Cells.Clear

 'Set initial values for Range Pointers
 'Set rFirstCell = ws.Range("A1")
 Set rCurrentCell = ws.Range("A1")

'Connect to server to pull data.
Set xmlReq = New ServerXMLHTTP60
xmlReq.Open "GET", "https://somewebsite.com", False, "username", "password"
xmlReq.send

Dim xmlStr As String
Dim XPath As String

xmlStr = xmlReq.responseText

' Create document object
Set objDom = CreateObject("Msxml2.DOMDocument.3.0")     '// Using MSXML 3.0

'/* Load XML */
objDom.LoadXML xmlStr
objDom.SetProperty "SelectionNamespaces", _
"xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' " & _
"xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'"

Set xNodes = objDom.getElementsByTagName("m:properties")
    
    For Each xNode In xNodes
        If xNode.ChildNodes.Length <> 1 Then
            Debug.Print xNode.SelectSingleNode("d:OrderNbr").text, xNode.SelectSingleNode("d:InventoryID").text & _
            xNode.SelectSingleNode("d:Description").text, xNode.SelectSingleNode("d:Quantity").text, xNode.SelectSingleNode("d:RequestedOn").text

           'xNode.SelectSingleNode("d:OrderNbr").text
           
            rCurrentCell.Offset(0, 1) = xNode.SelectSingleNode("d:InventoryID").text
            rCurrentCell.Offset(0, 2) = xNode.SelectSingleNode("d:Description").text
            rCurrentCell.Offset(0, 3) = xNode.SelectSingleNode("d:Quantity").text
            rCurrentCell.Offset(0, 4) = xNode.SelectSingleNode("d:RequestedOn").text
            Set rCurrentCell = rCurrentCell.Offset(1, 0) 'move current to next line
        End If
    Next
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.